给定坐标,我如何获得半径10英里范围内的所有邮政编码?

我有一个位置(纬度和经度)。 如何获得部分或完全位于我所在位置10英里范围内的邮政编码列表?

解决方案可以是调用众所周知的Web服务(谷歌地图,bing地图等)或本地数据库解决方案(客户端具有sql server 2005)或算法。

我已经看到了类似的问题 ,但是那里的所有答案几乎都与使用我无法使用的SQL Server 2008地理function有关。

首先,您需要一个包含所有zipcodes及其相应纬度和经度的数据库。 在澳大利亚,只有几千种(而且信息很容易获得),但我认为这在美国可能是一项更艰巨的任务。

其次,如果您知道自己的位置,并且知道所寻找的半径,则可以查找该半径范围内的所有拉链码。 用PHP编写的简单内容如下:(道歉它不在C#中)

function distanceFromTo($latitude1,$longitude1,$latitude2,$longitude2,$km){ $latitude1 = deg2rad($latitude1); $longitude1 = deg2rad($longitude1); $latitude2 = deg2rad($latitude2); $longitude2 = deg2rad($longitude2); $delta_latitude = $latitude2 - $latitude1; $delta_longitude = $longitude2 - $longitude1; $temp = pow(sin($delta_latitude/2.0),2) + cos($latitude1) * cos($latitude2) * pow(sin($delta_longitude/2.0),2); $earth_radius = 3956; $distance = $earth_radius * 2 * atan2(sqrt($temp),sqrt(1-$temp)); if ($km) $distance = $distance * 1.609344; return $distance; } 

从包含邮政编码及其对应的纬度和经度坐标的邮政编码数据库开始:

http://www.zipcodedownload.com/Products/Product/Z5Commercial/Standard/Overview/

要获得纬度和经度之间的距离,您需要一个良好的距离公式。 这个网站有几个变化:

http://www.meridianworlddata.com/distance-calculation/

“Great Circle Distance”公式有点极端。 根据我的经验,这个很好用:

 sqrt(x * x + y * y) where x = 69.1 * (lat2 - lat1) and y = 69.1 * (lon2 - lon1) * cos(lat1/57.3) 

您的SQL查询将如下所示:

 select zd.ZipCode from ZipData zd where sqrt( square(69.1 * (zd.Latitude - @Latitude)) + square(69.1 * (zd.Longitude - @Longitude) * cos(@Latitude/57.3)) ) < @Distance 

祝好运!

大多数搜索都使用质心。 为了处理10英里范围内的部分邮政编码,您将不得不购买邮政编码多边形数据库(*)。 然后实现一个算法,该算法检查半径为10英里的顶点的zipcodes。 为了正确完成,您必须使用Haversine公式进行距离测量。 通过一些聪明的数据结构,您可以显着减少搜索空间。 同样,通过存储和初步比较zipcoe范围(北,西,东,南),可以大大加快搜索速度。

(*)注意:技术上的zipcodes不是多边形! 我知道我们都是这样想的,但实际上它们是数据点(街道地址)的集合,这就是USPS真正使用它们的方式。 这意味着zipcodes可以包含其他zipcodes; zipcodes可以由多个“多边形”组成; 和zipcodes可以重叠其他zipcodes。 大多数情况应该不是问题,但您必须处理可以定义为多个多边形的zipcodes。