python-3.x - 在烧瓶棉花糖/棉花糖-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")
如果可以,请提供一个代码示例,如何序列化/反序列化棉花糖炼金术中的字段。或者此时欢迎任何答案。
解决方案
尝试使用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 参考中阅读更多详细信息
尝试自己编写所有必填字段,您可能会以您想要的形式获得更具体的序列化
推荐阅读
- reactjs - 如何添加pdf文件以与打字稿反应?
- google-sheets - 公式的 ARRAYFORMULA 版本产生的结果与常规公式不同
- php - 如何修复错误不允许加载本地资源chrome
- javascript - 从 Express 后端到 React 前端的字符串,其中包含插入到组件中的 HTML 标记
- pandas - ValueError:熊猫数据框中的项目数量错误
- node.js - Websockets:无效的帧头
- python - 与 SAP CRM 的 Python 连接
- c# - C# FileDialog.Filter 属性是否有任何“与”逻辑?
- java - 如何让这个按钮运行到文本视图中?
- angular - 我是 Angular 的新手,我想将嵌套组件加载到具有一个默认组件的模块中。是否有可能以角度创建这个?