【问题标题】:Find how many (googlemap) polygons near x distance of a point查找点的 x 距离附近有多少个(googlemap)多边形
【发布时间】:2011-09-18 11:54:24
【问题描述】:

我正在开发一个 MYSQL/PHP 系统,其中有以下内容:

-- 一组经纬度,以(lat,lng) 形式存储为文本格式:(lat1,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 的记录,这与多边形的边界相距甚远。谁能指导一下?

【问题讨论】:

  • 请注意,地球上的“多边形”并不是真正形成多边形,而是将地球分为两部分。哪个是“内”,哪个是“外”?如果您将 Lat-Long 视为笛卡尔坐标系,如果您的多边形覆盖 N 极或 S 极会发生什么?

标签: mysql google-maps geospatial


【解决方案1】:

我不确定您是否要计算到多边形最近角、多边形边界或它的某个名义中心点的距离。无论哪种方式,我认为解决此问题的数学方法是使用毕达哥拉斯定理来计算点的接近度。

如果你有 lat1,lng1 和 lat2,lng2 以米表示,我相信它们之间的距离是:

SQRT(POW(ABS(lat1 - lat2),2) + POW(ABS(lng1 - lng2),2))

使用与此类似的算法,您需要决定是否要将已知的纬度/经度与多边形的单个中心点或角点进行比较(工作量的三倍!)。

MySQL 确实有一个地理空间扩展,值得一看。可惜我没有这方面的经验。

【讨论】:

  • 感谢您的评论-我仍在等待可能遇到此问题的具有 Mysql 地理空间功能的人。再次感谢! :)
【解决方案2】:

好的,这样做 - 并且有效 - 可能会帮助某人:

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 可能是更好的选择。

【讨论】:

    猜你喜欢
    • 2021-07-20
    • 2021-12-06
    • 2020-05-10
    • 2016-01-23
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 2010-10-28
    相关资源
    最近更新 更多