查找邮政编码指定距离内的所有邮政编码

时间:2011-10-14 01:36:08

标签: mysql vb.net zipcode

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

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

非常感谢代码示例

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

2 个答案:

答案 0 :(得分:3)

这是我写了很长一段时间的东西,可能会让你朝着正确的方向前进。

当您询问VB.Net时,您真正需要的是一个查询,它会执行“Great Circle Distance”计算,以确定纬度和经度标识的两个点之间的距离。

所以,做出以下假设:

  1. 您的邮政编码数据位于单个表格中。
  2. 所述表具有lat和lon的属性,它们是邮政编码的近似质心
  3. 您可以使用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
    

    它看起来很复杂,因为它是。这里有更聪明的人可以解释算法。我只是从我在互联网上找到的一些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) _
    

    缩小要检查的邮政编码列表,使查询运行得更快。它会为lat和lon添加任意数量,这样在加利福尼亚搜索半径时就不会检查俄亥俄州的所有zipcodes。其余部分都是上述Great Circle Distance算法的一部分。

    这可能是在一次查询中完成的,以提高效率,但我当时以这种方式需要它,现在我不知道原因。

答案 1 :(得分:0)

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

此ZipcodeAPI服务每小时最多可获得50个请求,每小时仅需250美元,每小时5,000个请求。