GeoDjango:在DRF Serializer中转换SRID

时间:2015-05-11 23:02:04

标签: django django-rest-framework gis geodjango

我目前正在使用OSM 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 Polygon表有关(字段称为osm_id_origin),这是一个geoDjango模型。因此,当我使用DRF3 Serializer序列化成员时,我在成员序列化程序中有一个嵌套的Serializer,它将成员模型中的osm_id_origin字段序列化为geoJSON。我用于创建geoJSON的嵌套序列化程序是django-rest-framework-gis序列化程序GeoFeatureModelSerializer的子类。由于我查询成员模型,这是一个常规查询集,我无法在其上运行transform(srid=4326)

1 个答案:

答案 0 :(得分: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