Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用GeoDjango变换几何体列_Django_Geospatial_Django Queryset_Geodjango - Fatal编程技术网

如何使用GeoDjango变换几何体列

如何使用GeoDjango变换几何体列,django,geospatial,django-queryset,geodjango,Django,Geospatial,Django Queryset,Geodjango,我试图在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 = mod

我试图在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
会自动转换几何体

Network.objects.transform(srid=3857).values('geometry','bbox')
以上django查询的SQL查询输出

  SELECT ST_Transform("tbl_network"."geometry", 3857), "tbl_network"."bbox" FROM "tbl_network"
 SELECT "tbl_network"."bbox" FROM "tbl_network"
所以我尝试了不同的方法,现在我排除了几何体

 Network.objects.transform(srid=3857).values('bbox')
以上django查询的SQL查询输出

  SELECT ST_Transform("tbl_network"."geometry", 3857), "tbl_network"."bbox" FROM "tbl_network"
 SELECT "tbl_network"."bbox" FROM "tbl_network"
现在
GeoQuerySet
完全忽略转换函数

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

我从这个django论坛得到了回复,但我无法理解多重几何列的问题所在

“我明白了,第一个查询是有效的,第二个查询没有成功 转变。我认为问题可能与你有2 同一Postgis表中的几何图形列

它们都列在Postgis的geometry_columns视图中。 通常只有1可以作为默认值。在这种情况下,几何体 Geodjango/Postgis将其识别为一个空间柱 让它去bbox它不认识它也不知道它是从哪里来的 (当前)srid为,因此转换无法工作

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


有人能解释这个回答吗?

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

要变换这两个几何体,必须调用transform方法两次,每个字段一次。您可以使用
字段名称
参数指定字段,如中所述

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

# 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
字段。只需使用获取几何体的边界框,然后还只需变换主几何体:

# 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