从纬度和经度查找邮政编码

时间:2012-07-25 01:45:21

标签: java php mysql geolocation

我知道有Web服务有这些信息,但是它们可以限制为每天请求。我有大约114,000条记录,我需要邮政编码。我有一个充满邮政编码的数据库,有lat和longs。但是我不知道如何计算给定的纬度和长度与邮政编码lat和long。

基本上我需要交叉引用给定的地址lat和long对提供的邮政编码lat和long。我可以使用PHP,Java或MySQL过程,也可以只使用计算。

2 个答案:

答案 0 :(得分:1)

在这种情况下,我可以给你一个踩踏板,但就此而言。

$distance = 10;
$latitude = 37.295092;
$longitude = -121.896490;

$sql = "SELECT loc.*, (((acos(sin(($latitude*pi()/180)) * sin((`latitude`*pi()/180))+cos(($latitude*pi()/180)) * cos((`latitude`*pi()/180)) * cos((($longitude - `longitude`)*pi()/180))))*180/pi())*60*1.1515) AS `distance` FROM table_with_lonlat_ref loc HAVING distance < $distance"

如果您创建的查询在您拥有的2个表之间进行JOIN并将距离减小到1或2,那么您可以概念性地提出所需的所有lat / lon组合。或者你也可以找到一个包含所有美国邮政编码的数据库,这个数据库也有lat / lon然后查询一个表,根据匹配的zipcodes插入到另一个表中。我在某个地方有这样的邮政编码DB。

我也可以建议http://www.maxmind.com/app/geolite它永远不会完全减少你想支付它并且它经常变化,但是。从这里你几乎可以得到几乎所有纬度/经度的组合可以用作基于访客IP的参考点(在某些情况下,它有点偏离,因为IP可以从一个城镇或2个城镇的中心蒸汽。但它的总比没有好,只给你服务器可以处理的限制,不用担心maxmind使用条款之外的API限制。

无论如何,我已经在很多网站上使用了这个组合一段时间,并且到目前为止还没有提出很多问题。我知道这不是你问题的直接答案,但我希望它能引导你找到解决方案

答案 1 :(得分:0)

由于你已经有了一个lats和longs的数据库,我将假设它描述了一组从(latA,lonA)到(latB,lonB)的矩形区域,每个区域都有一个相关的邮政编码。我还假设(或推荐)你已经将这四个字段编入索引。

您的查询可以非常轻松地匹配坐标(coordA,coordB)是否适合描述该矩形的两个范围。

update coords set zip_code=(
  select zip_code from zip_codes 
  where coords.coordA >= zip_codes.latA 
    and coords.coordA <= zip_codes.latB
    and coords.coordB >= zip_codes.lonA
    and coords.coordB <= zip_codes.lonB
    limit 1
)

Caviat:你应该验证latA&lt; latB和lonA&lt;邮政编码数据库中的lonB,并确认您在两个表中使用相同的坐标系。您可能需要通过转换或适当更改运算符进行调整。