我正在努力寻找制定位置之间距离的最佳方法(我们有邮政编码和位置)。
基本上每条记录都有一个位置和邮政编码,前端用户可以输入邮政编码并选择记录..
- Within 10 Miles
- Within 20 Miles
- Within 40 Miles
- Within 50 Miles
我能看到这样做的唯一方法是从数据库中获取EACH记录并计算每个记录之间的距离,将其输入临时表,然后按位置对此表进行排序并对其进行过滤。这似乎是一种冗长而耗时的做法 - 有没有人对如何做得更好有任何建议?或者这是最好的方式吗?
一个例子是客户输入SO40 9AA(南安普顿邮政编码),然后选择“50英里内”,这应显示并记录在该邮政编码或位置50英里内。
答案 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