2017-05-03 17 views
0

私は、GoogleプレイスAPIを使用して近くのユーザーの所在地のすべてのレストランを検索するアプリケーションを作成していました。だから私は正常にレストラン座標(緯度、lng)を取得することができますし、私は各場所にマーカーやサークルを追加したいが、私はそれを行うことができません。ある場所にマーカーやサークルを追加することはできますが、複数の場所に追加しようとするとマーカーやサークルは表示されません。 は、ここで私は、アレイは、すべての場所が含まれていると確信している私は GMSMapView Swiftに複数のマーカーを配置

func setUpMarkersForLibraries(locations: [CLLocationCoordinate2D]){ 
    print("Setting up Markers") 
    var i = 0 
    for l in locations{ 
     let circleCenter = l 
     let circ = GMSCircle(position: circleCenter, radius: 30) 

     circ.fillColor = UIColor(red: 0, green: 0.89, blue: 0, alpha: 0.8) 
     circ.strokeColor = .black 
     circ.strokeWidth = 5 
     circ.title = "\(i)" 
     //print("\(i)") 
     i += 1 
     circ.map = mapView 

    } 
} 

を書いたコードであると私は、ループ内でインクリメントiの値を印刷し、それはすべての値を出力します。しかし、サークルは地図上に表示されません。どうやってやるの。この問題で私を助けてください。

ここに私が書いたすべてのコードがあります。

輸入のUIKit インポートGoogleマップ

クラスMapsViewController:のUIViewController、CLLocationManagerDelegate {

var mapSet = false 
var allLibraries = [CLLocationCoordinate2D]() 
var loaded = false 
var mapView: GMSMapView? 
var locationManager: CLLocationManager = CLLocationManager() 
var camera = GMSCameraPosition.camera(withLatitude: 0, longitude: 0, zoom: 12) 

override func viewDidLoad() { 
    super.viewDidLoad() 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest 
    locationManager.delegate = self 
    locationManager.requestWhenInUseAuthorization() 
    locationManager.startUpdatingLocation() 
    mapView = GMSMapView(frame: CGRect.zero) 
    view = mapView 
    loadNearByLibraries() 
    //mapView?.animate(to: camera) 
    //mapView.showsUserLocation = true 
    //setUpMap() 
    // Do any additional setup after loading the view. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


private func setUpMap(location: CLLocation){ 

    camera = GMSCameraPosition.camera(withLatitude: location.coordinate.latitude, longitude: location.coordinate.longitude, zoom: 15) 
    let updateCamera = GMSCameraUpdate.setCamera(camera) 
    self.mapView?.animate(with: updateCamera) 
    let marker = GMSMarker() 
    marker.position = camera.target 
    marker.title = "My Place" 
    marker.map = self.mapView 

} 


func loadNearByLibraries(){ 
    let urlString = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.8670522,151.1957362&radius=500&type=restaurant&keyword=cruise&key=AIzaSyBIDJ50ak-caS3M-6nSVbxdN_SmssAlTRI" 
    let theUrl = URL(string: urlString) 
    if let url = theUrl{ 
     print("Search Called") 
     var urlRequest = URLRequest(url: url) 
     urlRequest.httpMethod = "GET" 
     print("URL : " + url.absoluteString) 
     let task = URLSession.shared.dataTask(with: urlRequest, completionHandler: { 
      (data, response, error) in 

      if response != nil{ 
       if let res = response as? HTTPURLResponse{ 
        if(res.statusCode == 408) 
        { 
         MessageBox.Show(message: "Error : Request TimeOut", title: "Error", view: self) 
        } 

       } 
      } 

      if error != nil{ 
       print("Error \(error?.localizedDescription)") 
       MessageBox.Show(message: (error?.localizedDescription)!, title: "An error occurred", view: self) 

      } 
      else{ 
       print("Printing Json") 
       self.processJson(data: data!) 

      } 
     }) 
     task.resume() 
    } 
} 

func processJson(data: Data){ 
    allLibraries.removeAll() 
    do{ 

     let jsonData = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject 

     let locations = jsonData 
     let results = jsonData["results"] as! NSArray 
     for i in results{ 
      let item = i as! NSDictionary 
      let geom = item["geometry"] as! NSDictionary 
      let loc = geom["location"] as! NSDictionary 

      let lat = loc["lat"] as! NSNumber 
      let lng = loc["lng"] as! NSNumber 
      if let l: NSNumber = lat, let ln: NSNumber = lng{ 
       var latitude = CLLocationDegrees(l.floatValue) 
       var longitude = CLLocationDegrees(ln.floatValue) 
       var cord = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) 
       allLibraries.append(cord) 
      } 
      //print(loc) 

     } 


    }catch let error as Error{ 
     print("Error : \(error.localizedDescription)") 
    } 
    loaded = true 
    //setUpMarkersForLibraries(locations: allLibraries) 
    print("All Libraries : \(allLibraries.count)") 
} 


func setUpMarkersForLibraries(locations: [CLLocationCoordinate2D]){ 
    print("Setting up Markers") 
    var i = 0 
    for l in locations{ 
     let circleCenter = l 
     let circ = GMSCircle(position: circleCenter, radius: 30) 

     circ.fillColor = UIColor(red: 0, green: 0.89, blue: 0, alpha: 0.8) 
     circ.strokeColor = .black 
     circ.strokeWidth = 5 
     circ.title = "\(i)" 
     //print("\(i)") 
     i += 1 
     circ.map = mapView 

    } 
} 


func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    let lastLocation: CLLocation = locations[locations.count - 1] 
    if(mapSet == false) 
    { 
     setUpMap(location: lastLocation) 
     mapSet = true 
    } 
    if (loaded == true) 
    { 
     setUpMarkersForLibraries(locations: allLibraries) 
     loaded = false 
    } 
    //print("Location Updated") 
} 


/* 
// MARK: - Navigation 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    // Get the new view controller using segue.destinationViewController. 
    // Pass the selected object to the new view controller. 
} 
*/ 

}

私は、問題の原因を知っているか、どのように私はこの問題を削除する必要があります。ありがとう。

答えて

2

ステップ1: 緯度と経度の2つの変数を作成するモデル「レストラン」を作成します。

ステップ2:あなたがウェブにサービスのヒットを打ったとき 、次のようにモデルクラスの緯度と経度を追加します。 この

var datasource : [Restaurants] = Array() 

ステップ3のようなモデルの配列を作成します。 NSArrayでの私たちの応答の例を挙げてください。

let restaurantslist = result as NSArray 
for restaurantsListIteration in restaurantslist { 
self.datasource.append(Restaurants(value: restaurantsListIteration)) 
} 

ステップ4: モデルにマッピングした後。 mapViewに複数のマーカーを配置するコードを追加します。

for (index,restaurantsPin) in self.datasource.enumerated() { 
      let latDouble = Double(restaurantsPin.latitude!) 
      let longDouble = Double(restaurantsPin.longitude!) 
      let marker = GMSMarker() 
      marker.map = self.viewMap 
      marker.iconView = UIImageView(image: #imageLiteral(resourceName: "pin")) 
      marker.iconView?.tag = index 
      marker.position = CLLocationCoordinate2DMake(latDouble!,longDouble!) 
      self.view.addSubview(self.viewMap) 
      self.viewMap.delegate = self 
    } 

MapViewのコンセントを作成してください。

関連する問題