我有一个数据库表,其中有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
但它需要表格中所有邮政编码的长片,但我希望它们在运行时间。
答案 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
";