我正在尝试实现一个像搜索栏一样的苹果地图,让用户能够找到一个特定的位置或地址,并在搜索到的位置保存一个别针。现在,我了解了如何获取自然语言中的地址,以及如何从地址中获取坐标。但我不知道如何有效地解析字符串并知道发出哪个请求。我在网上找不到任何东西,只有关于电子邮件地址的文章。任何强调标准/良好实现的信息都将不胜感激!
发布于 2015-11-18 05:34:15
您可以使用CLGeocoder检查字符串是否为位置。你可以这样格式化你的代码:
var geocoder = CLGeocoder()
geocoder.geocodeAddressString(address) { (placemarks, error) -> Void in
if let placemark = placemarks![0] as? CLPlacemark {
print("place")
} else {
print("string")
}
}但是,如果在大型阵列上使用,这可能是密集型的。但作为搜索栏应该没问题!
发布于 2015-11-18 08:35:08
多亏了Maclean和Location Manager by Varshyl Mobile。注意:这是我能够想出的解决我的问题的答案;在弹出正确的自然语言位置方面仍然存在问题。
let geocoder = CLGeocoder()
geocoder.geocodeAddressString(address as String, completionHandler: {(placemarks: [CLPlacemark]?, error: NSError?) -> Void in
if (error != nil) {
print("error")
}
else{
if let placemark = placemarks?.first {
let address = AddressParser()
address.parseAppleLocationData(placemark)
let addressDict = address.getAddressDictionary()
print("searched address")
print(addressDict)
}
else {
print("invalid address")
}
}
})下面是我在上面提到的库中使用的类/函数。
private class AddressParser: NSObject{
private var latitude = NSString()
private var longitude = NSString()
private var streetNumber = NSString()
private var route = NSString()
private var locality = NSString()
private var subLocality = NSString()
private var formattedAddress = NSString()
private var administrativeArea = NSString()
private var administrativeAreaCode = NSString()
private var subAdministrativeArea = NSString()
private var postalCode = NSString()
private var country = NSString()
private var subThoroughfare = NSString()
private var thoroughfare = NSString()
private var ISOcountryCode = NSString()
private var state = NSString()
override init(){
super.init()
}
private func getAddressDictionary()-> NSDictionary{
let addressDict = NSMutableDictionary()
addressDict.setValue(latitude, forKey: "latitude")
addressDict.setValue(longitude, forKey: "longitude")
addressDict.setValue(streetNumber, forKey: "streetNumber")
addressDict.setValue(locality, forKey: "locality")
addressDict.setValue(subLocality, forKey: "subLocality")
addressDict.setValue(administrativeArea, forKey: "administrativeArea")
addressDict.setValue(postalCode, forKey: "postalCode")
addressDict.setValue(country, forKey: "country")
addressDict.setValue(formattedAddress, forKey: "formattedAddress")
return addressDict
}
private func parseAppleLocationData(placemark:CLPlacemark){
let addressLines = placemark.addressDictionary!["FormattedAddressLines"] as! NSArray
//self.streetNumber = placemark.subThoroughfare ? placemark.subThoroughfare : ""
self.streetNumber = (placemark.thoroughfare != nil ? placemark.thoroughfare : "")!
self.locality = (placemark.locality != nil ? placemark.locality : "")!
self.postalCode = (placemark.postalCode != nil ? placemark.postalCode : "")!
self.subLocality = (placemark.subLocality != nil ? placemark.subLocality : "")!
self.administrativeArea = (placemark.administrativeArea != nil ? placemark.administrativeArea : "")!
self.country = (placemark.country != nil ? placemark.country : "")!
self.longitude = placemark.location!.coordinate.longitude.description;
self.latitude = placemark.location!.coordinate.latitude.description
if(addressLines.count>0){
self.formattedAddress = addressLines.componentsJoinedByString(", ")}
else{
self.formattedAddress = ""
}
} https://stackoverflow.com/questions/33767115
复制相似问题