我目前正在使用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)
。
答案 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