相关疑难解决方法(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万
查看次数

查询在SQLite中获取基于Radius的记录?

我有这个查询,它在MySQL中运行良好

SELECT ((ACOS(SIN(12.345 * PI() / 180) * SIN(lat * PI() / 180) +
         COS(12.345 * PI() / 180) * COS(lat * PI() / 180) * COS((67.89 - lon) * 
         PI() / 180)) * 180 / PI()) * 60 * 1.1515 * 1.609344) AS distance, poi.* 
FROM poi
WHERE lang='eng' 
HAVING distance<='30'
Run Code Online (Sandbox Code Playgroud)

距离以公里为单位,输入为lat=12.345lon=67.89

SQLite是3,我无法在Android上运行自定义函数.我也没有acos()等......因为它不是标准SQLite的一部分.

如何在SQLite中进行上述查询?

sql sqlite android

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

SQL查询基于lat/long - SQLite查询附近的兴趣点

给定一个包含三个字段的数据库:

纬度经度接近度

Lat和Long是GPS坐标,而Proximity是(某些单位 - 英尺?秒?分钟?)

鉴于用户目前的GPS纬度/长...

我想编写一个SQL查询,它将检索用户在这些行的"接近"范围内的所有行.

诀窍:这必须在SQLite中工作,它只支持相当原始的数据类型.没有作弊和依赖SQL Server(或其他一些提供更好的地理空间功能的产品).

有什么建议?

sqlite geospatial

11
推荐指数
1
解决办法
9670
查看次数

标签 统计

geospatial ×2

sqlite ×2

android ×1

geo ×1

math ×1

mysql ×1

php ×1

sql ×1