GeoDjango3.2查询附近牙医报no such function: lwgeom_version如何解决
错误原因
- 当前使用SQLite作为数据库,Django GIS的空间查询功能在SQLite上依赖SpatiaLite扩展,你使用的SpatiaLite版本未内置lwgeom相关组件,缺少
lwgeom_version函数,执行距离查询时触发报错。 - 代码存在隐藏逻辑错误:Django的
Point类参数顺序为经度在前、纬度在后,你代码中传入的是Point(latitude,longitude),参数顺序写反会导致查询结果完全错位。
修复方案
方案1:更换为PostgreSQL + PostGIS(生产环境推荐)
PostgreSQL搭配PostGIS是Django GIS功能兼容性最好、性能最高的方案,不存在SpatiaLite的组件缺失问题,操作步骤:
- 安装PostgreSQL数据库以及对应版本的PostGIS扩展
- 修改
settings.py中的数据库配置,使用PostGIS驱动:
DATABASES = { 'default': { 'ENGINE': 'django.contrib.gis.db.backends.postgis', 'NAME': '你的数据库名称', 'USER': '数据库用户名', 'PASSWORD': '数据库密码', 'HOST': '127.0.0.1', 'PORT': '5432', } }
- 重新执行数据库迁移,原有业务代码无需额外修改即可正常运行。
方案2:修复现有SpatiaLite配置(仅开发环境临时使用)
如果你需要继续使用SQLite作为开发库,可以按以下步骤操作:
- 安装带lwgeom支持的完整SpatiaLite版本:
- Linux环境执行命令:
sudo apt install libsqlite3-mod-spatialite - Windows环境下载对应系统位数、带lwgeom组件的预编译SpatiaLite包,替换Python环境中sqlite3加载的dll文件
- Linux环境执行命令:
- 在
settings.py中添加SpatiaLite加载配置:
# Linux环境 SPATIALITE_LIBRARY_PATH = 'mod_spatialite.so' # Windows环境填写你下载的dll文件完整路径 # SPATIALITE_LIBRARY_PATH = 'C:/xxx/mod_spatialite.dll'
- 修正View代码中
Point的参数顺序错误:
# 原错误写法 # user_location = Point(latitude,longitude,srid=4326) # 修正为经度在前、纬度在后 user_location = Point(longitude, latitude, srid=4326)
内容的提问来源于stack exchange,提问作者AmanD02
相关产品推荐
相关产品推荐

