2017-05-23 11 views
0

アイデア:ループとはスウィフト点に最も近い店を見つける3

アプリケーションはドライバーが顧客に最も近いショップ/レストランを見ることができます。私が持っているもの

:私の地元エリア内のすべてのお店 を見つけるため

let clientLat = "24.449384" let clientLng = "56.343243"

  • ファンクション文字列として保存

    • 座標

      私は私の地元エリア内のお店のすべての座標を保存しようと、私は成功しました:

      var coordinates: [CLLocationCoordinate2D] = [CLLocationCoordinate2D]() 
      
      func performSearch() { 
          coordinates.removeAll() 
      
          let request = MKLocalSearchRequest() 
          request.naturalLanguageQuery = "starbucks" 
          request.region = mapView.region 
      
          let search = MKLocalSearch(request: request) 
      
          search.start(completionHandler: {(response, error) in 
      
           if error != nil { 
            print("Error occured in search: \(error!.localizedDescription)") 
           } else if response!.mapItems.count == 0 { 
            print("No matches found") 
           } else { 
            print("Matches found") 
      
            for item in response!.mapItems { 
      
             self.coordinates.append(item.placemark.coordinate) 
      
      
             // need to sort coordinates 
      
             // need to find the closest 
      
      
             let annotation = MKPointAnnotation() 
             annotation.coordinate = item.placemark.coordinate 
             annotation.title = item.name 
             self.mapView.addAnnotation(annotation) 
            } 
           } 
          }) 
      

      }

      を私は必要なもの:

      私は座標をループしたいです緯度と経度の短い文字列に最も近いショップ(キロメートル)を見つけて、それにピンを付けます。

      UPDATE

      func performSearch() { 
          coordinates.removeAll() 
      
          let request = MKLocalSearchRequest() 
          request.naturalLanguageQuery = "starbucks" 
          request.region = mapView.region 
      
          let search = MKLocalSearch(request: request) 
      
          search.start(completionHandler: {(response, error) in 
      
           if error != nil { 
            print("Error occured in search: \(error!.localizedDescription)") 
           } else if response!.mapItems.count == 0 { 
            print("No matches found") 
           } else { 
            print("Matches found") 
      
            for item in response!.mapItems { 
      
             self.coordinates.append(item.placemark.coordinate) 
      
             let pointToCompare = CLLocation(latitude: 24.741721, longitude: 46.891440) 
             let storedCorrdinates = self.coordinates.map({CLLocation(latitude: $0.latitude, longitude: $0.longitude)}).sorted(by: { 
              $0.distance(from: pointToCompare) < $1.distance(from: pointToCompare) 
      
      
             }) 
             self.coordinate = storedCorrdinates 
            } 
      
            let annotation = MKPointAnnotation() 
            annotation.coordinate = self.coordinate[0].coordinate 
            self.mapView.addAnnotation(annotation) 
           } 
          }) 
      

      } あなたはあなたがCLLocationタイプに変換してからdistance(from:)法を用いて、座標間の距離を比較することができ

+0

「座標」はCLLocationCoordinate2DまたはCLLocationの配列ですか? – brimstone

+0

距離計算式を使用できますか? [この質問]を参照してください(https://stackoverflow.com/questions/27928/calculate-distance-between-two-latitude-longitude-points-haversine-formula)2つの緯度/経度の間の距離式のJavaScript実装の場合。 (Haversineの式) –

+0

@ブリムストンはい 'var座標:[CLLocationCoordinate2D] = [CLLocationCoordinate2D]()' – leo0019

答えて

2

を@brimstoneありがとうございました。たとえば、座標配列を取り出してCLLocationにマップし、それを比較しているポイントからの距離に基づいて並べ替えます。

let coordinates = [CLLocationCoordinate2D]() 
let pointToCompare = CLLocation(latitude: <#yourLat#>, longitude: <#yourLong#>) 

let sortedCoordinates = coordinates.map({CLLocation(latitude: $0.latitude, longitude: $0.longitude)}).sorted(by: { 
    $0.distance(from: pointToCompare) < $1.distance(from: pointToCompare) 
}) 

次に、アノテーションの座標を最も近い座標に設定するには、sortedCoordinates配列を添字にします。

annotation.coordinate = sortedCoordinates[0].coordinate 
+0

ありがとうございました。最初のソートされた座標はどこですか?私は 'annotation.coordinate = item.placemark.coordinate'でそれをどのように選ぶことができますか? – leo0019

+0

@ leo0019最も近い座標を取得するための編集を参照してください – brimstone

+0

もう一つのスターバックスのために私に最も近いものともう一つのピンを表示するようになりました!なぜ私は2つのピンがありますか? – leo0019

関連する問題