GeoDjango 从 json 或点保存数据

GeoDjango save data from json or points

如果我已经在文件(作为列表)或内存中或以 json 格式存在现有的 MultiString 坐标, 我如何覆盖保存功能来保存这些点而不是用户在地图上创建对象?或者更准确地说,我如何将这些点加载到模型和数据库中?

坐标在memory/file

[[36.66678428649903, -1.5474249907643578], [36.670904159545906, -1.542620219636788], [36.66635513305665,-1.5353272427374922],[36.662406921386726, -1.5403894293513378]]

models.py

class LogsUpload(models.Model):
    name = models.CharField(max_length=240)
    geom  = gis_models.MultiLineStringField(blank=True, null=True)

如何使用坐标并将其保存在几何字段中?

使用 gis.dbPointField 来存储 [lat, long] 数据。

from django.contrib.gis.db import models as gis_model

geom = gis_model.PointField(null=True, spatial_index=True, geography=True)

PointField 接受 GEOSGeometry 对象,因此您可以像这样创建数据。

import json
from django.contrib.gis.geos import GEOSGeometry

data_coordinates = [[36.66678428649903, -1.5474249907643578], [36.670904159545906, -1.542620219636788], [36.66635513305665,-1.5353272427374922],[36.662406921386726, -1.5403894293513378]]

for coordinate in data_coordinates:
    point = {
        "type": "Point",
        "coordinates": coordinate 
    }
    
    LogsUpload.objects.create(name="your location name", geom=GEOSGeometry(json.dumps(point)))

Read more: Storing, querying & serializing location data with Django using PostGIS

更新

如果你想将它们全部保存在LogsUpload模型的一个对象中,你可以简单地使用django.db.models

ArrayField or JSONField

使用 GEOS API 中的 LineStringMultiLineString 类 在内存中创建线和多线,并将它们分配给模型的字段:

>>> from django.contrib.gis.geos import LineString, MultiLineString
>>> DATA = [[36.66678428649903, -1.5474249907643578], [36.670904159545906, -1.542620219636788], [36.66635513305665,-1.5353272427374922],[36.662406921386726, -1.5403894293513378]]
>>> line = LineString(DATA)
>>> line
<LineString object at 0x7f96538f49a0>
>>> line.length
0.02134446840090856
>>> line.geojson
'{ "type": "LineString", "coordinates": [ [ 36.666784286499031, -1.547424990764358 ], [ 36.670904159545906, -1.542620219636788 ], [ 36.666355133056648, -1.535327242737492 ], [ 36.662406921386726, -1.540389429351338 ] ] }'
>>> multi_line = MultiLineString(line)
>>> multi_line
<MultiLineString object at 0x7f96536ccbc0>
>>> multi_line[0]
<LineString object at 0x7f964187b3c8>
>>> multi_line.length
0.02134446840090856
>>> multi_line.geojson
'{ "type": "MultiLineString", "coordinates": [ [ [ 36.666784286499031, -1.547424990764358 ], [ 36.670904159545906, -1.542620219636788 ], [ 36.666355133056648, -1.535327242737492 ], [ 36.662406921386726, -1.540389429351338 ] ] ] }'

>>> from myapp.models import LogsUpload
>>> o = LogsUpload(name="foo", geom=multi_line)
>>> o.full_clean()
>>> o.save()

已使用 Django 2.0 和 PostGIS 进行测试。