如何在 GeoDjango 中翻译多边形?
How to translate a polygon in GeoDjango?
我有一个 Place
模型,它有一个多边形字段:
from django.contrib.gis.db import models
class Place(models.Model):
area = models.PolygonField()
我想翻译此 Place
模型实例的 area
字段。
这是我现在的做法:
from django.contrib.gis.db.models.functions import Translate
place = Place.objects.get(pk=1)
place.area = Place.objects.filter(pk=place.pk).annotate(new_area=Translate('area', 0.001, 0.001)).first().new_area
place.save()
这看起来很老套。我认为应该有一种方法可以通过以下方式做到这一点:
place = Place.objects.get(pk=1)
place.area = Translate(place.area, 0.001, 0.001)
place.save()
但这会引发异常。
我应该使用一些库吗?哪一个适用于 GeoDjango 及其 models/fields?
更好的方法是什么?
注意 django.contrib.gis.db.models.functions
中的 "db"。没有 Python 函数,这些函数是 类(因此名称中的首字母大写)允许您访问数据库系统的空间函数(通常由空间数据库扩展提供,如 [= 的 spatialite) 50=]ite 或 PostGIS for PostgreSQL)。见 GeoDjango documentation
The functions documented on this page allow users to access geographic database functions to be used in annotations, aggregations, or filters in Django.
(强调我的。)
即这些只能用于查询,作为卸载到数据库的空间计算工作。
那么除了多次查询之外,您还能做什么?
update
查询
如果您直接在 SQL 中执行此操作,您可能会编写一个 UPDATE
查询。 Django ORM 允许您从 Django 执行相同的操作,使用 update()
method.
它可能看起来像这样(未经测试):
Place.objects.filter(pk=1).update(area=Translate('area', 0.001, 0.001))
如果您无论如何都在使用 GeoDjango,这可能是首选方式。
外部(Python)库
正如您所建议的,您可以使用外部库代替 GeoDjango 的 Translate
,例如shapely.affinity.translate
from the shapely
library。但是,我怀疑它会接受 GeoDjango 的 django.contrib.gis.geos.GEOSGeometry
作为输入,因此您可能必须通过 GeoJSON 或 WKT 来回转换。
如果您需要空间计算独立于底层数据库系统,请使用此方法。
我有一个 Place
模型,它有一个多边形字段:
from django.contrib.gis.db import models
class Place(models.Model):
area = models.PolygonField()
我想翻译此 Place
模型实例的 area
字段。
这是我现在的做法:
from django.contrib.gis.db.models.functions import Translate
place = Place.objects.get(pk=1)
place.area = Place.objects.filter(pk=place.pk).annotate(new_area=Translate('area', 0.001, 0.001)).first().new_area
place.save()
这看起来很老套。我认为应该有一种方法可以通过以下方式做到这一点:
place = Place.objects.get(pk=1)
place.area = Translate(place.area, 0.001, 0.001)
place.save()
但这会引发异常。
我应该使用一些库吗?哪一个适用于 GeoDjango 及其 models/fields?
更好的方法是什么?
注意 django.contrib.gis.db.models.functions
中的 "db"。没有 Python 函数,这些函数是 类(因此名称中的首字母大写)允许您访问数据库系统的空间函数(通常由空间数据库扩展提供,如 [= 的 spatialite) 50=]ite 或 PostGIS for PostgreSQL)。见 GeoDjango documentation
The functions documented on this page allow users to access geographic database functions to be used in annotations, aggregations, or filters in Django.
(强调我的。)
即这些只能用于查询,作为卸载到数据库的空间计算工作。
那么除了多次查询之外,您还能做什么?
update
查询
如果您直接在 SQL 中执行此操作,您可能会编写一个 UPDATE
查询。 Django ORM 允许您从 Django 执行相同的操作,使用 update()
method.
它可能看起来像这样(未经测试):
Place.objects.filter(pk=1).update(area=Translate('area', 0.001, 0.001))
如果您无论如何都在使用 GeoDjango,这可能是首选方式。
外部(Python)库
正如您所建议的,您可以使用外部库代替 GeoDjango 的 Translate
,例如shapely.affinity.translate
from the shapely
library。但是,我怀疑它会接受 GeoDjango 的 django.contrib.gis.geos.GEOSGeometry
作为输入,因此您可能必须通过 GeoJSON 或 WKT 来回转换。
如果您需要空间计算独立于底层数据库系统,请使用此方法。