Django:将带注释和聚合的查询集序列化为 GeoJSON
Django: serialize an annotated and aggregated queryset to GeoJSON
我正在尝试使用 Django ORM(或使用 Django 的任何其他方式)来执行此查询 (PostgreSQL) 并将结果以 GeoJSON 格式发送回前端。
我正在使用 Django 2.2.15
SELECT string_agg(name, '; '), geom
FROM appname_gis_observation
where sp_order = 'order1'
GROUP BY geom;
模型看起来像这样 (models.py)
from django.db import models
from django.contrib.gis.db import models
class gis_observation(models.Model):
name = models.CharField(max_length=100,null=True)
sp_order = models.CharField(max_length=100,null=True)
geom = models.MultiPointField(srid=4326)
所以我认为这可行 (views.py)
from django.core.serializers import serialize
from .models import *
from django.shortcuts import render
from django.contrib.postgres.aggregates.general import StringAgg
def show_observation(request):
results = gis_observation.objects.values('geom').filter(sp_order='order1').annotate(newname=StringAgg('name', delimiter='; '))
data_geojson = serialize('geojson', results, geometry_field='geom', fields=('newname',))
return render(request, "visualize.html", {"obs" : data_geojson})
ORM 查询在 Django shell 中工作正常,但 Django 在 serialize 步骤抱怨:AttributeError: 'dict' object has no attribute '_meta'
.
即使 serialize 步骤有效,我怀疑它会跳过我的注释字段(通过阅读其他帖子)
显然我不是唯一遇到同样问题的人,但我找不到解决方案。
这是我想到的解决方案。坦率地说,我很乐意接受另一个答案,所以仍然欢迎任何建议!
最后,我通过遍历结果集构建了一个 Geojson 数组。我想我也可以选择游标 sql 查询,然后完全跳过 orm api。
queryset = gis_species_observation.objects.values('geom').filter(sp_order='order1').annotate(name=StringAgg('name', delimiter='; '))
mydict = []
results = list(queryset)
for result in results:
rec = {}
rec["type"] = "Feature"
rec["geometry"] = json.loads(result["geom"].geojson)
rec["properties"] = {"name":result["name"]}
mydict.append(rec)
data_geojson = json.dumps(mydict)
return render(request, "visualize_romania.html", {"mynames" :data_geojson})
我正在尝试使用 Django ORM(或使用 Django 的任何其他方式)来执行此查询 (PostgreSQL) 并将结果以 GeoJSON 格式发送回前端。 我正在使用 Django 2.2.15
SELECT string_agg(name, '; '), geom
FROM appname_gis_observation
where sp_order = 'order1'
GROUP BY geom;
模型看起来像这样 (models.py)
from django.db import models
from django.contrib.gis.db import models
class gis_observation(models.Model):
name = models.CharField(max_length=100,null=True)
sp_order = models.CharField(max_length=100,null=True)
geom = models.MultiPointField(srid=4326)
所以我认为这可行 (views.py)
from django.core.serializers import serialize
from .models import *
from django.shortcuts import render
from django.contrib.postgres.aggregates.general import StringAgg
def show_observation(request):
results = gis_observation.objects.values('geom').filter(sp_order='order1').annotate(newname=StringAgg('name', delimiter='; '))
data_geojson = serialize('geojson', results, geometry_field='geom', fields=('newname',))
return render(request, "visualize.html", {"obs" : data_geojson})
ORM 查询在 Django shell 中工作正常,但 Django 在 serialize 步骤抱怨:AttributeError: 'dict' object has no attribute '_meta'
.
即使 serialize 步骤有效,我怀疑它会跳过我的注释字段(通过阅读其他帖子)
显然我不是唯一遇到同样问题的人,但我找不到解决方案。
这是我想到的解决方案。坦率地说,我很乐意接受另一个答案,所以仍然欢迎任何建议! 最后,我通过遍历结果集构建了一个 Geojson 数组。我想我也可以选择游标 sql 查询,然后完全跳过 orm api。
queryset = gis_species_observation.objects.values('geom').filter(sp_order='order1').annotate(name=StringAgg('name', delimiter='; '))
mydict = []
results = list(queryset)
for result in results:
rec = {}
rec["type"] = "Feature"
rec["geometry"] = json.loads(result["geom"].geojson)
rec["properties"] = {"name":result["name"]}
mydict.append(rec)
data_geojson = json.dumps(mydict)
return render(request, "visualize_romania.html", {"mynames" :data_geojson})