GeoDjango设置GeometryField的SRID=5179触发NotImplementedError怎么解决?
解决Django GeometryField SRID 5179 转换函数报错问题
这个问题我之前碰到过类似的情况,核心原因是你的Django GIS环境要么没正确配置后端,要么缺少对韩国坐标系SRID 5179的转换支持,咱们一步步来排查解决:
1. 先确认数据库后端是不是用了GIS专用的
如果你用的是PostgreSQL,绝对不能用普通的django.db.backends.postgresql后端,必须切换到PostGIS专用的引擎。打开你的settings.py,检查数据库配置:
DATABASES = { 'default': { 'ENGINE': 'django.contrib.gis.db.backends.postgis', # 这里必须是postgis,不是普通postgres 'NAME': '你的数据库名', 'USER': '你的数据库用户', 'PASSWORD': '你的密码', 'HOST': 'localhost', 'PORT': '5432', } }
要是之前用的是普通引擎,切换后记得先备份数据,再重新跑一遍迁移。
2. 确保PostGIS扩展已经装了且启用了
PostgreSQL本身不带GIS功能,得靠PostGIS扩展。先确认服务器上装了PostGIS(比如Ubuntu系统可以用apt-get install postgis postgresql-14-postgis-3,版本号根据你的PostgreSQL来),然后进数据库执行这条SQL启用扩展:
CREATE EXTENSION IF NOT EXISTS postgis;
3. 更新PROJ和GEOS库到最新版
SRID 5179是韩国的国家平面坐标系,旧版本的PROJ库可能没收录这个坐标系的定义。你可以先跑proj --version看看当前版本,要是低于8.x的话,建议更新到最新稳定版(不同系统更新方式不一样,比如用apt、brew或者源码编译都行)。同时GEOS库也尽量更到最新,它是Django GIS处理几何运算的核心依赖。
4. 手动给PostGIS加SRID 5179的定义(如果更新库后还是不行)
要是更新PROJ后还是不支持,那可以手动在PostGIS里插入这个SRID的定义,执行下面的SQL就行:
INSERT INTO spatial_ref_sys (srid, auth_name, auth_srid, proj4text, srtext) VALUES (5179, 'EPSG', 5179, '+proj=tmerc +lat_0=38 +lon_0=127.5 +k=0.9996 +x_0=1000000 +y_0=2000000 +ellps=GRS80 +units=m +no_defs', 'PROJCS["Korea 2000 / Central Belt",GEOGCS["Korea 2000",DATUM["Geocentric_Datum_of_Korea_2000",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6614"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4617"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",38],PARAMETER["central_meridian",127.5],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",1000000],PARAMETER["false_northing",2000000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","5179"]]');
执行完这个,PostGIS就能识别5179这个SRID了。
5. 最后验证一下转换是否正常
打开Django shell,跑几行代码测试:
from django.contrib.gis.geos import Point # 先创建一个WGS84(4326)的点 p = Point(127.0, 37.0, srid=4326) # 转换到5179 p.transform(5179) # 如果没报错,说明问题解决了 print(p)
额外提醒
- 别忘了
INSTALLED_APPS里要加django.contrib.gis,不然Django的GIS功能根本开不了 - 要是你用的是MySQL,它的GIS支持很有限,建议直接换成PostgreSQL+PostGIS,这是Django GIS最推荐的组合
内容的提问来源于stack exchange,提问作者H22
相关产品推荐
相关产品推荐

