在sql查询中查找特定纬度和经度的lat和long的所有最近的邮政编码

时间:2014-11-26 08:54:49

标签: mysql sql google-maps

我有一个数据库表,其中有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

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

2 个答案:

答案 0 :(得分:0)

我不确定我理解你的意思

  

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

由于您需要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英里。我无法帮助你如何精确地将纬度和经度转换为以英里为单位的距离。

答案 1 :(得分:0)

我认为这个被遗弃的问题已经解决了,但是让我在这里分享我的意见,万一其他人正在与这个问题搏斗。我提出了三个选项,让我们使用lat long作为查找来从DB中取出壁橱拉链:

数据库查看选项1(快速和肮脏):

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

SELECT * FROM mytable。ZipCodes 在哪里纬度&gt; = @lat和纬度&lt; = @lat + @tol AND经度&gt; = @long和经度&lt; = @long + @tol ORDER BY(ABS(纬度 - 经度) - ABS(@ lat- @ long))ASC 限制1

选项#2(#1的变化)

$ qry =&#34; SELECT zipcode,cityname,stateabbr FROM dealer-site .ZipCodes WHERE(纬度&gt; = {$ lat}和纬度&lt; = {$ lat} +1)AND(ABS(经度)&gt; = ABS({$ long})AND ABS(经度)&lt; ABS({$ long})+ 1)ORDER BY纬度ASC LIMIT 1“;

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

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

选择     * 从     (选择         *             (((ACOS(SIN((@ latitude * PI()/ 180))*                SIN((latitude * PI()/ 180))+ COS((@纬度* PI()/ 180))* COS((latitude * PI()/ 180))* COS( ((@longitude - longitude)* PI()/ 180))))* 180 / PI())* 60 * 1.1515 * 1.609344)AS距离     从         mytable。ZipCodes)ZipCodes 哪里     距离&lt; = 5 限制10

PHP MYSQL(LEGACY CALL):

           $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
    ";