用于搜索地理坐标的数据库设计
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
+ Point
s 参与)。
问题 #2: 选择给定个人周围区域中的所有个人
(Contains()
+ Polygon
+ Point
s 参与)。
问题 #3: 选择指定多边形中的所有个体
(Contains()
+ Polygon
+ Point
s 参与)。
【讨论】:
【参考方案2】:我使用以下代码http://www.geodatasource.com/developers/php 克服了我的 PHP 应用程序中的前 2 个问题,那里还有一个 SQL 版本的解决方案。
基本上,您需要计算地球表面上弧的长度,使用三角函数来获得 2 个网格点之间的距离。
然后,您可以比较多个人与您的基地位置的距离,并消除所有距离超过 50 公里的动物,以使您的动物群在周边范围内。
您问题的第 3 部分需要一些更复杂的代数,这不是我已经解决的问题。
【讨论】:
以上是关于用于搜索地理坐标的数据库设计的主要内容,如果未能解决你的问题,请参考以下文章
如何使用字符串地址在 google maps API V2 android 中获取地理坐标?
Hbase geohash实现地理轨迹的空间搜索实现思路设计