用于搜索地理坐标的数据库设计

Posted

技术标签:

【中文标题】用于搜索地理坐标的数据库设计【英文标题】:Database design for search of geocoordinates 【发布时间】:2013-12-29 16:24:32 【问题描述】:

mysql 数据库中,我有动物(大象)的跟踪数据。目前的设计如下:

timestamp(INT) | individualID(INT) | longitude(DECIMAL) | latitude(DECIMAL)

现在我想向数据库提出几个问题

    在时间 t 最接近的个体是什么? 在时间 t 周围(周长 50 公里)有哪些人? 在时间 t 有哪些人在预订中? (保留由多边形给出)

是否有一些可用于 MySQL 的内置功能?我应该选择不同的数据库吗?

【问题讨论】:

【参考方案1】:

有一个MySQL Spatial Extension,它基于OGC SFS(简单功能规范)实现GEOMETRY。它是许多数据库引擎实现 SPATIAL 数据的基础标准。

对于客户端,有OpenLayers、html5 SVG、Google Maps。看GIS.StackExchange.com。


根据我的经验(如果可以考虑,就像 2 年前一样),空间数据的 MySQL 实现就足够了,但不是最好的。它在 Oracle 和 MS SQL Server (IMHO) 中实现得更好。如果您不打算构建非常复杂的地图 - MySQL 功能就足够了。对于复杂的功能,我建议使用不同的数据库引擎。


在 SO:Fastest Way to Find Distance Between Two Lat/Long Points 上有类似的问题,其中接受的答案使用 MySQL 空间扩展。如果您要进行更多研究,您可能会找到其他问题的答案。


我也可以尝试提供查询依据:

问题 #1: 选择 2 个不同个体之间的短路线 (MIN() + GLength() + LineString + Points 参与)。 问题 #2: 选择给定个人周围区域中的所有个人 (Contains() + Polygon + Points 参与)。 问题 #3: 选择指定多边形中的所有个体 (Contains() + Polygon + Points 参与)。

【讨论】:

【参考方案2】:

我使用以下代码http://www.geodatasource.com/developers/php 克服了我的 PHP 应用程序中的前 2 个问题,那里还有一个 SQL 版本的解决方案。

基本上,您需要计算地球表面上弧的长度,使用三角函数来获得 2 个网格点之间的距离。

然后,您可以比较多个人与您的基地位置的距离,并消除所有距离超过 50 公里的动物,以使您的动物群在周边范围内。

您问题的第 3 部分需要一些更复杂的代数,这不是我已经解决的问题。

【讨论】:

以上是关于用于搜索地理坐标的数据库设计的主要内容,如果未能解决你的问题,请参考以下文章

设计一个保存地理位置的数据库

用于地理空间点搜索的 kdtree

如何使用字符串地址在 google maps API V2 android 中获取地理坐标?

Hbase geohash实现地理轨迹的空间搜索实现思路设计

Hbase geohash实现地理轨迹的空间搜索实现思路设计

Hbase geohash实现地理轨迹的空间搜索实现思路设计