在我的Django项目中,我会使用MySQL和/或MariaDB。
我有一个包含纬度和经度的实体。
我必须实现一个搜索来查找所有(通过距离参数)离geoPoint最近的点。
也许我不得不使用GeoDjango,但我对MySQL和地理距离查询的兼容性有一些怀疑。特别是我读了这个documentation page和兼容性表(我没有看到MySQL的distance_lte
:我必须用这个吗?)
使用MariaDB / MySQL和GeoDjango可以在我的项目中拥有这种类型的功能吗?
我可以有效地拥有这个功能吗?是否更喜欢使用其他DBMS,例如PostgreSQL?
2条答案
按热度按时间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/
vdzxcuhz2#
在MySQL/MariaDB中进行“查找最近的”的5种方法:
1.暴力--由于全表扫描,对于大列表非常慢
INDEX(lat, lat), INDEX(lng, lat)
--快了一个数量级1.空间索引(如果可用)
1.分区--将lat转换为分区,从而提供更快的速度
1.索引的Z顺序布局--速度与分区类似
详细数据:Find Nearest
如果需要的话,它包含一个等效于
ST_DISTANCE_SPHERE()
的函数。(是的,它更慢。)