使用MariaDB / MySql进行GeoDjango最近点查询

q7solyqu  于 2022-11-08  发布在  Mysql
关注(0)|答案(2)|浏览(146)

在我的Django项目中,我会使用MySQL和/或MariaDB。
我有一个包含纬度和经度的实体。
我必须实现一个搜索来查找所有(通过距离参数)离geoPoint最近的点。
也许我不得不使用GeoDjango,但我对MySQL和地理距离查询的兼容性有一些怀疑。特别是我读了这个documentation page和兼容性表(我没有看到MySQL的distance_lte:我必须用这个吗?)
使用MariaDB / MySQL和GeoDjango可以在我的项目中拥有这种类型的功能吗?
我可以有效地拥有这个功能吗?是否更喜欢使用其他DBMS,例如PostgreSQL?

fcy6dtqo

fcy6dtqo1#

更新MySQL 8+ handles long / lat directly。如果您要处理GPS数据,则需要使用Spatial Reference System SRID 4326(也称为WGS 84)。

MariaDB 10.3和10.6 * 没有 * SRID 4326,所以您得到的只是平面几何体。
要在GeoDjango中使用距离测量功能,您需要PostgreSQL或MySQL 8:早期的地理空间扩展(在5.7和更早的版本中)不支持纬度/长距离测量。(我的MySQL 5.7没有information_schema.ST_SPATIAL_REFERENCE_SYSTEMS或任何类似的东西。MariaDB 10.3和10.6没有SRID 4326。
如果你不喜欢GeoDjango,你可以使用MySQL。你需要做一些工作来提高你的查找效率。请看这里。http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/
如果您想使用地理空间,请参阅此处。http://www.plumislandmedia.net/mysql/using-mysqls-geospatial-extension-location-finder/

vdzxcuhz

vdzxcuhz2#

在MySQL/MariaDB中进行“查找最近的”的5种方法:
1.暴力--由于全表扫描,对于大列表非常慢

  1. INDEX(lat, lat), INDEX(lng, lat)--快了一个数量级
    1.空间索引(如果可用)
    1.分区--将lat转换为分区,从而提供更快的速度
    1.索引的Z顺序布局--速度与分区类似
    详细数据:Find Nearest
    如果需要的话,它包含一个等效于ST_DISTANCE_SPHERE()的函数。(是的,它更慢。)

相关问题