如何使用具有球形几何形状的 MySQL 地理空间扩展

Posted

技术标签:

【中文标题】如何使用具有球形几何形状的 MySQL 地理空间扩展【英文标题】:How to use MySQL geospatial extensions with spherical geometries 【发布时间】:2011-06-05 20:31:47 【问题描述】:

我想在 mysql 数据库中存储数千个纬度/经度点。我成功地设置了表格并使用地理空间扩展添加了数据,其中列“coord”是一个点(lat,lng)。

问题:

我想快速找到最接近纬度“X”度和经度“Y”度的“N”个条目。由于尚未实现 Distance() 函数,我使用 GLength() 函数计算 (X,Y) 与每个条目之间的距离,按距离升序排序,并限制为“N”个结果。问题是这不是用球面几何计算最短距离。这意味着如果 Y = 179.9 度,则最近条目的列表将仅包括从 179.9 开始并减少的经度,即使存在更接近的条目且经度从 -179.9 增加。

在数据库中处理球面几何时,通常如何处理经度的不连续性?必须有一个简单的解决方案,但我一定只是在寻找错误的东西,因为我没有发现任何有用的东西。

我是否应该忘记 GLength() 函数并创建自己的函数来计算角距?如果我这样做,它仍然会很快并利用地理空间扩展吗?

谢谢!

乔希


更新:

This 正是我上面所描述的。但是,它仅适用于 SQL Server。显然 SQL Server 有 Geometry Geography 数据类型。地理完全符合我的需要。 MySQL中是否有类似的东西?

【问题讨论】:

【参考方案1】:

在数据库中处理球面几何时,通常如何处理经度的不连续性?

没有多少人为此使用 MySQL,因为它的地理空间扩展并不完全符合要求。

来自文档: “All calculations are done assuming Euclidean (planar) geometry.”

解决方法通常是roll your own。

或者,您可以伪造它 - 如果您的距离小于 500 英里左右,那么您可以将您的纬度和经度视为直角坐标,并使用欧几里得距离公式 (sqrt(a^2 + b^2))。

【讨论】:

感谢您的回答。人们通常为此使用什么?我看到了您不久前链接的页面,但这似乎只能解决查找最接近给定纬度/经度的点的问题。它不能解决请求一个区域内的所有点的问题。使用自己的滚动方法将不允许您请求从 178 lon 到 -178 lon 以及从 30 lat 到 35 lat(矩形区域)的所有点。 我使用PostGIS。还有几个可以使用的开源库 - 查看osgeo。但是,如果您所做的只是相对距离计算,那可能有点过头了。

以上是关于如何使用具有球形几何形状的 MySQL 地理空间扩展的主要内容,如果未能解决你的问题,请参考以下文章

将有效的几何形状保存到 Sql Server 2008 地理列中

ArcGIS如何获取地理要素的几何属性

地理空间数据介绍

地理空间数据介绍

地理空间数据介绍

BZOJ 1013[JSOI2008]球形空间产生器sphere