首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Flask + GeoAlchemy2应用程序返回有效的GeoJSON

使用Flask + GeoAlchemy2应用程序返回有效的GeoJSON
EN

Stack Overflow用户
提问于 2020-07-01 04:39:32
回答 1查看 445关注 0票数 0

这几天我一直在想如何让我的Flask应用程序返回有效的GeoJSON,这是我到目前为止得到的:

models.py

代码语言:javascript
运行
复制
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)

现在,在main文件中,我有以下路径:

app.py

代码语言:javascript
运行
复制
@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查询应该是什么样子,不仅返回几何字段,还返回其他字段?

如有任何提示或帮助,敬请期待,谢谢!

EN

回答 1

Stack Overflow用户

发布于 2020-08-07 15:22:46

您可以使用marshmallow-sqlalchemy来创建类似json的响应。

创建schemas.py

代码语言:javascript
运行
复制
    #!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)

在此之后,您可以在视图(路由)中使用它

代码语言:javascript
运行
复制
    from app.schemas import building_schema 


    @app.route('/geojson')
    def json():
        buildings = Buildings.query.all()
        response = building_schema.dumps(buildings)
        
        return response
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62665818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档