2017-07-07 48 views
0

我想在我的應用中的Googlemaps上添加多個標記。無法在GSMapView中添加多個標記xcode Swift 3

在viewController下viewDidLoad我能夠加載地圖和一個標記。

override func viewDidLoad() { 
    super.viewDidLoad() 
    title = NSLocalizedString("section_map", comment: "test") 
    let camera = GMSCameraPosition.camera(withLatitude: 48.7784, longitude:9.18121, zoom: 12) 
    let mapView = GMSMapView.map(withFrame: .zero, camera: camera) 


    view = mapView 
    mapView.settings.myLocationButton = true 

    mapView.delegate = self 

    let marker = GMSMarker() 
    marker.position = CLLocationCoordinate2D(latitude: 48.7784,longitude: 9.18121) 
    marker.title = "title" 
    marker.snippet = "snipple" 
    marker.icon = UIImage(named:"pin_you") 
    marker.map = mapView 

    mapData() 
} 

它調用屬於MapData(),並從那裏是被解析setPin被調用來設置的銷,未示出的標記

func setPin(){ 


    DispatchQueue.main.async { 

     for item in self.mapItems { 
      print (" \(item.name) \(item.marker) \(item.latitude) \(item.longitude)") 

      let marker = GMSMarker() 
      marker.position = CLLocationCoordinate2D(latitude: item.latitude,longitude: item.longitude) 
      marker.title = item.name 
      marker.snippet = item.fulladdress 

      var iconImage: String 
      switch (item.marker){ 
      case 1: 
       iconImage = "pin_silver" 
      case 2: 
       iconImage = "pin_blue" 
      case 3: 
       iconImage = "pin_gold" 
      case 6: 
       iconImage = "pin_you" 
      default: 
       iconImage = "pin_silver" 
      } 
      marker.icon = UIImage(named:iconImage) 
      marker.map = self.mapView 


     } 

    } 
} 

後生成 JSON文件。

在self.mapItems項打印顯示

Position number A 1 48.76947562 9.15440351 
Position number B 1 48.75716485 9.17081058 
Position number C 1 48.81191625 9.22752149 
Position number D 2 48.81192516 9.22766708 

這意味着所有適當的數據是可用的。 但是,映射在viewDidLoad中有一個引腳 函數setPin中的標記未顯示或未設置。

是否有人有想法?

+0

你能告訴我 self.mapView 它在哪裏宣佈? –

+0

你可以請交叉檢查self.mapView是否正確初始化。 我看到你在本地下面這樣初始化: - 讓MapView的= GMSMapView.map(withFrame:.zero,攝像頭:攝像頭) 並且必須有viewDidLoad中的功能外,在頂部的地圖視圖對象。 該特定的地圖對象需要進行初始化和正確配置。 –

+0

