GeoJSON序列化返回null geometry问题求助
问题:GeoDjango序列化GeoJSON时Geometry始终为Null
我遇到了一个问题,和某Stack Overflow问题情况一致,尽管该问题据称在Django 1.9已修复,我怀疑是自己操作有误。
序列化代码尝试
我用以下代码序列化GeoDjango数据:
homes = serialize( "geojson", Home.objects.all(), geometry_field="point", fields=["address_point"], )
序列化结果
打印结果显示geometry为null:
{ "type":"FeatureCollection", "crs":{ "type":"name", "properties":{ "name":"EPSG:4326" } }, "features":[ { "type":"Feature", "id":1, "properties":{ "address_point":"SRID=4326;POINT (15.57385209377286 7.776164310995906)" }, "geometry":null } ] }
django-geojson使用问题
另外,我尝试在JavaScript中用django-geojson访问数据,控制台打印结果为null,应该和上面的问题相关:
{% load geojson_tags %} var homes = {{ homes|geojsonfeature|safe }}; console.log(homes) // null
环境依赖(pip freeze)
asgiref==3.8.1 black==24.4.2 certifi==2024.6.2 charset-normalizer==3.3.2 click==8.1.7 Django==5.0.6 django-countries-plus==2.2.0 django-environ==0.11.2 django-geojson==4.1.0 django-languages-plus==2.1.1 django-safedelete==1.4.0 idna==3.7 isort==5.13.2 mypy-extensions==1.0.0 packaging==24.1 pathspec==0.12.1 pillow==10.3.0 platformdirs==4.2.2 psycopg2-binary==2.9.9 requests==2.32.3 setuptools==69.5.1 sqlparse==0.5.0 urllib3==2.2.2 wheel==0.43.0
模型代码
from django.contrib.auth.models import User from django.contrib.gis.db import models as gis_models from django.contrib.gis.geos import Point from django.db import models # 带created_at和deleted_at的基础模型 from WebApp.models.base_model import BaseModel class Home(BaseModel): user = models.ForeignKey(User, on_delete=models.DO_NOTHING) address = models.CharField(max_length=256) address_point = gis_models.PointField(srid=4326, default=Point(0, 0)) description = models.TextField()
解决建议
1. 修正序列化参数错误
你的serialize调用里geometry_field参数填的是"point",但模型里的几何字段实际叫address_point,这是核心问题。修改代码如下:
homes = serialize( "geojson", Home.objects.all(), geometry_field="address_point", # 改为实际字段名 # 注意:fields里不需要包含geometry字段,它会自动放到geometry属性中 fields=["address", "description"], # 按需添加其他非几何字段 )
2. django-geojson用法修正
如果用django-geojson的geojsonfeature过滤器,需要确保传入的是查询集而非序列化后的字符串。正确做法是在视图中传递查询集到模板:
# 视图代码 from django.shortcuts import render from .models import Home def home_map(request): return render(request, 'map.html', {'homes': Home.objects.all()})
然后模板中:
{% load geojson_tags %} var homes = {{ homes|geojsonfeature:"address_point"|safe }}; console.log(homes);
若模型只有一个几何字段,可省略字段名参数。
3. 验证数据有效性
检查数据库中address_point字段是否存储了有效Point数据,而非默认的(0,0)。可在Django Shell中验证:
from .models import Home home = Home.objects.first() print(home.address_point) print(home.address_point.geojson)
若输出有效GeoJSON,说明数据无问题,问题出在序列化配置。
4. 检查GeoDjango基础配置
确保以下配置正确:
settings.py中已添加django.contrib.gis到INSTALLED_APPS- 数据库引擎配置为
django.contrib.gis.db.backends.postgis - 已正确安装PostGIS扩展
内容的提问来源于stack exchange,提问作者Shmuelt
相关产品推荐
相关产品推荐

