【问题标题】:Not able to add Multiple Markers in GSMapView xCode Swift 3无法在 GSMapView xCode Swift 3 中添加多个标记
【发布时间】:2017-12-11 19:58:57
【问题描述】:

我正在尝试在我的应用中的 Googlemaps 上添加多个标记。

在 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() 并从那里生成 json 文件 解析后调用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


       }

    }
}

引脚未显示。

for item in 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 中的标记未显示或未设置。

有人有想法吗?

【问题讨论】:

  • 能告诉我self.mapView是在哪里声明的吗?
  • 能否请您检查一下 self.mapView 是否已正确初始化。我看到你已经在下面进行了本地初始化:- let mapView = GMSMapView.map(withFrame: .zero, camera: camera) 你必须在顶部有一个 viewDidLoad 函数之外的地图视图对象。该特定地图对象需要正确初始化和配置。
  • @Manish Pathak。我在 mapViewController: UIViewController { (at)IBOutlet weak var mapView: GMSMapView!
  • mapView = GMSMapView.map(withFrame: .zero, camera: camera) remove let in view 为这个初始化加载了
  • 您不必在视图中再次创建 mapview 对象,加载方法只是从它们中删除 let

标签: swift xcode google-maps google-maps-markers gmsmapview


【解决方案1】:

我已经解决了它已经改变了 setPin(mapView: GMSMapView!) 的 mapData(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


       }

    }
}

【讨论】:

    【解决方案2】:

    对标记进行聚类,您可以在地图上放置大量标记,而不会使地图难以阅读。标记聚类实用程序可帮助您管理不同缩放级别的多个标记。

    有关完整代码示例,请参阅 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:addItem: 将标记作为 GMUClusterItem 对象输入集群。以下代码在地图相机范围内随机生成集群项目(POI),然后将它们提供给集群管理器:

    /// 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

    【讨论】:

      猜你喜欢
      • 2017-11-19
      • 1970-01-01
      • 2012-12-23
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      相关资源
      最近更新 更多