You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 04:07:04