jsk*_*dd3 10 mysql sql geospatial latitude-longitude
我在MySQL数据库中有一个名为'flags'的表,有400,000行.该表由代表英国各地不同位置的地理空间点组成.
我正在创建的应用程序使用谷歌地图.在地图上有一个按钮,可以切换地图上的标志可见性.现在我的工作是创建一个API,当传递边界框时,返回边界框内的所有标志(以便它们可以显示在地图上).
传递的参数是东北纬度/经度和视口当前位置的西南纬度/经度.
我现在需要执行一个SQL查询,它将返回这组坐标(视口)内的所有地理空间点.
理想情况下,需要优化解决方案,因为要搜索的行数很多.但是,应用程序会强制您在用户显示标志之前放大到某个级别.
旗帜表:
示例行:
1 | [几何 - 25B] | Tenacy AB
也可以使用AsText(坐标)将坐标字段转换为文字点.但是,X和Y函数会为您执行此操作.
坐标列是数据类型:POINT
我知道要获得一个点的纬度/经度,你可以使用X和Y函数.例如,可以像这样检索点的纬度:X(坐标)
DBMS:MySQL
DBMS版本:5.6.14
O. *_*nes 25
据推测,geometry列中POINT数据中的x和y项目是纬度和经度.
要在MySQL中有效地进行查找,您需要做一些事情.
ALTER TABLE flags ADD SPATIAL INDEX (coordinates)假设您的纬度/长方框是一个以温彻斯特大教堂为中心的一度矩形(51.0606,-1.3131).你需要一个围绕这一点的边界框.此MySQL查询将为跨越该边界框的对齐线生成LINESTRING(文本).
SELECT
CONCAT('LINESTRING(',
latitude-0.5,' ',longitude-0.5,
',',
latitude+0.5 ,' ',longitude +0.5,
')') AS box
FROM (
SELECT 51.0606 AS latitude, -1.3131 AS longitude
) AS coord
Run Code Online (Sandbox Code Playgroud)
查询得到你:
LINESTRING(50.5606 -1.8131,51.5606 -0.8131)
Run Code Online (Sandbox Code Playgroud)
您还可以在宿主语言中使用字符串处理来提供类似的文本字符串.你需要的格式是这个.
LINESTRING(lat1 long1, lat2 long2)
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用它来搜索空间表,如下所示:
SELECT whatever, whatever
FROM flags
WHERE MBRContains(
GeomFromText( 'LINESTRING(50.5606 -1.8131,51.5606 -0.8131)' ),
flags.coordinates)
Run Code Online (Sandbox Code Playgroud)
这将利用空间索引并找到flags其坐标的每一行都位于该对角线的边界框内.
这是一些文档.
如果您的flags表包含少于几十万行,您可能会发现具有纬度和经度列(FLOAT数据类型,已编制索引)的普通表(不是空间表)也可以执行,并且更易于开发和调试.
我写过关于这种技术的教程. http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/
| 归档时间: |
|
| 查看次数: |
10236 次 |
| 最近记录: |