使用反向地理定位按距离对列表进行排序
Sort a list by distance using reversed Geolocation
我正在使用 Xcode 7 和 iOS9。我想根据从用户当前位置到列表中所有其他位置的距离对列表进行升序排序。
我不想通过坐标计算到某个位置的距离,而是通过地址,因为距离取决于选择的方法(驾车/步行)。我想要做的就是将地址保存在每个位置对象中,以便稍后计算到该对象的距离。
当用对象初始化列表时,我在每个对象的初始化程序中执行此请求:
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 个这样的 reverseGeocodeLocation 请求,因为我的列表包含 172 个对象,我需要计算从我的用户位置到每个对象位置的距离。
如此快速地发送如此多的请求会导致此错误:
操作无法完成。 (kCLErrorDomain 错误 2。)
有办法解决吗?
如果不清楚,请告诉我,以便我澄清
Apple 的地理编码对象不适用于批量地理编码。有关详细信息,请参阅 Xcode 中的 CLGeocoder
Class 参考。简短摘录:
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
class 做您想做的事。
您应该只为用户操作提交一个地理编码请求,并且通常每分钟不超过一个地理编码请求。
您需要许可第三方地理编码服务(并可能为此付费)才能进行批量地理编码或反向地理编码。
在此处的一些评论的帮助下,我终于自己找到了答案。
目前,使用 Apple Maps API 可以检索的唯一距离是坐标之间的直线距离。但是,如果你想计算两个地址或坐标之间的实际距离,你可以通过发送一个简单的请求来with the Google Maps Distance Matrix API。
示例:
计算距离:51.226531,4.190688
到 51.114476,4.139618 和 51.148123,4.182590。
您只需使用 API 调用即可:
https://maps.googleapis.com/maps/api/distancematrix/json?origins=51.226531,4.190688&destinations=51.114476,4.139618|51.148123,4.182590
注意我使用了 3 个参数:
json: 我希望结果返回的格式
起源:coordinates/address 你开始的地方
目的地:多个coordinates/address用“|”分隔
这是调用的结果:
{
"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"
}
有什么不明白的可以问我!
我正在使用 Xcode 7 和 iOS9。我想根据从用户当前位置到列表中所有其他位置的距离对列表进行升序排序。
我不想通过坐标计算到某个位置的距离,而是通过地址,因为距离取决于选择的方法(驾车/步行)。我想要做的就是将地址保存在每个位置对象中,以便稍后计算到该对象的距离。
当用对象初始化列表时,我在每个对象的初始化程序中执行此请求:
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 个这样的 reverseGeocodeLocation 请求,因为我的列表包含 172 个对象,我需要计算从我的用户位置到每个对象位置的距离。
如此快速地发送如此多的请求会导致此错误: 操作无法完成。 (kCLErrorDomain 错误 2。)
有办法解决吗? 如果不清楚,请告诉我,以便我澄清
Apple 的地理编码对象不适用于批量地理编码。有关详细信息,请参阅 Xcode 中的 CLGeocoder
Class 参考。简短摘录:
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
class 做您想做的事。
您应该只为用户操作提交一个地理编码请求,并且通常每分钟不超过一个地理编码请求。
您需要许可第三方地理编码服务(并可能为此付费)才能进行批量地理编码或反向地理编码。
在此处的一些评论的帮助下,我终于自己找到了答案。
目前,使用 Apple Maps API 可以检索的唯一距离是坐标之间的直线距离。但是,如果你想计算两个地址或坐标之间的实际距离,你可以通过发送一个简单的请求来with the Google Maps Distance Matrix API。
示例:
计算距离:51.226531,4.190688
到 51.114476,4.139618 和 51.148123,4.182590。
您只需使用 API 调用即可:
https://maps.googleapis.com/maps/api/distancematrix/json?origins=51.226531,4.190688&destinations=51.114476,4.139618|51.148123,4.182590
注意我使用了 3 个参数:
json: 我希望结果返回的格式
起源:coordinates/address 你开始的地方
目的地:多个coordinates/address用“|”分隔
这是调用的结果:
{
"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"
}
有什么不明白的可以问我!