我正在开发一个MYSQL / PHP系统,我有以下内容:
- 以(lat,lng1)形式存储的一组纬度,经度(lat,lng1)#(lat2,lng2)#(lat3,lng3)等基本上是绘制的多边形通过存储在数据库中的googlemap实例。
- 存储在字段中的表 - 点的坐标P(plat,plng),它基本上是设备驻留的点
我需要弄清楚第一张表中有多少多边形在距离P点X公里的范围内,主要是使用MYSQL。
我已经遇到过相当多的谷歌地图库,但我打算用最快的方法解决这个问题 - 我假设是通过MYSQL查询。
请有人请说明一下这个问题吗?
到目前为止,我已经就地理空间查询的一些例子进行了咨询 - 并提出了这个问题:
SELECT user_id, latitude, longitude,
GeomFromText( "POINT(CONCAT_WS(' ',latitude,longitude))" ) AS point,
Contains( GeomFromText( 'POLYGON(-26.167918065075458 28.10680389404297,
- 26.187020810321858 28.091354370117188, -26.199805575765794 28.125,-26.181937320958628 28.150405883789062, -26.160676690299308 28.13220977783203, -26.167918065075458 28.10680389404297)' ) ,
GEOMFromText( "POINT(CONCAT_WS(' ',latitude,longitude))" ) )
FROM user_location
但问题是它显示了lat的记录:-26.136230,long:28.338850,它远离多边形的边界。有人可以指导吗?
答案 0 :(得分:2)
我不确定你是否想要计算到多边形最近一个角的距离,多边形的边界或它的一些名义中心点。无论哪种方式,我认为对此的数学解决方案是使用毕达哥拉斯定理来计算点的接近度。
如果你有lat1,lng1和lat2,lng2用米表示,我相信它们之间的距离是:
SQRT(POW(ABS(lat1 - lat2),2) + POW(ABS(lng1 - lng2),2))
使用与此类似的算法,您需要决定是否要将已知的纬度/经度与多边形的单个中心点或角点(工作量的三倍)进行比较。
MySQL确实有一个地理空间扩展,值得一看。不幸的是,我没有经验。
答案 1 :(得分:0)
好的,这样做 - 它的确有效 - 可能对某人有所帮助:
SELECT user_id,latitude,longitude,
Contains(
PolyFromText( 'POLYGON((-26.167918065075458 28.10680389404297, -26.187020810321858 28.091354370117188, -26.199805575765794 28.125,-26.181937320958628 28.150405883789062, -26.160676690299308 28.13220977783203, -26.167918065075458 28.10680389404297))' ),
PointFromText(concat("POINT(",latitude," ",longitude,")"))
) as contains
FROM user_location
=====
虽然我同意专家的观点,即PostGIS可能是更好的选择。