2009-05-28 199 views
15

假设我有一个接受邮编作为参数的web服务API,但我只能访问GPS坐标(经度,纬度)。我如何动态查找坐标所属的邮编?如何从GPS坐标查找邮编?

我正在iPhone上做这项工作,所以希望有一个简单的方法可以在CoreLocation API中完成,我在文档中忽略了这一点。

+0

我怀疑你会发现它在CoreLocation,但它是值得一试...这将是有趣的,看看它是否 – hhafez 2009-05-28 01:51:46

回答

6

我想尝试检查3.0 SDK中反向地理编码器的文档,如果我是你的话。我不能说有什么,但是你可能会发现,反向地理编码返回placeMark,然后如果你在SDK中查找placeMark,你可能会发现它有一个postcode属性。谁知道?

0

这种查找称为“反向地理定位”。

你需要做的第一件事就是从CLocation对象度转换为纬度/经度数据...

中的LocationManager功能

(一旦你获得一个位置更新被称为)....

代码:

[lat stringWithFormat:@"%+.6f", myLocation.coordinate.latitude]; 
[lng stringWithFormat:@"%+.6f", myLocation.coordinate.longitude]; 

从那里您发送纬度和经度字符串到后端web服务,如“GeoNames.org”或谷歌地图API ......,你可以得到最近的城市或街道地址。

0

有一个数据库由美国人口普查 - 老虎数据库。我相信有一个可能性来查找邮政编码拉特/长。

我会打赌,如果你搜索Tiger zipcode你可能会发现一些东西。例如,请参见here。看起来CPAN上有一个Perl模块可以实现这一点,所以它不应该是不可能的。

15

此页面提供美国所有邮政编码的数据库(包含csv)及其经纬度。 ​​3210

该文件是500k解压。以下是头几行数据:

"35004", "AL", " 33.606379", " -86.50249", "Moody", "Alabama" 
"35005", "AL", " 33.592585", " -86.95969", "Adamsville", "Alabama" 
"35006", "AL", " 33.451714", " -87.23957", "Adger", "Alabama" 

将此数据转储到本地数据库中。使用Haversine公式来比较你的坐标和数据库中的坐标以找到最近的点。 CoreLocation有一个你也可以使用的getDistanceFrom函数。

- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location 

此页面在c中具有Haversine功能和有关zips数据库的信息。

http://www.jaimerios.com/?p=39

编辑:从谷歌有关计算距离继承人很好的解释。它使用MySQL和PHP,但用于查找最近点的SQL在这里也很有用。使用SQL查询可能会更快,而不是getDistanceFrom函数。

http://code.google.com/support/bin/answer.py?answer=87134&topic=11364

寻找最近的20个地点是25英里到37半径内,-122坐标:

SELECT id, (3959 * acos(cos(radians(37)) 
* cos(radians(lat)) * cos(radians(lng) - radians(-122)) 
+ sin(radians(37)) * sin(radians(lat)))) 
AS distance FROM markers HAVING distance < 25 
ORDER BY distance LIMIT 0 , 20; 

要按公里而非英里搜寻,换成6371 3959。

+0

这只会给你的最接近中心的距离一个邮政编码区域,它不会告诉你坐标实际在哪个邮政编码,因为OP要求。 – user4815162342 2012-04-24 04:24:22

+0

我降低了这一点,因为每个月都会添加和删除邮政编码。如果您认真对待邮政编码查询的准确性,您应该购买邮政编码数据的订阅,并每隔几个月为您的数据集重新整理一下。您的质量检查过程应特别包括注意哪些邮编已被*删除*,因为您可能需要更新相关数据以引用正在替换被删除邮件的邮编。 – 2012-11-19 21:00:37