【问题标题】:Find all Zipcodes within specified distance of a zipcode查找邮政编码指定距离内的所有邮政编码
【发布时间】:2011-10-14 01:36:07
【问题描述】:

我知道这个问题听起来像是在这里重复了几个问题,但这些问题都没有回答我想要的。 我很想知道是否有人知道如何在指定邮政编码的半径范围内找到其他邮政编码。我有带有纬度和经度的邮政编码数据库,但不确定如何在 VB.net 中执行此操作

例如 - 90069 是一个邮政编码,如果有人说半径为 5 英里,那么我希望弹出所有邮政编码,如 90210,90045,90034 等。

非常感谢代码示例

编辑:我有 MySQL 服务器数据库。

【问题讨论】:

标签: mysql vb.net zipcode


【解决方案1】:

这是我很久以前写的一些东西,可能会让你朝着正确的方向前进。

虽然您要求使用 VB.Net,但您真正需要的是一个查询,该查询执行“Great Circle Distance”计算以确定由纬度和经度标识的两点之间的距离。

所以,做以下假设:

  1. 您的邮政编码数据位于一个表中。
  2. 所述表具有 lat 和 lon 属性,它们是邮政编码的近似质心

您可以使用 LINQ to SQL 查询,使用类似的方法生成所需的结果集

Const EARTH_RADIUS As Single = 3956.0883313286095
Dim radCvtFactor As Single = Math.PI / 180
Dim zipCodeRadius As Integer = <Your Radius Value>

Dim zipQry = From zc In db.ZipCodes 
             Where zc.Zip = "<Your Zip Code>" _
             Select zc.Latitude, 
                    zc.Longitude, 
                    ZipLatRads = RadCvtFactor * zc.Latitude, 
                    ZipLonRads = RadCvtFactor * zc.Longitude
Dim zipRslt = zipQry.SingleOrDefault()
If zipRslt IsNot Nothing Then
    Dim zcQry = From zc In db.ZipCodes _
                Where zc.Latitude >= (zipRslt.Latitude - 0.5) And zc.Latitude <= (zipRslt.Latitude + 0.5) _
                And zc.Longitude >= (zipRslt.Longitude - 0.5) And (zc.Longitude <= zipRslt.Longitude + 0.5) _
                And Math.Abs(EARTH_RADIUS * (2 * Math.Atan2(Math.Sqrt(Math.Pow(Math.Sin(((RadCvtFactor * zc.Latitude) - zipRslt.ZipLatRads) / 2), 2) + _
                Math.Cos(zipRslt.ZipLatRads) * Math.Cos(RadCvtFactor * zc.Latitude) * _
                Math.Pow(Math.Sin(((RadCvtFactor * zc.Longitude) - zipRslt.ZipLonRads) / 2), 2)), _
                Math.Sqrt(1 - Math.Pow(Math.Sin(((RadCvtFactor * zc.Latitude) - zipRslt.ZipLatRads) / 2), 2) + _
                Math.Cos(zipRslt.ZipLatRads) * Math.Cos(RadCvtFactor * zc.Latitude) * _
                Math.Pow(Math.Sin((RadCvtFactor * zc.Longitude) / 2), 2))))) <= zipCodeRadius _
                Select zc
End If

它看起来很复杂,因为它是。 SO上有更聪明的人可以解释算法。我只是用我在互联网上找到的一些 SQL 代码实现了这个——我不记得是从哪里来的。谷歌搜索应该可以让你到达那里。

第一个查询 (zipQry) 以度数和弧度返回起始邮政编码的纬度和经度。然后将这些结果用于执行第二个查询。

第二个查询中WHERE子句的第一部分:

Where zc.Latitude >= (zipRslt.Latitude - 0.5) And zc.Latitude <= (zipRslt.Latitude + 0.5) _
And zc.Longitude >= (zipRslt.Longitude - 0.5) And (zc.Longitude <= zipRslt.Longitude + 0.5) _

只是缩小了要检查的邮政编码列表,使查询运行得更快。它在纬度和经度上添加了任意数量,这样您在搜索加利福尼亚州的半径时就不会检查俄亥俄州的所有邮政编码。其余的都是前面提到的大圆距离算法的一部分。

这本可以在一个查询中完成以提高效率,但当时我需要这种方式,现在我已经失去了原因。

【讨论】:

    【解决方案2】:

    这是一个简单的调用函数 - http://www.zipcodeapi.com/API#radius。调用看起来像:http://www.zipcodeapi.com/rest//radius.///.

    这项 ZipcodeAPI 服务每小时最多可免费处理 50 个请求,每小时 5,000 个请求只需 250 美元。

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多