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.db 的 PointField
来存储 [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 中的 LineString
和 MultiLineString
类 在内存中创建线和多线,并将它们分配给模型的字段:
>>> 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 进行测试。
如果我已经在文件(作为列表)或内存中或以 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.db 的 PointField
来存储 [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 中的 LineString
和 MultiLineString
类 在内存中创建线和多线,并将它们分配给模型的字段:
>>> 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 进行测试。