【问题标题】:Find ZIP Code from Latitude and Longitude从纬度和经度查找邮政编码
【发布时间】:2012-07-25 01:45:21
【问题描述】:

我知道有一些 Web 服务提供此信息,但它们可能仅限于每天的请求。我有大约 114,000 条记录需要邮政编码。我有一个数据库,里面满是经纬度的邮政编码。但是,我不确定如何根据邮政编码 lat 和 long 计算给定的 lat 和 long。

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

【问题讨论】:

  • “基本上我需要..” ..问一个问题。更好的是,让它成为一个具体的问题。
  • 检查一下...hashbangcode.com/comment/2732 - 您可以使用 Google,但他们的服务条款规定您必须显示地图!
  • 我一直将geonames.org 视为服务。如前所述,他们的 API 调用存在限制,将我限制为每小时 2000 次调用。我有 114,000 条记录需要邮政编码。是否可以从给定的 ZIP lat 和 long 计算出来?
  • 大多数邮政服务都出售此类数据的许可证。如果您在地理定位、地址和邮政编码方面做了大量工作,那么购买许可证是有意义的。如果这些数据用于非商业项目,一些国家/地区会免费提供这些数据。
  • 使用谷歌地理编码接口,如果需要的话,让脚本限制它的调用。谁在乎是否需要几天时间才能获得所需的所有数据?

标签: java php mysql geolocation


【解决方案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,那么您在概念上可以想出您需要的几乎所有纬度/经度组合。或者您也可以找到一个包含所有美国邮政编码的数据库,该数据库也具有纬度/经度,然后根据匹配的邮政编码查询一个表以插入另一个表。我在某处有这样一个邮政编码数据库。

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

总而言之,我已经在许多网站上使用这种组合有一段时间了,迄今为止还没有遇到很多问题。好吧,我知道这不是对您问题的直接回答,但我希望它能引导您找到解决方案

【讨论】:

  • 我已经有一个数据库,其中包含邮政编码 lat 和 longs。我希望交叉引用这个。我将尝试 SQL 代码,看看会发生什么。如果一切都失败了,我会尝试 API 服务。我只是希望更快一些。但我确信在我弄清楚如何引用我可以通过 API 运行它的所有内容之后。我会及时通知你。
  • 没问题,如果我现在不在工作,我可能会尝试更深入地帮助您,但是,我只能拖延这么久才会遇到麻烦。
  • 它运行良好,不是 100% 准确,但它必须比通过 API 运行更快。
  • 是的,不幸的是,几乎所有邮政编码数据库的纬度/经度点都与邮政编码位置的中心相关联。这不是精确的点。并且通过将距离减少到 1 可能 2 英里。这是一个废话拍摄,因为一些计算可能达不到要求。一般来说,虽然总比没有好,最终会让你从 100k+ 减少到几千个空条目,你可以通过其他较慢的方式获得,而无需由于 api 限制而连续几天等待,很高兴它在某种程度上对你有用
【解决方案2】:

由于您已经有一个经纬度数据库,我假设它描述了一组从 (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

【讨论】:

    猜你喜欢
    • 2012-03-24
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多