@Manish Pathak.I在mapViewController後面有這個:UIViewController {(at)IBOutlet weak var mapView:GMSMapView! – Charley57

回答

0

我已經改變了屬於MapData解決它(MapView類:GMSMapView中)也爲setPin(MapView類:GMSMapView中)

func setpin(mapView: GMSMapView!){ 


    DispatchQueue.main.async { 

     for item in self.mapItems { 
      print (" \(item.name) \(item.marker) \(item.latitude) \(item.longitude)") 

      let marker = GMSMarker() 
      marker.position = CLLocationCoordinate2D(latitude: item.latitude,longitude: item.longitude) 
      marker.title = item.name 
      marker.snippet = item.fulladdress 

      var iconImage: String 
      switch (item.marker){ 
      case 1: 
       iconImage = "pin_silver" 
      case 2: 
       iconImage = "pin_blue" 
      case 3: 
       iconImage = "pin_gold" 
      case 6: 
       iconImage = "pin_you" 
      default: 
       iconImage = "pin_silver" 
      } 
      marker.icon = UIImage(named:iconImage) 
      marker.map = mapView 


     } 

    } 
} 
0

集羣的標記,你可以把大量的標記上一張地圖不會讓地圖難以閱讀。標記羣集實用程序可幫助您管理不同縮放級別的多個標記。

有關完整的代碼示例,請參見GitHub上的ObjCDemoApp和SwiftDemoApp。

添加一個簡單的標記聚類器。

/// Point of Interest Item which implements the GMUClusterItem protocol. 
class POIItem: NSObject, GMUClusterItem { 
    var position: CLLocationCoordinate2D 
    var name: String! 

    init(position: CLLocationCoordinate2D, name: String) { 
    self.position = position 
    self.name = name 
    } 
} 

下面的代碼創建使用包含在實用程序庫的GMUNonHierarchicalDistanceBasedAlgorithm和MUDefaultClusterRenderer集羣管理:

class ViewController: UIViewController, GMUClusterManagerDelegate, 
GMSMapViewDelegate { 

    private var mapView: GMSMapView! 
    private var clusterManager: GMUClusterManager! 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    // Set up the cluster manager with the supplied icon generator and 
    // renderer. 
    let iconGenerator = GMUDefaultClusterIconGenerator() 
    let algorithm = GMUNonHierarchicalDistanceBasedAlgorithm() 
    let renderer = GMUDefaultClusterRenderer(mapView: mapView, 
          clusterIconGenerator: iconGenerator) 
    clusterManager = GMUClusterManager(map: mapView, algorithm: algorithm, 
                renderer: renderer) 

    // Generate and add random items to the cluster manager. 
    generateClusterItems() 

    // Call cluster() after items have been added to perform the clustering 
    // and rendering on map. 
    clusterManager.cluster() 
    } 
} 

致電clusterManager餵你的標記插入該集羣GMUClusterItem對象:的addItem: 。下面的代碼隨機生成地圖的鏡頭範圍內集羣項目(興趣點),然後將它們送至集羣管理器:

/// Randomly generates cluster items within some extent of the camera and 
/// adds them to the cluster manager. 
private func generateClusterItems() { 
    let extent = 0.2 
    for index in 1...kClusterItemCount { 
    let lat = kCameraLatitude + extent * randomScale() 
    let lng = kCameraLongitude + extent * randomScale() 
    let name = "Item \(index)" 
    let item = 
    POIItem(position: CLLocationCoordinate2DMake(lat, lng), name: name) 
    clusterManager.addItem(item) 
    } 
} 

/// Returns a random value between -1.0 and 1.0. 
private func randomScale() -> Double { 
    return Double(arc4random())/Double(UINT32_MAX) * 2.0 - 1.0 
} 

上的標記處理事件和集羣

class ViewController: UIViewController, GMUClusterManagerDelegate, GMSMapViewDelegate { 

    private var mapView: GMSMapView! 
    private var clusterManager: GMUClusterManager! 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    // ... Rest of code omitted for easy reading. 

    // Register self to listen to both GMUClusterManagerDelegate and 
    // GMSMapViewDelegate events. 
    clusterManager.setDelegate(self, mapDelegate: self) 
    } 

    // MARK: - GMUClusterManagerDelegate 

    func clusterManager(clusterManager: GMUClusterManager, didTapCluster cluster: GMUCluster) { 
    let newCamera = GMSCameraPosition.cameraWithTarget(cluster.position, 
    zoom: mapView.camera.zoom + 1) 
    let update = GMSCameraUpdate.setCamera(newCamera) 
    mapView.moveCamera(update) 
    } 

    // MARK: - GMUMapViewDelegate 

    func mapView(mapView: GMSMapView, didTapMarker marker: GMSMarker) -> Bool { 
    if let poiItem = marker.userData as? POIItem { 
     NSLog("Did tap marker for cluster item \(poiItem.name)") 
    } else { 
     NSLog("Did tap a normal marker") 
    } 
    return false 
    } 
} 

更多詳細信息請請按照Here