首页 > 解决方案 > 在烧瓶棉花糖/棉花糖-sqlalchemy 中将 WKB 序列化为 WKT 或 geojson

问题描述

我在 flaskSQLAlchemy 中创建的模型中有一堆 GIS 表。这些模型中的每一个都有一个“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")

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

标签: python-3.xflask-sqlalchemymarshmallowjsonserializergeoalchemy2

解决方案


尝试使用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 参考中阅读更多详细信息

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


推荐阅读