2013-03-08 113 views
2

我有一个控件,允许用户输入邮政编码或在iframe中打开google地图,然后单击地图选择一个位置。我目前有这一切工作,并且iframe会将click/lat事件发回给父级。从经度/纬度获取邮政编码

我也有一个数据库表设置与经纬度字段映射到邮政编码。

但是,纬度/经度组合很可能永远不会匹配我在数据库中的条目。所以,我正在寻找匹配最接近的邮政编码的最佳方式。

因为用户可以手动输入邮政编码,所以我并不完全担心精度(即用户点击邮政编码之间的边界),但我希望它尽可能接近。我现在只需要担心美国的位置。

我目前的解决方案的想法是提出一些宽容(.2?),并查询db/long + - 容差。然后从结果集中选择最接近的匹配项。

我很乐意听到之前做过这个或者有比我提出的更好的解决方案的人的消息。我对使用服务不感兴趣,因为我拥有所有我需要的数据。

我对我提出的解决方案有一个担忧,那就是确定一个好的容差是多少。这个项目是针对农村地区的,我不确定这些地区经纬度的分布情况如何。

编辑:这是我的表结构: zip5 |城市|状态| lat | lon |县

zip5是纬度的主键

+0

请问您为什么要将纬度/经度转换为邮政编码?一旦你有了经/纬度,你就有了通过它们的邻近来找到其他实体的关键。有什么邮政编码让你拥有一个经/纬度不会让你? – Tim 2013-03-08 22:16:33

+0

@Tim根据我给出的设计规范,zip将显示在html输入中。我可以反驳它,但这看起来不应该那么困难。 – Helto 2013-03-08 22:20:55

+0

如果您需要查找2组纬度/经度之间的距离,则可以轻松计算从给定的邮政编码(纬度/经度)到文件中的距离... – keithhatfield 2013-03-08 22:27:52

回答

1

此问题的规范解决方案使用R树。

+0

从阅读我已经完成我同意你。不幸的是,我不确定我将如何为所有邮政编码创建边界框。 – Helto 2013-03-08 23:33:19

+0

边界框可以是任意大小的,它可以通过其左上角和右下角坐标来定义。假设你制作了25 x 25英里的盒子。你会创建你的边界框表。然后,您将迭代边界框表,然后在嵌套循环中迭代您的邮政编码表,并计算邮政编码的质心是否落在框中。如果确实如此,则在链接表中创建一个边界框 - 邮编链接。在runime中,计算点击发生的边界框,选择其链接的拉链,并计算到每个拉链的距离,选择最近的。 – Tim 2013-03-08 23:45:31

+0

谢谢,这是有道理的。希望我的拉链桌子的lat/lon字段是质心,这会更容易。 – Helto 2013-03-09 04:53:41

2

一分钟(即1/60度)= 1 N.M.,或约6000的脚。因此5分钟。纬度=约30,000英尺=约6法定英里。

经度朝向两极缩小,但如果我们把美国大陆看作北纬36度左右,给予或拿走(我认同一点,但近似值应该足够这个应用),然后一分钟的经度〜1nm * cos 36〜6,000 * 0.81 = 4,850英尺。

由于邮政编码(或至少第一组5位数字)代表邮局,在农村地区可能相距20-30英里,您可能会做得比使用大约1/2,或说10分钟。纬度x 12分钟。经度。那些方便分别为1/6度和1/5度。

+0

谢谢你的深刻回应。看起来这些价值观很可能是一种体面的宽容。 – Helto 2013-03-08 23:08:46

1

您可能希望丢弃自己的数据库查找并使用已经执行此操作的web服务,如GeoNames。有关更多信息,请参见SO问题Get zip code from latitude, longitude?。看起来它已经做了你想做的事,但没有所有的计算和容差。

+0

我在我的问题中特别写了我对服务不感兴趣。我有我需要做的一切工作,我只需要能够通过查询过滤大部分数据。 – Helto 2013-03-08 23:10:14