【问题标题】:GeoDjango: transform SRID in DRF SerializerGeoDjango:在 DRF 序列化器中转换 SRID
【发布时间】:2015-07-22 15:02:39
【问题描述】:

我目前正在使用 OSM DB、常规 DB、DRF3 和 django-rest-framework-gis 编写 API。

OSM DB 使用 SRID 900913,但我希望 API 仅根据 SRID 4326 输出坐标。这可以通过在我的地理查询集上使用 transform(srid=4326) 来实现,但不幸的是,这不是我的选择(解释了为什么再往下)。

据我了解,我应该能够在模型的字段定义中指定另一个 SRID,如下所示:

class Polygon(models.Model):
    osm_id = models.AutoField(primary_key=True)
    name = models.CharField(null=True)
    way = models.PolygonField(null=True, srid=4326)
    admin_level = models.CharField(default='2', null=True)

    objects = models.GeoManager()

    class Meta:
        db_table = 'osm_poly_lu'

但 API 不断返回坐标为 900913 格式的多边形。

我理解正确吗?我应该能够将我的多边形字段上的 srid 设置为 4326 以便 Django 自动将其从我的 DB 900913 转换吗?如果是这样,我想我一定错过了什么;有什么想法可能是错的吗?我觉得自己是这个领域的真正新手 - 非常感谢任何帮助。

我不能在我的查询集上使用transform() 的原因:

我正在做的是查询我的成员表,并且成员模型是常规模型。然而,它确实与 OSM 多边形表(字段称为 osm_id_origin)有关系,这是一个 geoDjango 模型。因此,当我使用 DRF3 序列化器序列化成员时,我在成员序列化器中有一个嵌套序列化器,它将成员模型中的 osm_id_origin 字段序列化为 geoJSON。我用于创建 geoJSON 的嵌套序列化程序是 django-rest-framework-gis 序列化程序GeoFeatureModelSerializer 的子类。由于我查询的是成员模型,它是一个常规查询集,我无法在其上运行transform(srid=4326)

【问题讨论】:

    标签: django django-rest-framework gis geodjango


    【解决方案1】:

    这是一个迟到的答案,但我遇到了同样的问题,我创建了一个专用的序列化器字段来处理转换。如您所见,此代码将几何存储在 srid 31370 中,并在序列化时将几何转换为 srid 3857(与 900913 完全相同):

    from rest_framework_gis.fields import GeometryField
    
    class ProjectedGeometrySerializerField(GeometryField):
        """
        Transform a geometry from SRID 3857 (representation data)
        to 31370 (internal value)
        """
    
        def to_representation(self, value):
    
            if isinstance(value, dict) or value is None:
                return value
    
            cloned = value.clone()
            cloned.transform(3857)
    
            return super().to_representation(cloned)
    
        def to_internal_value(self, value):
            geom = super().to_internal_value(value)
            geom.srid = 3857
            geom.transform(31370)
            return geom
    

    【讨论】:

      猜你喜欢
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多