【问题标题】:How to translate a polygon in GeoDjango?如何在 GeoDjango 中翻译多边形?
【发布时间】:2018-07-14 07:43:43
【问题描述】:

我有一个 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()

这看起来很hacky。我认为应该有一种方法可以通过以下方式做到这一点:

place = Place.objects.get(pk=1)
place.area = Translate(place.area, 0.001, 0.001)
place.save()

但这会引发异常。

我应该使用一些库吗?哪一个适用于 GeoDjango 及其模型/字段?

有什么更好的方法?

【问题讨论】:

    标签: python django gis polygon geodjango


    【解决方案1】:

    注意django.contrib.gis.db.models.functions 中的“db”。没有 Python 函数,这些类(因此名称中的首字母大写)允许您访问数据库系统的空间函数(通常由空间数据库扩展提供,如 SQLite 的 spatialite 或 PostGIS for PostgreSQL)。见GeoDjango documentation

    本页记录的函数允许用户访问地理数据库函数,以便在 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 来回转换。

    如果您需要空间计算独立于底层数据库系统,请使用此方法。

    【讨论】:

    • 我应该更好地表达我的问题。 Db 函数只是一个例子 :) 谢谢!
    猜你喜欢
    • 2020-02-23
    • 2012-11-01
    • 2016-09-03
    • 2016-09-06
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2013-11-22
    相关资源
    最近更新 更多