カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

GoogleMap 表示範囲内のみマーカー表示

この記事は最終更新日から1年以上経過しています。

GoogleMap上にたくさんのマーカーを描画したい場合、マーカーが多過ぎて処理が重くなるのを防ぎたいので、
予め地図の表示範囲内のみ、マーカーを描画するようにしてみたいと思います。

まずはイベントを受け取り、処理できるようデリゲート[GMSMapViewDelegate]を追加します。

1class SampleViewController: UIViewController, GMSMapViewDelegate {

GoogleMapオブジェクトにデリゲートを設定します。

マーカーを追加する際、後から表示/非表示を変更したいので、配列のマーカーオブジェクトを宣言しておきます。

マーカーを追加したときに先ほどの配列に追加します。

1let marker: ...
2markers.append(marker)


ユーザーの操作、地図のアニメーションがアイドル状態になった時に動作するメソッドを追加します。

1func mapView(_ mapView: GMSMapView, idleAt position: GMSCameraPosition) {
2 
3    // 配列をループして取り出し
4    for(marker) in markers {
5 
6        // 地図の表示領域内に含まれるか
7        if(googleMap.projection.contains(marker.position)) {
8            // 含まれる場合
9            marker.map = googleMap
10        } else {
11            // 含まれない場合
12            marker.map = nil
13        }
14 
15    }
16 
17}

まとめ

1import UIKit
2import GoogleMaps
3 
4class SampleViewController: UIViewController, GMSMapViewDelegate {
5 
6    var googleMap : GMSMapView!
7     
8    let latitude: CLLocationDegrees = 34.687322
9    let longitude: CLLocationDegrees = 135.526195
10 
11    // マーカー配列
12    var markers : [GMSMarker] = []
13 
14    override func viewDidLoad() {
15        super.viewDidLoad()
16        // Do any additional setup after loading the view.
17 
18        // ズームレベル
19        let zoom: Float = 10
20 
21        // カメラを生成
22        let camera: GMSCameraPosition = GMSCameraPosition.camera(withLatitude: latitude, longitude: longitude, zoom: zoom)
23 
24        // MapViewを生成
25        googleMap = GMSMapView(frame: CGRect(x: 0, y: 0, width: self.view.bounds.width, height: self.view.bounds.height))
26        googleMap.delegate = self
27 
28        // MapViewにカメラを追加
29        googleMap.camera = camera
30 
31        // マーカーの生成
32        let marker: GMSMarker = GMSMarker()
33        marker.position = CLLocationCoordinate2DMake(latitude, longitude)
34        marker.map = googleMap
35 
36        // マーカーを配列に追加
37        markers.append(marker)
38 
39        // viewにMapViewを追加
40        self.view.addSubview(googleMap)
41    }
42 
43    func mapView(_ mapView: GMSMapView, idleAt position: GMSCameraPosition) {
44 
45        // 配列をループして取り出し
46        for(marker) in markers {
47 
48            // 地図の表示領域内に含まれるか
49            if(googleMap.projection.contains(marker.position)) {
50                // 含まれる場合
51                marker.map = googleMap
52            } else {
53                // 含まれない場合
54                marker.map = nil
55            }
56 
57        }
58 
59    }
60 
61    .
62    .
63    .

Xcode: 8.3.1
Swift: 3.1
OS: Sierra 10.12

この記事がお役に立ちましたらシェアお願いします
4,304 views

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です