Сериализуйте WKB в WKT или geojson в flask marshmallow/marshmallow-sqlalchemy

В моей модели есть несколько таблиц ГИС, которые я создал в flaskSQLAlchemy. Каждая из этих моделей имеет поле 'geom', которое является объектом WKB. Которые должны быть сериализованы JSON в WKT или geojson, чтобы работал вызов API GET.

Я пытался использовать функции geoalchemy2, но я застрял. Я использую комбинацию flask marshmallow/marshmallow-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")

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


person ISONecroMAn    schedule 26.04.2018    source источник
comment
это может помочь   -  person geozelot    schedule 29.04.2018
comment
Вы когда-нибудь решали это? против того же.   -  person Mike Davlantes    schedule 30.08.2018


Ответы (1)


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

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

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

person James Nur    schedule 07.08.2020