2017-07-07 2 views
0

J'essaie d'ajouter plusieurs marqueurs sur Googlemaps dans mon application.Impossible d'ajouter plusieurs marqueurs dans GSMapView xCode Swift 3

Dans le viewcontrolller sous viewDidLoad, je peux charger la carte et un seul marqueur.

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() 
} 

Il appelle MapData() et à partir de là est un fichier JSON est généré après l'analyse syntaxique setPin est appelée à définir les marqueurs

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 


     } 

    } 
} 

Les broches ne sont pas représentés.

L'impression à pour objet self.mapItems montre

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 

cela signifie que toutes les données approprié est disponible. Cependant la carte est là la seule broche faite dans viewDidLoad Les Marqueurs dans la fonction setPin ne sont pas montrés ou peut-être pas définis.

Est-ce que quelqu'un a une idée?

+0

Pouvez-vous me dire self.mapView Où est-il déclaré? –

+0

Pouvez-vous vérifier si self.mapView est correctement initialisé. Je vous ai vu initialisé localement ce ci-dessous: - nous Mapview = GMSMapView.map (withFrame: .zero, appareil photo: appareil photo) Et vous devez avoir un objet affichage de la carte en dehors de la fonction viewDidLoad en haut. Cet objet de carte particulier doit être initialisé et configuré correctement. –

+0

@Manish Pathak.J'ai ceci juste après le mapViewController: UIViewController {(at) IBOutlet faible var mapView: GMSMapView! – Charley57

Répondre

0

Je l'ai résolu en ont changé le MapData (Mapview: GMSMapView) aussi 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

Clustering vos marqueurs, vous pouvez mettre un grand nombre de marqueurs sur une carte sans rendre la carte difficile à lire. L'utilitaire de clustering de marqueurs vous aide à gérer plusieurs marqueurs à différents niveaux de zoom. Pour l'exemple de code complet, voir ObjCDemoApp et SwiftDemoApp sur GitHub.

Pour ajouter un simple clusterer de marqueurs.

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

Le code suivant crée un gestionnaire de cluster en utilisant la GMUNonHierarchicalDistanceBasedAlgorithm et la MUDefaultClusterRenderer qui sont inclus dans la bibliothèque utilitaire:

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() 
    } 
} 

Nourrissez vos marqueurs dans le cluster comme des objets GMUClusterItem en appelant clusterManager: addItem: . Le code suivant génère aléatoirement des éléments de cluster (POI) dans le cadre de la caméra de la carte, puis les nourrit au gestionnaire de cluster:

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

événements poignée sur les marqueurs et les clusters

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

Pour plus de détails s'il vous plaît suivez le Here