Сериализация 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
Попробуйте закодировать все обязательные поля самостоятельно, вы можете получить более конкретную сериализацию в нужной вам форме