使用谷歌纵横和&amp ;;的位置名称的Web服务经度

时间:2010-05-13 12:07:19

标签: iphone geolocation reverse-geocoding

我有一个iPhone应用程序,我需要找到当前位置(根据城市名称或可能的地址)。但我无法做到这一点。我可以找出当前的纬度和经度。如果我提供纬度和经度,是否有任何网络服务(最好是免费)可以返回当前位置名称?

4 个答案:

答案 0 :(得分:3)

您正在寻找的功能称为Reverse Geocoding

Here是提供此功能的Web服务列表。

对于多个坐标的批量处理,最受欢迎的是Geonames.orgGoogle Maps Services APIBatchgeo.com

答案 1 :(得分:1)

假设您的目标是iPhone OS 3.0或更高版本,您可以使用MKReverseGeocoder,它是MapKit Framework的一部分。 Developer文档包含一个示例项目。 MKReverserGeocoder Class Reference

答案 2 :(得分:0)

MKReverseGeocoder是一个很棒的类,但有时可能会返回错误: 错误域= PBRequesterErrorDomain代码= 6001“操作无法完成。(PBRequesterErrorDomain错误6001。)

上面的luvieere建议是一个很好的起点,这就是我使用Google HTTP反向地理编码器做的一个例子。这是我编写的GoogleReverseGeocoder类的实现。有关如何使用它的完整说明可以在HERE找到。

// Send Google A Request
NSString *urlString = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%lf,%lf&output=csv&sensor=false",self.locationToGeocode.coordinate.latitude,self.locationToGeocode.coordinate.longitude];
NSURL *urlFromString = [NSURL URLWithString:urlString];
NSStringEncoding encodingType = NSUTF8StringEncoding;
NSString *reverseGeoString = [NSString stringWithContentsOfURL:urlFromString encoding:encodingType error:nil];

// Parse Out Response
NSArray *listItems = [reverseGeoString componentsSeparatedByString:@","];
NSArray *tempAddressArray = [[listItems objectAtIndex:2] componentsSeparatedByString:@"\""];
NSArray *tempCountryArray = [[listItems objectAtIndex:[listItems count]-1] componentsSeparatedByString:@"\""];

// Did Google Find Address? 200 is yes
if ([[listItems objectAtIndex:0] intValue] == 200)
{
    // Set Class Member Variables
    [self setGoogleReturnDidFindAddress:YES];
    [self setGoogleReturnAddress:[tempAddressArray objectAtIndex:[tempAddressArray count]-1]];
    [self setGoogleReturnCountry:[tempCountryArray objectAtIndex:0]];
    [self setGoogleReturnCode:[[listItems objectAtIndex:0] intValue]];
    [self setGoogleReturnAccuracy:[[listItems objectAtIndex:1] intValue]];

} else if ([[listItems objectAtIndex:0] intValue] > 600)
{
    [self setGoogleReturnDidFindAddress:NO];
}

答案 3 :(得分:0)

想自己做吗?

您必须为这些服务中的大多数付费,但有上千个限制。也许您可以拥有自己的州和城市列表,以及它们已知的纬度和经度。

不要试图自己建立列表。例如,这个项目是巴西的州和城市数据库:

https://github.com/kelvins/Municipios-Brasileiros

5.570 个城市的列表只有 430KBytes!考虑到您必须存储的数据量以及从中获得的好处,这是完全值得的。

因此,最好的方法是从您所在的国家/地区找到一个类似的项目并实现它。

现在我有了自己的城市列表,我可以为用户提供 5 个最近的城市或做任何我想做的事情。通过对我的应用程序 MySQL 数据库的这个简单查询!看看多么简单而强大

set @lat=-20.0080509185791;
set @lng=-44.003021240234375;

-- The main SQL query that returns the closest 5 airports.
SELECT id, nome, lat, lng, 111.045 * DEGREES(ACOS(COS(RADIANS(@lat))
 * COS(RADIANS(lat))
 * COS(RADIANS(lng) - RADIANS(@lng))
 + SIN(RADIANS(@lat))
 * SIN(RADIANS(lat))))
 AS distance_in_km
FROM cities
ORDER BY distance_in_km ASC
LIMIT 0,5;