这是一个有关使用haversine公式计算地球上两个纬度和经度之间的距离的问题,用于需要“查找我最近的”功能的项目中。
haversine公式很好地讨论并在MySQL解决了这个帖子。
然后,我问了一个有关将其转换为存储函数的问题,这样它就可以在以后的项目中使用,而不必查找,记住或重新键入长格式的公式。
都很好。除了我的函数的结果(略有不同)以外,其他条件相同时,直接在查询中直接键入公式即可。为什么是这样?
所以这是我写的函数:
DELIMITER $$
DROP FUNCTION IF EXISTS haversine $$
CREATE FUNCTION `haversine`
(fromLatitude FLOAT,
fromLongitude FLOAT,
toLatitude FLOAT,
toLongitude FLOAT,
unit VARCHAR(20)
)
RETURNS FLOAT
DETERMINISTIC
COMMENT 'Returns the distance on the Earth between two known points of longitude and latitude'
BEGIN
DECLARE radius FLOAT;
DECLARE distance FLOAT;
IF unit = 'MILES' THEN SET radius = '3959';
ELSEIF (unit = 'NAUTICAL_MILES' OR unit='NM') THEN SET radius = '3440.27694';
ELSEIF (unit = 'YARDS' OR unit='YD') THEN SET radius = '6967840';
ELSEIF (unit = 'FEET' OR unit='FT') THEN SET radius = '20903520';
ELSEIF (unit = 'KILOMETRES' OR unit='KILOMETERS' OR unit='KM') THEN SET radius = '6371.3929';
ELSEIF (unit = 'METRES' OR UNIT='METERS' OR unit='M') THEN SET radius = '6371392.9';
ELSE SET radius = '3959'; /* default to miles */
END IF;
SET distance = (radius * ACOS(COS(RADIANS(fromLatitude)) * COS(RADIANS(toLatitude)) * COS(RADIANS(toLongitude) - RADIANS(fromLongitude)) + SIN(RADIANS(fromLatitude)) * SIN(RADIANS(toLatitude))));
RETURN distance;
END$$
DELIMITER ;
这是一组测试查询,旨在查找伦敦眼和白金汉宫之间的距离,仅作为示例。显然,通常您会将目的地替换为您要与之比较的地理位置“事物”数据库中的字段。
SET @milesModifier = 3959;
SET @myLat = 51.503228;
SET @myLong = -0.119703;
SET @destLat = 51.501267;
SET @destLong = -0.142697;
SELECT @kilometerModifier AS radius,
@myLat AS myLat,
@myLong AS myLong,
@destLat AS destLat,
@destLong AS destLong,
(@milesModifier * ACOS(COS(RADIANS(@myLat)) * COS(RADIANS(@destLat)) * COS(RADIANS(@destLong) - RADIANS(@myLong)) + SIN(RADIANS(@myLat)) * SIN(RADIANS(@destLat)))) AS longFormat,
haversine(@myLat,@myLong,@destLat,@destLong,'MILES') AS distanceMiles,
haversine(@myLat,@myLong,@destLat,@destLong,'NAUTICAL_MILES') AS distanceNautical,
haversine(@myLat,@myLong,@destLat,@destLong,'KM') AS distanceKm,
haversine(@myLat,@myLong,@destLat,@destLong,'METRES') AS distanceMetres,
haversine(@myLat,@myLong,@destLat,@destLong,'YARDS') AS distanceYards,
haversine(@myLat,@myLong,@destLat,@destLong,'FEET') AS distanceFeet,
haversine(@myLat,@myLong,@destLat,@destLong,'') AS distanceDefault
在示例中,我们使用英里-因此我们将半径( 测试 中的 @milesModifier ,函数中的 半径 )精确设置为3959。
我得到的结果很有趣(在MySQL 5.2.6社区版上),重点是:
| longFormat | distanceMiles |
|------------------|-----------------|
| 0.99826000106148 | 0.9982578754425 |
longFormat 是在查询中完成的数学 运算 , distanceMiles 是函数的结果。
结果是不同的…确定,所以就在项目中使用该函数而言,它是微不足道的,但是我很想知道函数内部或外部的相同公式如何产生不同的结果。
我猜想这与FLOAT的长度有关-在函数中未指定长度,我尝试指定它们(最多30,15),以便为所有图形和输出留出足够的空间我希望-但结果仍然略有不同。
FLOAT
是一种近似的数据类型-请参阅:
浮点值
数字类型的问题
尝试更改FLOAT
以DECIMAL(30,15)
确保您具有正确的精度。
如果要深入讨论浮点,可以尝试以下文章:
每个计算机科学家都应了解的浮点运算法则
问题内容: 因此,我一直在尝试在查询中生成一些SQL随机数,但发现有些奇怪。 假设我运行以下查询: SQL随机数gen有点笨重,但是这里的基本思想很简单-选择1到5之间的随机数,然后将该数字作为文本显示在选择窗口中。这按预期工作。 但是,如果我使用SAME查询,而是将随机数公式粘贴到方法中,而不是将其声明为整数,那么它们全都在一行上: 运行查询时,我仍然获得值1到5,但是有时我也得到NULL。NU
为牛顿方法编写实现雅可比矩阵的函数时,我注意到了一个非常严重的错误。 调用函数 仅返回,省略了的减法运算。但是如果我把代码改成 一切工作无缝。 我试图重现它,这不是完全相同的行为,但它也没有表现为想要的: 考虑下面的代码: 它会打印出来 到控制台。 但是,如果我更改为函数 控制台会打印 对于第二个矩阵。(这只是内存中一些未初始化的垃圾)。 有人能解释一下我的代码和示例问题发生了什么吗?我真的不知道
问题内容: 我尝试将matlab代码转换为numpy,并发现numpy与std函数的结果不同。 在matlab中 在numpy中 这正常吗?我应该如何处理呢? 问题答案: NumPy函数采用一个可选参数:“自由度增量”。默认情况下是。对其进行设置以获取MATLAB结果: 要添加更多上下文,在计算方差(标准偏差为平方根)时,通常将其除以我们拥有的值的数量。 但是,如果我们从较大的分布中选择元素的随机
我在PowerShell ISE和VS代码中尝试了这段代码,得到了同样奇怪的结果。如果没有断点,则输出为空,但如果在带有“NULL”的行中有断点,则输出为空(如预期)。为什么? 我现在知道,当您使用类型修饰符[string]作为参数时,PowerShell将始终将非字符串值(例如$null或[NullString]::Value)转换为(空)字符串。好吧,我可以接受,但如果调试在这种情况下如此奇怪
这是一个优化问题,我正试图用我使用的opl代码来解决(稍微有点扭曲)。 opl代码为我提供了两种解决方案,即:{Product12,Product31} 当我使用docplex将此代码翻译为python语言时,我使用以下代码: 我明白了: ***问题没有解决方案 我不明白为什么我有不同的结果,有人能帮我吗? 先谢谢你。 当做
我在两个特征类中有两个几何,一个名为“HY90299”,另一个名为“hyboxsdo”,这两个几何不相交。 但是当我在oralce中运行空间查询时, “从 HY90299 t,hyboxsdo g 中选择sdo_relate(t.shape,g.shape ,'mask=ANYINTERACT') ” , 我的预言机版本是11g 追加