2017-07-07 75 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