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

Ang*_*ker 9 c# zipcode geolocation latitude-longitude .net-3.5

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

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

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

dan*_*ana 10

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

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)
Run Code Online (Sandbox Code Playgroud)

您的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
Run Code Online (Sandbox Code Playgroud)

祝好运!

  • 这实际上是一个很好的答案......所有的距离都在我想象的四分之一英里范围内...... +1 (2认同)

win*_*aed 5

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

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


Luk*_*son 5

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

其次,如果您知道自己的位置,并且知道所寻找的半径,则可以查找该半径范围内的所有拉链码.用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;
}
Run Code Online (Sandbox Code Playgroud)