如何使用MapKit从坐标获取地址?
当我在地图上长按它获取坐标时,我有这个代码:
func didLongPressMap(sender: UILongPressGestureRecognizer) {
if sender.state == UIGestureRecognizerState.Began {
let touchPoint = sender.locationInView(self.mapView)
let touchCoordinate = self.mapView.convertPoint(touchPoint, toCoordinateFromView: self.mapView)
var annotation = MKPointAnnotation()
annotation.coordinate = touchCoordinate
annotation.title = "Your position"
self.mapView.addAnnotation(annotation) //drops the pin
println("lat: \(touchCoordinate.latitude)")
var num = (touchCoordinate.latitude as NSNumber).floatValue
var formatter = NSNumberFormatter()
formatter.maximumFractionDigits = 4
formatter.minimumFractionDigits = 4
var str = formatter.stringFromNumber(num)
println("long: \(touchCoordinate.longitude)")
var num1 = (touchCoordinate.longitude as NSNumber).floatValue
var formatter1 = NSNumberFormatter()
formatter1.maximumFractionDigits = 4
formatter1.minimumFractionDigits = 4
var str1 = formatter1.stringFromNumber(num1) …Run Code Online (Sandbox Code Playgroud) 我的iphone应用程序应该根据用户的经度和经度来解析地址.reverseGeocodeLocation工作正常,但结果是英文的.
有没有办法将结果本地化为其他语言?
无法在苹果或其他任何地方找到有关它的任何信息.
我使用的代码是:
CLGeocoder *geocoder = [[[CLGeocoder alloc] init] autorelease];
CLLocation *location = [[[CLLocation alloc]
initWithLatitude:coord.latitude longitude:coord.longitude] autorelease];
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
NSLog(@"reverseGeocodeLocation:completionHandler: Completion Handler called!");
if (error){
NSLog(@"Geocode failed with error: %@", error);
[self displayError:error];
return;
}
if(placemarks && placemarks.count > 0)
{
//do something
CLPlacemark *topResult = [placemarks objectAtIndex:0];
NSString *addressTxt = [NSString stringWithFormat:@"%@ %@,%@ %@",
[topResult subThoroughfare],[topResult thoroughfare],
[topResult locality], [topResult administrativeArea]];
}
}
Run Code Online (Sandbox Code Playgroud) 我的应用程序中有一个搜索栏,用户可以输入一个地址,它会产生地理编码结果.根据以下代码,结果将根据用户类型进行更新:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
...
if (self.geocoder.geocoding) [self.geocoder cancelGeocode];
[self.geocoder geocodeAddressString:searchText completionHandler:^(NSArray *placemarks, NSError *error) {
if (error != nil) {
NSLog(@"ERROR during geocode: %@", error.description);
return;
}
//update the view
}];
}
Run Code Online (Sandbox Code Playgroud)
这适用于用户输入搜索字段的前几个字符.但是,在用户重复输入更多字符后,地理编码器开始出现以下错误(我知道这意味着网络存在问题):
ERROR during geocode: Error Domain=kCLErrorDomain Code=2 "The operation couldn’t be completed. (kCLErrorDomain error 2.)"
Run Code Online (Sandbox Code Playgroud)
在重新加载整个ViewController之前,地理编码器不会再次运行.为什么会发生这种情况,我该怎么做才能解决它?
我想知道是否可以从CLPlacemark获得州缩写?
在Apple的CLPlacemark参考中,它指出:
administrativeArea与地标关联的州或省.(只读)@property(非原子,只读)NSString*administrativeArea讨论例如,如果地标位置是Apple的总部,则此属性的值将是字符串"CA"或"California".
但每当我使用它时,我只获得完整状态(即加利福尼亚州)而不是缩写(即CA).有人能帮我一下吗?
在我的一个应用程序中,我需要添加一个按名称查找城市的功能.我正在使用它CLGeocoder来实现这一点,我希望它具有与iOS天气应用程序相同的行为.
以下是我的代码:
CLGeocoder().geocodeAddressString(searchBar.text!, completionHandler:{ (placemarks, error) -> Void in
guard let nonNilMarks = placemarks else {return}
for placemark in nonNilMarks {
print("locality: \(placemark.locality)")
print("name: \(placemark.name)")
print("country: \(placemark.country)")
print("formatted address: \(placemark.addressDictionary)")
}
})
Run Code Online (Sandbox Code Playgroud)
它在大多数情况下都能很好地工作.但是,我最近注意到一些失败的情况.以下是一些示例的输出:
locality: Optional("Milan")
name: Optional("Milan")
country: Optional("Italy")
formatted address: Optional([SubAdministrativeArea: Milan, State: Lombardy, CountryCode: IT, Country: Italy, Name: Milan, FormattedAddressLines: (
Milan,
Italy
), City: Milan])
Run Code Online (Sandbox Code Playgroud)
这是正确的输出
德克萨斯州有一个叫意大利的小镇.如果我键入'Italy,TX',则输出为:
locality: Optional("Italy")
name: Optional("Italy")
country: Optional("United States")
formatted address: Optional([SubAdministrativeArea: Ellis, State: …Run Code Online (Sandbox Code Playgroud) 试图从AddressDictionary获取格式化地址,这是我从CLGeocoder获得的.使用以下代码,没有结果:
subtitle = [NSString stringWithString:[[addressDict objectForKey:@"FormattedAddressLines"]objectAtIndex:0]];
Run Code Online (Sandbox Code Playgroud)
还尝试过:
subtitle = [[[ABAddressBook sharedAddressBook] formattedAddressFromDictionary:placemark.addressDictionary] string];
Run Code Online (Sandbox Code Playgroud)
但是这段代码似乎只适用于Mac OS X.
编译器询问ABAdressBook,但我导入了两个头文件.
#import <AddressBook/ABAddressBook.h>
#import <AddressBook/AddressBook.h>
Run Code Online (Sandbox Code Playgroud) 我收到addressString后调用此函数:
[[self geocoder] geocodeAddressString:addressString completionHandler:^(NSArray *placemarks, NSError *error) {
if (error) {
block(nil, nil, error);
} else {
CLPlacemark *placemark = [placemarks onlyObject];
block(placemark, self.name, error);
}
}];
Run Code Online (Sandbox Code Playgroud)
它返回地标为nil,错误为:Error Domain = kCLErrorDomain Code = 8"操作无法完成.(kCLErrorDomain error 8.)"
我的地址字符串是从这个字典中为placeDictionary [@"formatted_address"]检索的:
placeDictionary =
{
"address_components" = (
{
"long_name" = "Palolem Beach";
"short_name" = "Palolem Beach";
types = (
"natural_feature",
establishment
);
},
{
"long_name" = "South Goa";
"short_name" = "South Goa";
types = (
"administrative_area_level_2",
political
);
},
{
"long_name" = …Run Code Online (Sandbox Code Playgroud) 我一直在互联网上试图找到如何从这个城市和国家CLGeocoder.我可以轻松获得经度和纬度,但我需要城市和国家的信息,而且我一直在使用已弃用的方法等等,任何想法?它基本上需要获取位置,然后有一个NSString国家和一个NSString城市,所以我可以使用它们查找更多信息或将它们放在标签上等.
我想在我的iPad应用程序中提供用户输入字段,用户可以在其中键入城市或位置的名称,应用程序应显示用户可以选择的可能城市/位置列表,我可以获得地理坐标从(在a上添加标记MKMapView).
我试过了CLGeocoder,但似乎它只给我一个结果,加上结果不准确.例如,将"Stutt"作为地址字符串产生"Straubing,德国"作为结果,wheareas"Stuttgart"将提出"斯图加特"(正确)作为结果(因此我预计"斯图特"至少有2个结果).此外,在美国有一个叫斯图加特的城市,结果也没有给出.(我使用了本页最底部的示例代码:https://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/LocationAwarenessPG/UsingGeocoders/UsingGeocoders.html)
任何人都可以根据用户文本输入指导我找到适合城市名称/位置查找的解决方案吗?
的文档
- (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler;
Run Code Online (Sandbox Code Playgroud)
文件明确指出:
在前向地理编码请求的情况下,如果提供的信息产生多个可能的位置,则可以返回多个地标对象.
声明它返回一个地标数组.然而,即使我搜索我确定知道的物品有多个条目(好莱坞,华盛顿,丹麦,主要街道等)我总是只有一个条目.
有些人只是耸耸肩说使用谷歌API,但我担心请求限制.
是否有一些设置或黑客来解决这个问题,还是CLGeocoder简单地破坏了?
clgeocoder ×10
ios ×9
iphone ×4
objective-c ×3
geolocation ×2
mapkit ×2
swift ×2
addressbook ×1
cllocation ×1
clplacemark ×1
geocoding ×1
ios6 ×1
ipad ×1
nsstring ×1
swift2 ×1
xcode ×1