Сериализация WKB в WKT или геойсон в зефире с флягой / зефире-sqlalchemy

У меня есть куча ГИС-таблиц в моей модели, которую я создал в 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")

Пожалуйста, предоставьте пример кода, если можете, как сериализовать / десериализовать поле в алхимии зефира. Или любой ответ приветствуется в этой точке.

0 ответов

Попробуйте использовать marshmallow- sqlalchemy'fields.Method()', а в методе используйте другой метод 'to_shape' из пакета geoalchemy2.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")

это может помочь вам с сериализацией, для десириализации вы можете прочитать более подробную информацию в справке по API geoalchemy2

Попробуйте закодировать все обязательные поля самостоятельно, вы можете получить более конкретную сериализацию в нужной вам форме

Другие вопросы по тегам