我有一个控件,允许用户输入邮政编码或在iframe中打开谷歌地图,然后点击地图选择一个位置。我目前正在使用这一切,iframe会将click事件中的lat / lon发送回父级。
我还设置了一个db表,其中lat / lon字段映射到邮政编码。
但是,lat / lon组合很可能永远不会与我在db中的条目完全匹配。所以,我正在寻找匹配最近的邮政编码的最佳方式。
因为用户能够手动输入邮政编码,所以我并不完全担心精确度(即如果用户点击邮政编码之间的边界),但我希望它尽可能接近。我现在只需要担心美国的位置。
我目前对解决方案的想法是提出一些容差(.2?)并查询db的lat / long + - 容差。然后从结果集中选择最接近的匹配。
我很想听到之前已经做过这件事的人或者比我提出的解决方案更好的解决方案。我对使用服务不感兴趣,因为我拥有所需的所有数据。
我对我提出的解决方案的一个担忧是弄清楚什么是良好的容忍度。这个项目针对的是农村地区,我不确定这些地区的纬度/经度条目是如何分散的。
编辑:这是我的表结构: zip5 |城市|州| lat | lon |县
zip5是主键
答案 0 :(得分:2)
纬度的一分钟(即1/60度)= 1 n.m.,或约6,000英尺。因此5分钟。纬度=约30,000英尺=约6法定里程。
经度朝着两极变窄,但是如果我们将美国大陆带到北纬36度左右,给予或采取(我认为相当一点,但近似应该对这个应用来说是足够的),然后是经度的一分钟〜 1纳米* cos 36~6,000 * 0.81 = 4,850英尺。
由于邮政编码(或至少第一组5位数字)代表邮局,在农村地区可能相距20-30英里,你可能会比使用约1/2的Lat-Long网格更糟糕那或者说10分钟。纬度x 12分钟经度。它们分别为1/6度和1/5度。
答案 1 :(得分:1)
您可能希望放弃自己的数据库查找并使用已经执行此操作的Web服务,例如GeoNames。有关详情,请参阅SO问题Get zip code from latitude, longitude?。看起来它已经做了你想做的事情,但没有所有的计算和容差。
答案 2 :(得分:1)
此问题的规范解决方案使用R树。