Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用SQL在一个横向/纵向坐标和一个固定坐标之间的近似距离_Mysql_Sql_Coordinates_Latitude Longitude - Fatal编程技术网

Mysql 使用SQL在一个横向/纵向坐标和一个固定坐标之间的近似距离

Mysql 使用SQL在一个横向/纵向坐标和一个固定坐标之间的近似距离,mysql,sql,coordinates,latitude-longitude,Mysql,Sql,Coordinates,Latitude Longitude,这里 我发现了一个非常简单且不错的公式: d = sqrt(pow(lat2-lat1, 2) + cos(lat1)*pow(lon2-lon1, 2)) 我是这样使用的: SELECT name, SQRT(POW(lat-45, 2) + COS(45)*POW(lon-8, 2)) AS distance FROM shop ORDER BY distance 一切都很好,因为我只需要得到一个大概的相对距离 但我需要一个绝对距离,即使是近似的。。。我开始意识到,也许“d”不能用米/

这里

我发现了一个非常简单且不错的公式:

d = sqrt(pow(lat2-lat1, 2) + cos(lat1)*pow(lon2-lon1, 2))
我是这样使用的:

SELECT name, SQRT(POW(lat-45, 2) + COS(45)*POW(lon-8, 2)) AS distance
FROM shop
ORDER BY distance
一切都很好,因为我只需要得到一个大概的相对距离

但我需要一个绝对距离,即使是近似的。。。我开始意识到,也许“d”不能用米/英里来换算,因为例如,纬度是180度,经度是360度,所以这个几乎是毕达哥拉斯定理的定理正在“拉伸”对角线,这会搞乱可能的绝对计算。。。过了一段时间,我放弃了。。。我来了

如何将“d”转换为以米/英里为单位的绝对距离


PS:是的,我将在最终版本中预先计算SQL查询中的所有常量…

在SQL中获取米的距离检查此查询,也可以将其转换为函数

declare @lat1 FLOAT
declare @lat2 FLOAT
declare @lon1 FLOAT
declare @lon2 FLOAT

SET @lat1 = 18.4768047
SET @lon1 = -69.9516518
SET @lat2 = 18.4624464
SET @lon2 = -69.9652686


select (ACOS(SIN(PI()*@lat1/180.0)*SIN(PI()*@lat2/180.0)+COS(PI()*@lat1/180.0)*COS(PI()*@lat2/180.0)*COS(PI()*@lon2/180.0-PI()*@lon1/180.0))*6371)*1000
这是一个例子

更新

我为MySQL创建了这个获取公里、英里、里程和码的过程

DELIMITER //
CREATE PROCEDURE sp_Distance(lat1 FLOAT,lon1 FLOAT,lat2 FLOAT,lon2 FLOAT,unit INT) 
BEGIN  

declare KM INT;
declare MILE INT;
declare METTER INT;
declare YARD INT;

SET KM = 6371;
SET MILE = 3959;
SET METTER = KM*1000;
SET YARD = MILE*1760;


SELECT ((ACOS(SIN(PI()*lat1/180.0)*SIN(PI()*lat2/180.0)+
COS(PI()*lat1/180.0)*COS(PI()*lat2/180.0)*COS(PI()*lon2/180.0-PI()*lon1/180.0)))*
(SELECT CASE
WHEN unit = 1 THEN KM
WHEN unit = 2 THEN MILE
WHEN unit = 3 THEN METTER
WHEN unit = 4 THEN YARD END as unit_value)
) as Distance;
END;//

DELIMITER ;
致电:

call sp_Distance(18.4768047,-69.9516518,18.4624464,-69.9652686,1)
exec sp_Distance 18.4768047,-69.9516518,18.4624464,-69.9652686,1
而对于SQL

CREATE PROCEDURE sp_Distance(@lat1 FLOAT,@lon1 FLOAT,@lat2 FLOAT,@lon2 FLOAT,@unit INT) 
AS
BEGIN 

declare @KM INT
declare @MILE INT
declare @METTER INT
declare @YARD INT

SET @KM = 6371
SET @MILE = 3959
SET @METTER = @KM*1000
SET @YARD = @MILE*1760

SELECT ((ACOS(SIN(PI()*@lat1/180.0)*SIN(PI()*@lat2/180.0)+
COS(PI()*@lat1/180.0)*COS(PI()*@lat2/180.0)*COS(PI()*@lon2/180.0-PI()*@lon1/180.0)))*
(SELECT CASE
WHEN @unit = 1 THEN @KM
WHEN @unit = 2 THEN @MILE
WHEN @unit = 3 THEN @METTER
WHEN @unit = 4 THEN @YARD END as unit_value)
) as Distance
END
致电:

call sp_Distance(18.4768047,-69.9516518,18.4624464,-69.9652686,1)
exec sp_Distance 18.4768047,-69.9516518,18.4624464,-69.9652686,1
这对我很有用:

$sql=“SELECT*,(((($latitude.*pi()/180))sin((
纬度
*pi()/180))+cos((“$latitude.*pi()/180))*cos(
纬度
*pi()/180))*cos((“$longitude.-
经度
经度=$distance的商店//距离以公里为单位

还可以看看谷歌地图的功能:

您正在使用哪些数据库管理系统?博士后?甲骨文?哦,对不起,不不不。。。仅MySQLforPostgres您可以使用earthdistance模块:可能是重复的谢谢,我会尝试,但我不会将其标记为已接受,因为我在问是否可以从“d”获取仪表,而不是进行其他查询;)但我将永远测试它!更新:@RickJames将此用于获取里程选择ACO(SIN(PI()*@lat1/180.0)*SIN(PI()*@lat2/180.0)+COS(PI()*@lat1/180.0)*COS(PI()*@lat2/180.0)*COS(PI()*@lon2/180.0-PI()*@lon1/180.0))*3959