邮政编码之间的距离



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

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

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

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

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

您的数据集中有地理代码吗?如果没有,你可以通过类似的服务将其添加到你的邮政编码中http://geocoder.us/help/city_state_zip.shtml或者,您可以获得一个预先编码的数据库,可在http://www.zipinfo.com/products/z5ll/z5ll.htm一旦将代码添加到记录中,就可以使用标准的数学距离计算,使用纬度/经度坐标来计算距离。

如果您想要驾驶距离,请使用Google Maps API,否则此距离将"如雷贯耳"。

一旦您获得了所有邮政编码的地理坐标,这里有一个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

最新更新