我知道有一些网络服务有这些信息,但是它们可以限制为每天的请求。我有大约 114,000 条记录需要邮政编码。我有一个数据库,里面满是经纬度的邮政编码。但是,我不确定如何根据邮政编码 lat 和 long 计算给定的 lat 和 long。
基本上,我需要将给定的地址 lat 和 long 与提供的邮政编码 lat 和 long 进行交叉引用。我可以使用 PHP、Java 或 MySQL 过程,也可以只使用计算。
我知道有一些网络服务有这些信息,但是它们可以限制为每天的请求。我有大约 114,000 条记录需要邮政编码。我有一个数据库,里面满是经纬度的邮政编码。但是,我不确定如何根据邮政编码 lat 和 long 计算给定的 lat 和 long。
基本上,我需要将给定的地址 lat 和 long 与提供的邮政编码 lat 和 long 进行交叉引用。我可以使用 PHP、Java 或 MySQL 过程,也可以只使用计算。
我可以给你一块垫脚石,但仅此而已,在这种情况下。
$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,那么您在概念上可以想出您需要的几乎所有纬度/经度组合。或者您也可以找到一个包含所有美国邮政编码的数据库,该数据库也具有纬度/经度,然后根据匹配的邮政编码查询一个表以插入另一个表。我在某处有这样一个邮政编码数据库。
我也可以建议http://www.maxmind.com/app/geolite它永远不会完整,因为你想为它付出代价,它会经常改变,但是。从这里你可以得到几乎所有可能的纬度/经度组合,可以用作基于访问者 IP 的参考点(在某些情况下,它有点偏离,因为 IP 可能从一个城镇或 2 个城镇之外的中心流出。但它的总比没有好,只给你服务器可以处理的限制,并且不用担心 maxmind 使用条款之外的 API 限制。
无论如何,总而言之,我已经在许多网站上使用这种组合一段时间了,迄今为止还没有遇到很多问题。好吧,我知道这不是您问题的直接答案,但我希望它能引导您找到解决方案
由于您已经有一个经纬度数据库,我假设它描述了一组从 (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 < latB 和 lonA < lonB,并验证您在两个表中使用相同的坐标系。您可能需要通过转换或适当地更改运算符来进行调整。