この記事は最終更新日から1年以上経過しています。
GoogleMap上にたくさんのマーカーを描画したい場合、マーカーが多過ぎて処理が重くなるのを防ぎたいので、
予め地図の表示範囲内のみ、マーカーを描画するようにしてみたいと思います。
まずはイベントを受け取り、処理できるようデリゲート[GMSMapViewDelegate]を追加します。
1 | class SampleViewController: UIViewController, GMSMapViewDelegate { |
GoogleMapオブジェクトにデリゲートを設定します。
1 | googleMap.delegate = self |
マーカーを追加する際、後から表示/非表示を変更したいので、配列のマーカーオブジェクトを宣言しておきます。
1 | var markers : [GMSMarker] = [] |
マーカーを追加したときに先ほどの配列に追加します。
ユーザーの操作、地図のアニメーションがアイドル状態になった時に動作するメソッドを追加します。
1 | func mapView(_ mapView: GMSMapView, idleAt position: GMSCameraPosition) { |
4 | for(marker) in markers { |
7 | if(googleMap.projection.contains(marker.position)) { |
まとめ
4 | class SampleViewController: UIViewController, GMSMapViewDelegate { |
6 | var googleMap : GMSMapView! |
8 | let latitude: CLLocationDegrees = 34.687322 |
9 | let longitude: CLLocationDegrees = 135.526195 |
12 | var markers : [GMSMarker] = [] |
14 | override func viewDidLoad() { |
16 | // Do any additional setup after loading the view. |
22 | let camera: GMSCameraPosition = GMSCameraPosition.camera(withLatitude: latitude, longitude: longitude, zoom: zoom) |
25 | googleMap = GMSMapView(frame: CGRect(x: 0, y: 0, width: self.view.bounds.width, height: self.view.bounds.height)) |
26 | googleMap.delegate = self |
29 | googleMap.camera = camera |
32 | let marker: GMSMarker = GMSMarker() |
33 | marker.position = CLLocationCoordinate2DMake(latitude, longitude) |
34 | marker.map = googleMap |
37 | markers.append(marker) |
40 | self.view.addSubview(googleMap) |
43 | func mapView(_ mapView: GMSMapView, idleAt position: GMSCameraPosition) { |
46 | for(marker) in markers { |
49 | if(googleMap.projection.contains(marker.position)) { |
51 | marker.map = googleMap |
Xcode: 8.3.1
Swift: 3.1
OS: Sierra 10.12