Swift ReverseGeocode CLPlacemark areasOfInterest 几乎总是零。我应该使用其他东西吗?
Swift ReverseGeocode CLPlacemark areasOfInterest almost always nil. Should I be using something else?
我正在使用 CLGeocoder 和 reverseGeocodeLocation 来获取我的 CLPlacemark。为什么名称大多以地址形式返回,而 areasOfInterest 以 nil 形式返回?例如...... areasOfInterest 出现在苹果总部和机场等真正重要的事情上,但诸如沃尔玛、Publix 等等之类的商店都是零。我应该寻找另一种方式吗?我是否期望获得比此方法更多的信息?我的意思是,Apple 在他们的地图上有这些兴趣点,我应该尝试通过其他方式获取这些信息吗?
以下是我在我所在地区尝试过的一些位置经纬度,它们没有带回商店名称。这些来自 google,当放入苹果地图时,它就在正确的位置之上,但它也没有关联......这让我觉得我应该做一些与恢复名字不同的事情商店的。其他信息(如描述或类别)也很好。
注意:我只是想要信息,而不是试图将其放在地图或其他任何东西上。
沃尔玛:北纬 35.0944°,西经 85.3319°
水族馆:北纬 35.0558°,西经 85.3111°
Publix:北纬 35.0651°,西经 85.3083°
我的一小部分代码。所有作品只是想让您了解我带回了什么以及如何带回。
CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error)->Void in
if placemarks != nil
{
if error == nil && placemarks!.count >= 1 {
let thePlacemarks = placemarks![0] as CLPlacemark
print(placemarks)
print(thePlacemarks.areasOfInterest?.description)
print(thePlacemarks.administrativeArea?.description)
print(thePlacemarks.areasOfInterest?.description)
print(thePlacemarks.country?.description)
print(thePlacemarks.inlandWater?.description)
print(thePlacemarks.isoCountryCode?.description)
print(thePlacemarks.locality?.description)
print(thePlacemarks.location?.description)
print(thePlacemarks.name?.description)
print(thePlacemarks.ocean?.description)
print(thePlacemarks.subAdministrativeArea?.description)
print()
}
}
})
任何帮助都会很棒!
谢谢!
所以...不一定很理想,但通过使用 mapkit,我能够执行 MKLocalSearch 来获得我想要的东西。这只有效,因为我的代码中有一个我感兴趣的特定位置的数组。请参阅下面的代码。
Import Mapkit
let listArr = ["Walmart", "Publix","Game Stop"]
然后在你的某个地方 ViewController
func searchArr() //This function will iterate through the array and see if any of the locations are within 30 meters
{
for element in listsArr
{
let request = MKLocalSearchRequest()
request.naturalLanguageQuery = "\(element)"
request.region = MKCoordinateRegionMakeWithDistance(currentCoordinates, 3200, 3200)
MKLocalSearch(request: request).start { (response, error) in
guard error == nil else {print()return}
guard let response = response else {return}
guard response.mapItems.count > 0 else {return}
print(response.mapItems[0])
let coord1 = currentCoordinates
let coord2 = response.mapItems[0].placemark.coordinate
let distance = self.calculateDistance(fromlat: currentCoordinates.latitude, fromlon: currentCoordinates.longitude, tolat: response.mapItems[0].placemark.coordinate.latitude, tolon: response.mapItems[0].placemark.coordinate.longitude)
if distance > 30
{
print("the distance between the two points is: \(distance) meters")
}
}
}
这是我找到的一个小函数,可以获取两个坐标之间的距离。
func calculateDistance(fromlat : Double, fromlon : Double, tolat : Double, tolon : Double) -> Double {
let DEG_TO_RAD = 0.017453292519943295769236907684886
let EARTH_RADIUS_IN_METERS = 6372797.560856
let latitudeArc : Double = (fromlat - tolat) * DEG_TO_RAD
let longitudeArc : Double = (fromlon - tolon) * DEG_TO_RAD
var latitudeH : Double = sin(latitudeArc * 0.5)
latitudeH *= latitudeH
var lontitudeH : Double = sin(longitudeArc * 0.5)
lontitudeH *= lontitudeH
let tmp : Double = cos(fromlat*DEG_TO_RAD) * cos(tolat*DEG_TO_RAD)
return EARTH_RADIUS_IN_METERS * 2.0 * asin(sqrt(latitudeH + tmp*lontitudeH))
}
我正在使用 CLGeocoder 和 reverseGeocodeLocation 来获取我的 CLPlacemark。为什么名称大多以地址形式返回,而 areasOfInterest 以 nil 形式返回?例如...... areasOfInterest 出现在苹果总部和机场等真正重要的事情上,但诸如沃尔玛、Publix 等等之类的商店都是零。我应该寻找另一种方式吗?我是否期望获得比此方法更多的信息?我的意思是,Apple 在他们的地图上有这些兴趣点,我应该尝试通过其他方式获取这些信息吗?
以下是我在我所在地区尝试过的一些位置经纬度,它们没有带回商店名称。这些来自 google,当放入苹果地图时,它就在正确的位置之上,但它也没有关联......这让我觉得我应该做一些与恢复名字不同的事情商店的。其他信息(如描述或类别)也很好。
注意:我只是想要信息,而不是试图将其放在地图或其他任何东西上。
沃尔玛:北纬 35.0944°,西经 85.3319°
水族馆:北纬 35.0558°,西经 85.3111°
Publix:北纬 35.0651°,西经 85.3083°
我的一小部分代码。所有作品只是想让您了解我带回了什么以及如何带回。
CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error)->Void in
if placemarks != nil
{
if error == nil && placemarks!.count >= 1 {
let thePlacemarks = placemarks![0] as CLPlacemark
print(placemarks)
print(thePlacemarks.areasOfInterest?.description)
print(thePlacemarks.administrativeArea?.description)
print(thePlacemarks.areasOfInterest?.description)
print(thePlacemarks.country?.description)
print(thePlacemarks.inlandWater?.description)
print(thePlacemarks.isoCountryCode?.description)
print(thePlacemarks.locality?.description)
print(thePlacemarks.location?.description)
print(thePlacemarks.name?.description)
print(thePlacemarks.ocean?.description)
print(thePlacemarks.subAdministrativeArea?.description)
print()
}
}
})
任何帮助都会很棒!
谢谢!
所以...不一定很理想,但通过使用 mapkit,我能够执行 MKLocalSearch 来获得我想要的东西。这只有效,因为我的代码中有一个我感兴趣的特定位置的数组。请参阅下面的代码。
Import Mapkit
let listArr = ["Walmart", "Publix","Game Stop"]
然后在你的某个地方 ViewController
func searchArr() //This function will iterate through the array and see if any of the locations are within 30 meters
{
for element in listsArr
{
let request = MKLocalSearchRequest()
request.naturalLanguageQuery = "\(element)"
request.region = MKCoordinateRegionMakeWithDistance(currentCoordinates, 3200, 3200)
MKLocalSearch(request: request).start { (response, error) in
guard error == nil else {print()return}
guard let response = response else {return}
guard response.mapItems.count > 0 else {return}
print(response.mapItems[0])
let coord1 = currentCoordinates
let coord2 = response.mapItems[0].placemark.coordinate
let distance = self.calculateDistance(fromlat: currentCoordinates.latitude, fromlon: currentCoordinates.longitude, tolat: response.mapItems[0].placemark.coordinate.latitude, tolon: response.mapItems[0].placemark.coordinate.longitude)
if distance > 30
{
print("the distance between the two points is: \(distance) meters")
}
}
}
这是我找到的一个小函数,可以获取两个坐标之间的距离。
func calculateDistance(fromlat : Double, fromlon : Double, tolat : Double, tolon : Double) -> Double {
let DEG_TO_RAD = 0.017453292519943295769236907684886
let EARTH_RADIUS_IN_METERS = 6372797.560856
let latitudeArc : Double = (fromlat - tolat) * DEG_TO_RAD
let longitudeArc : Double = (fromlon - tolon) * DEG_TO_RAD
var latitudeH : Double = sin(latitudeArc * 0.5)
latitudeH *= latitudeH
var lontitudeH : Double = sin(longitudeArc * 0.5)
lontitudeH *= lontitudeH
let tmp : Double = cos(fromlat*DEG_TO_RAD) * cos(tolat*DEG_TO_RAD)
return EARTH_RADIUS_IN_METERS * 2.0 * asin(sqrt(latitudeH + tmp*lontitudeH))
}