代码之家  ›  专栏  ›  技术社区  ›  Jahongir Rahmonov

如何在geodjango中转换多边形?

  •  2
  • Jahongir Rahmonov  · 技术社区  · 7 年前

    我有一个 Place 具有多边形字段的模型:

    from django.contrib.gis.db import models
    
    class Place(models.Model):
        area = models.PolygonField()
    

    我想翻译 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及其模型/字段配合得好?

    最好的办法是什么?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Luc M    6 年前

    注意“db” django.contrib.gis.db.models.functions 是的。没有python函数,这些类(因此名称中的首字母大写)允许您访问数据库系统的空间函数(通常由空间数据库扩展提供,如sqlite的spatialite或postgresql的postgis)。见 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 是的。但是,我怀疑它会接受吉德扬戈的 django.contrib.gis.geos.GEOSGeometry 作为输入,因此您可能需要通过geojson或wkt来回转换。

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