将WKB序列化为WKT或geojson in flask marshmallow / marshmallow-sqlalchemy

时间:2018-04-26 12:01:25

标签: gis flask-sqlalchemy jsonserializer marshmallow geoalchemy2

我在我的模型中有一堆GIS表格,我在flaskSQLAlchemy中创建。这些模型中的每一个都具有“geom”字段,该字段是WKB对象。 需要将JSON序列化为WKT或geojson,以便API GET调用可以正常工作。

我尝试使用geoalchemy2功能,但我卡住了。     我使用了一瓶棉花糖/棉花糖 - sqlalchemy组合,我尝试了类似下面的东西,没有运气。

from geoalchemy2 import functions
from marshmallow import fields

class WKTSerializationField(fields.Field):
def _serialize(self, value, attr, obj):
    if value is None:
        return value
    else:
        if type(value).__name__ == 'WKBElement':
            return functions.ST_AsEWKT(value)
        else:
            return None



class GISModelTableSchema(ma.ModelSchema):
    class Meta:
       model = GISModelTable
    geom = WKTSerializationField(attribute="geom")

如果可以,请提供代码示例,如何序列化/反序列化marshmallow炼金术中的字段。或者欢迎任何答案。

1 个答案:

答案 0 :(得分:0)

尝试使用marshmallow-sqlalchemy 'fields.Method()',并在该方法中使用geoalchemy2.shape包中的另一种方法'to_shape '。这将帮助您解决序列化问题。

    #!schemas.py
    from marshmallow import fields
    from marshmallow_sqlalchemy import ModelSchema
    from geoalchemy2.shape import to_shape
    from .models import YourModel
    
    class YourModelSchema(ModelSchema):
        your_geom_field = fields.Method("geom_to_dict")
        
        @staticmethod
        def geom_to_dict(obj):
            point = to_shape(obj.your_geom_field)
            return { 
                      lat: point.y,
                      lon: point.x
                   }
    
        class Meta:
              model = YourModel
              exclude = ("your_geom_field")

此功能可帮助您进行序列化,有关反序列化的信息,请参阅geoalchemy2 api参考

尝试自己编写所有必填字段,您可能会以所需的形式获得更具体的序列化