2

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

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

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

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

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

4

2 回答 2

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
于 2012-08-29T19:02:08.887 回答
0

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

如果您想要行驶距离,请使用 Google Maps API,否则此距离将“如鱼得水”。

于 2012-08-29T18:01:24.310 回答