相关疑难解决方法(0)

用于计算地理邻近度的公式

我需要在我的应用程序中实现地理邻近搜索,但我对使用正确的公式感到困惑.在Web和StackOverflow中进行一些搜索之后,我发现解决方案是:

  1. 使用Haversine公式
  2. 使用大圆距离公式
  3. 在数据库中使用空间搜索引擎

选项#3真的不适合我ATM.现在我有点困惑,因为我总是认为大圆距离公式Haversine公式同义词,但显然我错了?

Haversine Formula http://i46.tinypic.com/30shbn6.png

以上屏幕截图取自使用MySQL论文的精彩Geo(邻近)搜索,并使用以下功能:

ASIN, SQRT, POWER, SIN, PI, COS
Run Code Online (Sandbox Code Playgroud)

我也看到了相同公式(余弦球面定律)的变化,如下所示:

(3956 * ACOS(COS(RADIANS(o_lat)) * COS(RADIANS(d_lat)) * COS(RADIANS(d_lon) - RADIANS(o_lon)) + SIN(RADIANS(o_lat)) * SIN(RADIANS(d_lat))))
Run Code Online (Sandbox Code Playgroud)

它使用以下功能:

ACOS, COS, RADIANS, SIN
Run Code Online (Sandbox Code Playgroud)

我不是数学专家,但这些公式是一样的吗?我遇到了一些更多的变化,以及公式(例如Cosines球面定律Vincenty的 公式 - 这似乎是最准确的),这让我更加困惑......

我需要选择一个好的通用公式来实现PHP/MySQL.谁能解释我上面提到的公式之间的差异?

  • 哪一个是最快的计算?
  • 哪一个提供最准确的结果?
  • 在结果的速度/准确性方面哪一个最好?

感谢您对这些问题的见解.


基于理论上的答案,我测试了以下大圆距离公式:

  • 文森特公式
  • Haversine Formula
  • 余弦球面定律

Vincenty公式是死的慢,但是它是相当准确的(下降到0.5mm) . …

php mysql math geospatial geo

67
推荐指数
2
解决办法
2万
查看次数

使用空间点类型在MySQL中存储Lat Lng值

使用的技术:MySQL 5.1和PHP 5.3

我只是为我正在写的网站设计一个新的数据库.我正在寻找现在存储Lat和Lng值的最佳方法.

在过去,我一直在使用DECIMAL并在表单中使用PHP/MySQL select:

SQRT(POW(69.1 * (fld_lat - ( $lat )), 2) + POW(69.1 * (($lon) - fld_lon) * COS(fld_lat / 57.3 ), 2 )) AS distance
Run Code Online (Sandbox Code Playgroud)

找到最近的匹配地点.

开始阅读有关新技术的更多内容我想知道是否应该使用Spatial Extensions.http://dev.mysql.com/doc/refman/5.1/en/geometry-property-functions.html

虽然信息很薄,但对如何存储数据有疑问.我现在使用POINT作为数据类型,而不是使用DECIMAL?

此外,一旦存储为POINT,只是为了从中获取Lat Lng值,以便我想在地图上绘制它或者我是否还应该再次将lat lngs存储为DECIMALS?

我知道我应该使用PostGIS,因为这里的大多数帖子都说我只是不想学习新的数据库!

跟进

我一直在玩新的POINT类型.我已经能够使用以下内容添加Lat Lng值:

INSERT INTO spatialTable (placeName, geoPoint) VALUES( "London School of Economics", GeomFromText( 'POINT(51.514 -0.1167)' ));
Run Code Online (Sandbox Code Playgroud)

然后,我可以使用以下方法从Db返回Lat和Lng值:

SELECT X(geoPoint), Y(geoPoint) FROM spatialTable;
Run Code Online (Sandbox Code Playgroud)

这一切看起来都不错,但距离的计算是我需要解决的问题.显然,MySQL有一个距离函数的占位符,但暂时不会发布.在一些帖子中,我发现我需要做类似下面的事情,但是我认为我的代码有点错误:

SELECT
 placeName,
 ROUND(GLength(
  LineStringFromWKB(
   LineString(
    geoPoint, 
    GeomFromText('POINT(52.5177, -0.0968)')
  )
  )
))
AS distance
FROM spatialTable
ORDER BY distance …
Run Code Online (Sandbox Code Playgroud)

mysql geospatial

36
推荐指数
1
解决办法
3万
查看次数

标签 统计

geospatial ×2

mysql ×2

geo ×1

math ×1

php ×1