Sql 邮政编码之间的距离

Sql 邮政编码之间的距离,sql,sql-server,asp-classic,location,postal-code,Sql,Sql Server,Asp Classic,Location,Postal Code,我正试图找出计算位置之间距离的最佳方法,我们有邮政编码和位置 基本上,每个记录都有一个位置和邮政编码,前端用户可以输入邮政编码并选择记录 - Within 10 Miles - Within 20 Miles - Within 40 Miles - Within 50 Miles 我能看到的唯一方法是从数据库中获取每条记录并计算每条记录之间的距离,将其输入到临时表中,然后按位置对该表排序并对其进行过滤。这似乎是一种冗长而耗时的方法——有人对如何做得更好有什么建议吗?还是这是最好的方法 例如,客

我正试图找出计算位置之间距离的最佳方法,我们有邮政编码和位置

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

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


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

您的数据集中是否有地理编码? 如果没有,您可以将其添加到zipcodes中,并使用如下服务 或者,您也可以获得一个预编码的数据库,网址为 一旦将代码添加到记录中,就可以使用标准的数学距离计算,使用lat/long坐标计算距离


如果您想要驾驶距离,请使用谷歌地图API,否则此距离将被忽略

您的数据集中有地理代码吗? 如果没有,您可以将其添加到zipcodes中,并使用如下服务 或者,您也可以获得一个预编码的数据库,网址为 一旦将代码添加到记录中,就可以使用标准的数学距离计算,使用lat/long坐标计算距离


如果您想要驾驶距离,请使用谷歌地图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

一旦您为所有邮政编码输入地理坐标,这里就有一个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

如果您可以访问经度/纬度,请看这个:这是您使用的SQL Server的哪个版本?如果您可以访问经度/纬度,请看这个:这是您使用的SQL Server的哪个版本?这两个解决方案对我们的解决方案很好,但OP的邮政编码是英国的。很好。很抱歉对于英国地址,请尝试此网站。这两个解决方案对于美国解决方案来说非常好,但OP的邮政编码是英国的。很好。很抱歉如需英国地址,请尝试此网站