【问题标题】:How transform geometry column using GeoDjango如何使用 GeoDjango 转换几何列
【发布时间】:2014-03-27 16:36:08
【问题描述】:

我正在尝试在 django 中转换几何列,这是我的模型

class Network(models.Model):
    name = models.CharField(max_length=50, blank=True)
    alias = models.CharField(max_length=100, blank=True)
    geometry = models.GeometryField(srid=3857, null=True, blank=True)
    bbox = models.GeometryField(srid=3857, null=True, blank=True)
    objects = models.GeoManager()

    class Meta:
        db_table = u'tbl_network'

    def __unicode__(self):
        return '%s' % self.name

我正在尝试转换 bbox 列,但 GeoQuerySet 会自动转换 geometry

Network.objects.transform(srid=3857).values('geometry','bbox')

上述django查询的SQL查询输出

  SELECT ST_Transform("tbl_network"."geometry", 3857), "tbl_network"."bbox" FROM "tbl_network"

所以我尝试了不同的方式,现在我排除了 geometry

 Network.objects.transform(srid=3857).values('bbox')

上述django查询的SQL查询输出

 SELECT "tbl_network"."bbox" FROM "tbl_network"

现在GeoQuerySet 完全忽略了变换函数。

所以我的问题是:如何转换模型的特定列?

我收到了这个 django 论坛的回复,但我不明白多个几何列的问题是什么

“我知道第一个查询有效,第二个查询失败 转换。我认为这个问题可能与你有 2 同一个 Postgis 表中的几何列。

它们都列在 Postgis 的 geometry_columns 视图中吗? 通常只有 1 可以是默认值。在这种情况下几何,所以 Geodjango/Postgis 将其识别为空间列。但是当它 get's to bbox 它无法识别它并且不知道 FROM 是什么 (当前) srid 是所以转换不起作用。

一种选择是返回数据,然后在您完成后对其进行转换 将空间对象转换为 python 变量。 "

谁能解释一下这个回复?

【问题讨论】:

    标签: django geospatial django-queryset geodjango


    【解决方案1】:

    在您的模型中,您有两个几何字段:geometrybbox。几何字段的大多数方法(例如变换)默认使用其中一个字段。调用该方法将只影响该特定字段,第二个几何字段将保持不变。

    要转换两个几何图形,您必须调用 transform 方法两次,每个字段一次。您可以使用field_name 参数指定字段,如django docs here 中所述。

    使用您的模型,您可以执行以下操作:

    # Get network models
    queryset = Network.objects.all()
    
    # Transform geometry field
    queryset = queryset.transform(3857, field_name='geometry')
    
    # Transform bbox field
    queryset = queryset.transform(3857, field_name='bbox')
    

    另外,通过阅读您的示例,我想知道您使用的 bbox 字段是否代表 geometry 字段的边界框。如果是这种情况,您将存储冗余信息,您可以删除 bbox 字段。只需使用GEOSGEometry extent property 获取几何体的边界框,然后您也只需转换主要几何体:

    # Network model with only one geometry field
    class Network(models.Model):
        name = models.CharField(max_length=50, blank=True)
        alias = models.CharField(max_length=100, blank=True)
        geometry = models.GeometryField(srid=3857, null=True, blank=True)
        objects = models.GeoManager()
    

    然后

    # Transform geometry field (which is the default if there is only one geom field)
    queryset = Network.objects.all().tansform(3857)
    
    # Bbox coordinates of first geometry in new coordinates
    ntwork = queryset[0]
    bbox = ntwork.geometry.extent
    

    【讨论】:

      猜你喜欢
      • 2013-08-24
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      • 2016-02-16
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      相关资源
      最近更新 更多