json - 使用 Flask + GeoAlchemy2 应用程序返回有效的 GeoJSON
问题描述
几天以来,我想知道如何让我的 Flask 应用程序返回有效的 GeoJSON,这是我目前得到的:
models.py
class Building(base):
__tablename__ = 'buildings'
id = Column(Integer, primary_key=True)
district = Column(Unicode)
address = Column(Unicode)
name = Column(Unicode)
building_type = Column(Unicode)
mpoly = Column(Geometry('MULTIPOLYGON'))
building = relationship("User")
# this part is done as answered here: https://stackoverflow.com/questions/41684512/cant-transform-geometry-to-geojson
def building_to_dict(self):
return mapping(shapely.wkb.loads(str(self.mpoly), True))
def __str__(self):
d = dict()
d["id"] = self.id
d["district"] = self.district
d["address"] = self.address
d["name"] = self.name
d["building_type"] = self.building_type
d["mpoly"] = self.building_to_dict()
return shapely.dumps(d)
现在在主文件中,我有以下路由:
app.py
@app.route('/geojson')
def get_json():
features = session.query(Building.mpoly.ST_AsGeoJSON()).all()
return jsonify(features)
这是我的两个问题:
1) 返回类似于 JSON 的响应,如下所示:
"{\"type\":\"MultiPolygon\",\"coordinates\":[[[[16.8933137,52.471446],...,]]]}"
不是正确的 GeoJSON。jsonify 之前的特征变量看起来是这样的:
[('{"type":"MultiPolygon","coordinates":[[[[16.914159616,52.473822807],...,]]]}',)]
2) 我的 GeoAlchemy 查询应该是什么样子,不仅返回几何字段,还返回其他字段?
任何形式的提示或帮助高度赞赏,在此先感谢!
解决方案
您可以使用marshmallow-sqlalchemy创建类似 json 的响应。
创造
schemas.py
#!schemas.py
from marshmallow import fields
from marshmallow_sqlalchemy import ModelSchema
from app.models import Building
from geoalchemy.shape import to_shape
class BuildingSchema(ModelSchema):
id = fields.Integer()
district = fileds.Unicode()
address = fileds.Unicode()
name = fields.Unicode()
building_type = fields.Unicode()
mpoly = fileds.Method("geom_to_json")
@staticmethod
def geom_to_json(obj):
mpoly = to_shape(obj.mpoly)
return {
lat: mpoly.y,
lon: mpoly.x,
#and so on ...
}
class Meta:
model = Building
exclude = ("mpoly")
bulding_schema = BuildingSchema(many=True)
在此之后,您可以在您的视图(路线)中使用它
from app.schemas import building_schema
@app.route('/geojson')
def json():
buildings = Buildings.query.all()
response = building_schema.dumps(buildings)
return response
推荐阅读
- javascript - 来自ajaxtowards flask的发布请求后页面未呈现
- java - 线程“Thread-3”java.lang.NoSuchMethodError 中的异常:org.apache.http.impl.client.DefaultRedirectStrategy。
([Ljava/lang/String;)V - reactjs - 材料表 tableRef.current 值仍未定义
- python - 无论如何要在python中的字典中获取键的索引?
- font-awesome - HTML - fontawesome 替换图标
- django - 处理 Django 模型字段中的重复属性,寻找最佳实践
- c++ - C++ 非常初学者的消息-帮助赞赏
- javascript - 如果是星期天,JavaScript 日历不显示月份的第一天
- bash - 什么是 Bash 命令或脚本,用于从包含格式日期的多行信息的文件中提取文件名:文件名:文件状态
- css - Google Web Designer 中的等效电影剪辑