邮政编码之间的距离

Posted

技术标签:

【中文标题】邮政编码之间的距离【英文标题】:Distance between Postcodes 【发布时间】:2012-08-29 17:14:14 【问题描述】:

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

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

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

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

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

【问题讨论】:

如果你可以访问经度/纬度,看看这个:***.com/questions/4117979/sql-server-geography-point 和这个sqlteam.com/forums/topic.asp?TOPIC_ID=81360 您使用的是哪个版本的 SQL Server? 【参考方案1】:

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

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

【讨论】:

这两个解决方案非常适合美国解决方案,但 OP 的邮政编码是英国。 好点。对不起。对于英国地址,请尝试此网站freemaptools.com/download-uk-postcode-lat-lng.htm【参考方案2】:

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

【讨论】:

以上是关于邮政编码之间的距离的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 doParallel 计算 R 中邮政编码之间的距离?

合并两个 MySQL 查询并获取两个邮政编码之间的距离

MySQL更快更准确地计算邮政编码之间的距离?

两个英国邮政编码之间的距离

如何在 C# 或 SQL Server 中找到邮政编码之间的距离?

使用 Asp.Net MVC C# 使用谷歌地图 API 计算 2 个邮政编码之间的距离