【问题标题】:Get all the users within radius from MySQL with Spatial Point使用空间点从 MySQL 获取半径内的所有用户
【发布时间】:2020-04-03 19:24:42
【问题描述】:

我的本​​地服务器上有一个 MySQL 表。该表包括每个用户的纬度、经度和 POINT(latitude, longitude)。我试图让距离中心 10 公里内的所有 id 用户。

我不想使用纬度和经度,而只使用点。但我不知道该怎么做。在POINT中也听说过SRID要修改,但是不太明白

这是我的桌子

#   Name        Type
1   lat         decimal(10,8)   
2   lng         decimal(11,8)       
3   latlng      point
4   id_user     int(10) 

索引

Keyname Type    Unique  Packed  Column  Cardinality Collation   Null    Comment
latlng  SPATIAL No      No      latlng (32)     A   No  

我如何在 PHP 中做到这一点?

仅供参考,使用点和纬度/经度之间的最佳选择是什么?

【问题讨论】:

    标签: php mysql angular geolocation leaflet


    【解决方案1】:

    我是 postgres/postgis 用户,但他们有等价物。如果您能够将列添加到表中,您应该将纬度/经度转换为 Point() 对象,可能使用 ST_PointFromText 之类的东西,然后您可以使用 ST_Distance() 将它们相互比较 参考:https://dev.mysql.com/doc/refman/8.0/en/gis-data-formats.html

    编辑:显然 mySql 没有更高效的 ST_DWithin()(请参阅:Whats the equivalent of ST_DWithin (PostGIS - PostgreSQL) for MySQL?),因此您可能坚持使用 ST_Distance()。

    SRID 4326 是这些类型的纬度/经度坐标系中的一种常见的。 参考:https://desktop.arcgis.com/en/arcmap/10.3/manage-data/using-sql-with-gdbs/what-is-an-srid.htm

    【讨论】:

    • 感谢您的回复。所以我需要在 latlng 之外添加一个新列并将其放入 ST_PointFromText ('POINT(lat long)', 4326) ?
    • 这就是我要采取的方法。当所有行都有这些几何列时,进行比较等会容易得多。纬度/经度列变得多余......您可以保留它们,但如果纬度/经度更改(通过触发器),您确实希望确保点列保持同步。或者,如果需要,只需将 Point 转换回 lat/lon 以进行显示。
    猜你喜欢
    • 2012-04-12
    • 2015-03-17
    • 1970-01-01
    • 2017-03-17
    • 2015-08-23
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多