是否有可能获得针对给定地理坐标集的最近有意义的地标(例如街道交叉点)的人性化文本描述,例如通过Google地图或其他第三方等网络服务?我正在使用MapKit,,但我怀疑它内置了什么。 Turns out it does.
例如,我正在寻找像最近的街道交叉路口(实际上这是理想的)或任何类型的“地名”。比如:
E Hastings St and Main St
128 W Cordova St
PNE Fairgrounds
答案 0 :(得分:1)
检查谷歌地图api,我认为这样的事情应该有效:
var geocoder = new google.maps.Geocoder(),
lat = "12.1234",
long = "98.7654",
latlng = new google.maps.LatLng(sLat, sLong);
geocoder.geocode({"latLng":latlng},function(data,status) {
if(status == google.maps.GeocoderStatus.OK) {
var add = data[1].formatted_address; //this is the full address
alert(add);
}
});
您可以获得“E Hastings St和Main St”以及场地的全名,您只需要为该功能添加更多内容。看看google maps api。
答案 1 :(得分:1)
所以我做了一个项目,遇到了我遇到的这个问题...你可以参考苹果开发者网页上的CLPlacemark class reference。
以下是我使用它的方式,我认为你还必须像我一样在项目中添加重置库。
#import <CoreLocation/CoreLocation.h>
现在在.h file:
添加CLLocation委托:<CLLocationManagerDelegate>
然后添加以下实例变量:
CLLocationManager *locationManager;
CLLocation *currentLocation;
现在在.m file:
-(void) viewDidLoad{
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move, location is updated
locationManager.desiredAccuracy = kCLLocationAccuracyBest; // get best current locaton coords
locationManager.headingFilter = 1;
[locationManager startUpdatingLocation];
[locationManager startUpdatingHeading];
}
现在在CLLocationManager
方法之后,或之前,在您执行的任何方式中实施viewDidLoad
委托方法:
#pragma mark CLLocationManager Delegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
currentLocation = [locations objectAtIndex:0];
[locationManager stopUpdatingLocation];
NSLog(@"Detected Location : %f, %f", currentLocation.coordinate.latitude, currentLocation.coordinate.longitude);
CLGeocoder *geocoder = [[CLGeocoder alloc] init] ;
[geocoder reverseGeocodeLocation:currentLocation
completionHandler:^(NSArray *placemarks, NSError *error) {
if (error){
NSLog(@"Geocode failed with error: %@", error);
return;
}
CLPlacemark *placemark = [placemarks objectAtIndex:0];
NSLog(@"City = %@ : State = %@ : Country = %@ : Zip Code = %@", placemark.locality, placemark.administrativeArea, placemark.ISOcountryCode, placemark.postalCode);
}];
}
运行代码并确保如果您使用iOS模拟器,请确保通过单击控制台输出屏幕上方的箭头按钮来模拟位置。
只有在您构建并运行项目后才会显示。
希望这有助于你:)
继承我得到的输出:
2013-08-02 20:39:46.935 PowerOneApp[3449:c07] Detected Location : 37.785834, -122.406417
2013-08-02 20:39:49.773 PowerOneApp[3449:c07] City = San Francisco : State = California : Country = US : Zip Code = 94115
修改强> 对不起,我意识到当我写这个答案时你想要更多精确的坐标。
下面:
#pragma mark CLLocationManager Delegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
currentLocation = [locations objectAtIndex:0];
[locationManager stopUpdatingLocation];
NSLog(@"Detected Location : %f, %f", currentLocation.coordinate.latitude, currentLocation.coordinate.longitude);
CLGeocoder *geocoder = [[CLGeocoder alloc] init] ;
[geocoder reverseGeocodeLocation:currentLocation
completionHandler:^(NSArray *placemarks, NSError *error) {
if (error){
NSLog(@"Geocode failed with error: %@", error);
return;
}
CLPlacemark *placemark = [placemarks objectAtIndex:0];
NSLog(@"%@", placemark.addressDictionary);
NSLog(@"%@", [placemark.addressDictionary valueForKey:@"Street"]);
}];
}
继承人的输出:
2013-08-02 20:44:26.052 PowerOneApp[3531:c07] Detected Location : 37.785834, -122.406417
2013-08-02 20:44:26.340 PowerOneApp[3531:c07] {
City = "San Francisco";
Country = "United States";
CountryCode = US;
FormattedAddressLines = (
"Apple Store, San Francisco",
"1800 Ellis St",
"San Francisco, CA 94115-4004",
"United States"
);
Name = "Apple Store, San Francisco";
PostCodeExtension = 4004;
State = California;
Street = "1800 Ellis St";
SubAdministrativeArea = "San Francisco";
SubLocality = "Union Square";
SubThoroughfare = 1800;
Thoroughfare = "Ellis St";
ZIP = 94115;
}
2013-08-02 20:44:26.340 PowerOneApp[3531:c07] 1800 Ellis St
如您所见,有一个名为addressDictionary
的属性可返回CLPlacemark类所拥有的所有属性。所以在这里,如果你熟悉NSDictionary
个对象,我先输出整个字典,然后指定我想记录的值。
希望这有助于您提出确切的问题:)