【问题标题】:Find all nearest zip codes with lat and long from a particular latitude and longitude in sql query在sql查询中从特定纬度和经度中查找所有最近的带有经度和纬度的邮政编码
【发布时间】:2014-11-26 08:54:49
【问题描述】:

我有一个数据库表,其中有 4 列。

1. id
2. person_name
3. country
4. zip_code

现在我想要所有邮政编码及其真实纬度和经度,它们位于从给定纬度到 10 英里的给定半径内。

假设我的纬度和经度是 (19.24947300,72.85681400) 并且距离是 10 英里,那么我应该进行什么 SQL 查询来返回所有最近的邮政编码及其经度。

我只有以下查询

SELECT ((ACOS(SIN($lat * PI() / 180) * SIN(lat * PI() / 180) + COS($lat * PI() 
/ 180) * COS(lat * PI() / 180) * COS(($lon – lon) * PI() / 180)) * 180 / PI()) * 60 *
1.1515) AS `distance` FROM `members` HAVING `distance`<=’10’ ORDER BY `distance` ASC

但它需要表格中所有邮政编码的纬度,但我希望它们在运行时。

【问题讨论】:

    标签: mysql sql google-maps


    【解决方案1】:

    我不确定我理解你的意思

    但它需要表格中所有邮政编码的纬度,但我希望它们在运行时。

    由于您需要 SQL 查询,我假设您有一个包含每个邮政编码的纬度和经度的表。

    您可能不应该在 SQL 查询中做所有这些数学运算。我将首先提取以您查询的位置为中心的 10 英里 x 10 英里正方形中的每个邮政编码,然后,如果您真的只需要那些肯定在 10 英里半径内的邮政编码,请检查您的程序(我假设您正在使用PHP,因为你有以 $) 开头的变量。

    SELECT zip, latitude, longitude FROM zip_positions
    WHERE latitude > 19.24947300 - DISTANCE and latitude < 19.24947300 + DISTANCE
    AND longitude > 72.85681400 - DISTANCE and longitude < 72.85681400 + DISTANCE
    

    其中 DISTANCE 大致相当于 10 英里的纬度/经度,您必须计算。

    然后,如果需要,您可以检查 PHP(或您使用的任何语言)的每个结果,以查看它是否确实距离查询点不到 10 英里。我无法帮助您如何将纬度和经度精确转换为以英里为单位的距离。

    【讨论】:

    • 这可行,但只是粗略的......你真的想计算数据库中纬度/经度到纬度/经度之间的距离。
    【解决方案2】:

    我认为这个被遗弃的问题已经解决,但让我在这里分享我的意见,以防其他人与这个问题搏斗。我提出了 3 个选项,用于使用 lat long 从 DB 中压缩壁橱作为查找:

    数据库查找选项 1(快速而简单):

    SET @lat = 41.675868; SET @long = -73.864484; SET @tol = .05;

    选择 * FROM mytable.ZipCodes WHERE 纬度 >= @lat AND 纬度 = @long AND 经度

    选项 #2(#1 的变体)

    $qry = "SELECT zipcode,cityname,stateabbr FROM dealer-site.ZipCodes WHERE (latitude >= {$lat} AND latitude = ABS({ $long}) AND ABS(longitude)

    选项#3 最佳方法计算。我会尝试使用这个:

    SET @latitude = 41.675868; SET @longitude = -73.864484;

    选择 * 从 (选择 *, ((((ACOS(SIN((@latitude * PI() / 180))) * SIN((latitude * PI() / 180)) + COS((@latitude * PI() / 180)) * COS((latitude * PI() / 180)) * COS(((@longitude - longitude) * PI() / 180)))) * 180 / PI()) * 60 * 1.1515 * 1.609344) AS 距离 从 mytable.ZipCodes) 邮政编码 在哪里 距离

    PHP MYSQL(遗留调用):

               $qry = "SELECT zipcode
                FROM (SELECT *,
                    (((ACOS(SIN(({$lat} * PI() / 180)) * 
                    SIN((`latitude` * PI() / 180)) + COS(({$lat}  * PI() / 180)) * COS((`latitude` * PI() / 180)) * 
                    COS((({$long} - `longitude`) * PI() / 180)))) * 180 / PI()) * 60 * 1.1515 * 1.609344) 
                AS distance
                FROM
                `MyDB`.ZipCodes) ZipCodes
                WHERE distance <= 5
                LIMIT 1
        ";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多