2015-12-22 5 views
5

iOS9でXcode 7を使用しています。ユーザーの現在の場所からリストの他のすべての場所までの距離に基づいて、昇順の並べ替えを行いたいと思います。逆ジオロケーションを使用してリストを距離別に並べ替えます。

私は座標による距離を計算するのではなく、距離が選択された方法(ドライブ/歩行)に依存するため、アドレスで計算します。私がしたいのは、後でそのオブジェクトまでの距離を計算するために、各ロケーションオブジェクトにアドレスを保存することだけです。

私は、各オブジェクトの初期化子でこの要求をやっているオブジェクトとリストを初期化する場合:

let location = CLLocation(latitude: latitude, longitude: longitude) //changed!!! 

CLGeocoder().reverseGeocodeLocation(location, completionHandler: {(placemarks, error) -> Void in 
    //the code to obtain an address and save it in a location object is here and works 
} 

私が今持っている問題は、私のリストは、172個のオブジェクトが含まれて、私は172の、そのようなreverseGeocodeLocation要求を送信しなければならないということですユーザーの場所から各オブジェクトの場所までの距離を計算する必要があります。

非常に多くのリクエストを送信すると、このエラーが発生します。 操作を完了できませんでした。 (kCLErrorDomain error 2)

これを解決する方法はありますか? 状況がわからない場合は教えてください。

+0

私は、これは本当にreverseGeocodeLocationの使用目的ではないと思います! APIの制限を満たすためにあなたの要求を出し間隔せずに、私は。良い解決策があるだろう疑うあなたが別のAPIの制限と異なる地理位置情報サービスを使用してに見ているか、それはあなたが時間 – LulzCow

+0

ソートaで複数の場所を送信することができますリストの上昇は、あなたがそれらの近くの場所を一覧表示しようとしている意味?? –

+0

@anishparajuliはい正確 – newbiedevelopper

答えて

1

最終的に私はここでいくつかのコメントの助けを借りて答えを見つけました。

現在のところ、Apple Maps APIを使用して取得できる唯一の距離は、座標間の直線距離です。しかし、あなたが2つのアドレスまたは座標の間に実際の距離を計算したい場合はwith the Google Maps Distance Matrix API簡単なリクエストを送信することによってそれを行うことができます。

例:51.226531,4.190688
51.114476,4.139618および51.148123,4.182590:

からの距離を計算します。

あなたは、単にこのAPI呼び出しでこれを行うことができ


JSON::私は結果が
を返すことがしたいフォーマット私は3つのパラメータを使用してい https://maps.googleapis.com/maps/api/distancematrix/json?origins=51.226531,4.190688&destinations=51.114476,4.139618|51.148123,4.182590

お知らせ起点:開始する座標/アドレス
宛先:複数の座標/アドレスを区切って "| 「

これは、コールからの結果である:

{ 
    "destination_addresses" : [ 
    "Dorpstraat 70, 9140 Temse, België", 
    "Eigenlostraat 38, 9100 Sint-Niklaas, België" 
], 
"origin_addresses" : [ "Provinciale Baan 37, 9120 Beveren, België" ], 
"rows" : [ 
    { 
    "elements" : [ 
     { 
      "distance" : { 
       "text" : "16,3 km", 
       "value" : 16346 
      }, 
      "duration" : { 
       "text" : "22 min.", 
       "value" : 1321 
      }, 
      "status" : "OK" 
     }, 
     { 
      "distance" : { 
       "text" : "10,5 km", 
       "value" : 10521 
      }, 
      "duration" : { 
       "text" : "17 min.", 
       "value" : 1003 
      }, 
      "status" : "OK" 
     } 
    ] 
    } 
], 
"status" : "OK" 
} 

物事が明確でない場合は、私に尋ねる

+0

とにかくこの "172のreverseGeocodeLocationリクエストには172個のオブジェクトが含まれています"という違いはありません。エラーは表示されませんが、クライアントサイドではたくさん呼び出しますAPI? 「|」ああ、おかげでそれを見ていきます –

+0
+0

...あなたはリンクを投げることができる私も最初に考えたものだが、あなたはうまくAPIを読めば、あなたが持つパラメータで座標を分離することで、1回のコールで複数の距離を取得することができます –

3

Appleのジオコーディングオブジェクトはバルクジオコーディング用ではありません。詳細については、XcodeのCLGeocoderクラスリファレンスを参照してください。簡単な抜粋:

Applications should be conscious of how they use geocoding. Geocoding requests are rate-limited for each app, so making too many requests in a short period of time may cause some of the requests to fail. (When the maximum rate is exceeded, the geocoder returns an error object with the value kCLErrorNetwork to the associated completion handler.) Here are some rules of thumb for using this class effectively:

Send at most one geocoding request for any one user action.

If the user performs multiple actions that involve geocoding the same location, reuse the results from the initial geocoding request instead of starting individual requests for each action.

When you want to update the user’s current location automatically (such as when the user is moving), issue new geocoding requests only when the user has moved a significant distance and after a reasonable amount of time has passed. For example, in a typical situation, you should not send more than one geocoding request per minute.

(。私が追加強調)

概要は、あなたがAppleのCLGeocoderクラスでやろうとしているものを行うことができないということです。

ユーザーアクションに対して1回のジオコーディング要求を送信し、通常は1分あたり1回のジオコーディング要求のみを送信することになっています。

バルクジオコーディングまたは逆ジオコーディングを実行するには、サードパーティ製のジオコーディングサービスのライセンスを取得する必要があります(おそらくそれを支払う必要があります)。

+0

おかげで、私は私の問題を検索する他のキーワードを使用し、逆ジオコーディング http://stackoverflow.com/questions/3513134ためのいくつかのAPIを言及し、この質問を見つけました/ how-to-reverse-geocode-without-google – newbiedevelopper

関連する問題