首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GeoDjango:在DRF序列化程序中转换SRID

GeoDjango:在DRF序列化程序中转换SRID
EN

Stack Overflow用户
提问于 2015-05-12 07:02:04
回答 1查看 605关注 0票数 1

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

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

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

代码语言:javascript
复制
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序列化程序序列化成员时,在成员序列化程序中有一个嵌套的序列化程序,它将成员模型中的osm_id_origin字段序列化为geoJSON。我用来创建geoJSON的嵌套序列化器是django-rest-framework-gis序列化器GeoFeatureModelSerializer的子类。因为我查询成员模型,这是一个常规的查询集,所以我不能对它运行transform(srid=4326)

EN

回答 1

Stack Overflow用户

发布于 2020-09-10 23:52:27

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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30179010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档