邮政编码之间的距离

时间:2012-08-29 17:14:14

标签: sql sql-server asp-classic location postal-code

我正在努力寻找制定位置之间距离的最佳方法(我们有邮政编码和位置)。

基本上每条记录都有一个位置和邮政编码,前端用户可以输入邮政编码并选择记录..

- Within 10 Miles
- Within 20 Miles
- Within 40 Miles
- Within 50 Miles

我能看到这样做的唯一方法是从数据库中获取EACH记录并计算每个记录之间的距离,将其输入临时表,然后按位置对此表进行排序并对其进行过滤。这似乎是一种冗长而耗时的做法 - 有没有人对如何做得更好有任何建议?或者这是最好的方式吗?

一个例子是客户输入SO40 9AA(南安普顿邮政编码),然后选择“50英里内”,这应显示并记录在该邮政编码或位置50英里内。

2 个答案:

答案 0 :(得分:0)

您的数据集中是否有地理位置代码? 如果没有,您可以使用http://geocoder.us/help/city_state_zip.shtml等服务为您的邮政编码添加它 或者您可以获得预编码的数据库,可在http://www.zipinfo.com/products/z5ll/z5ll.htm获得 将代码添加到记录后,您可以使用lat / long坐标计算标准数学距离来计算距离。

如果您想要行驶距离,请使用Google Maps API,否则此距离将为“乌鸦飞行”。

答案 1 :(得分:0)

一旦你获得了所有邮政编码的地理坐标,这里有一个VB函数来获得任意两点之间的海峡距离。这会产生数英里的结果,但很容易转换它。

Function distance(lat1 As Single, lon1 As Single, lat2 As Single, lon2 As Single)
  Dim theta As Single, dist As Single
  theta = deg2rad(lon1 - lon2)
  lat1 = deg2rad(lat1)
  lat2 = deg2rad(lat2)
  dist = Sin(lat1) * Sin(lat2) + Cos(lat1) * Cos(lat2) * Cos(theta)
  dist = acos(dist)
  dist = rad2deg(dist)
  distance = dist * 60 * 1.1515
End Function

'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
':::  This function get the arccos function from arctan function    :::
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Function acos(Rad)
  If Abs(Rad) <> 1 Then
    acos = pi / 2 - Atn(Rad / Sqr(1 - Rad * Rad))
  ElseIf Rad = -1 Then
    acos = pi
  End If
End Function


'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
':::  This function converts decimal degrees to radians             :::
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Function deg2rad(Deg As Single) As Single
    deg2rad = CSng(Deg * pi / 180)
End Function

'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
':::  This function converts radians to decimal degrees             :::
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Function rad2deg(Rad As Single) As Single
    rad2deg = CSng(Rad * 180 / pi)
End Function