我的问题是这个。我正在为一些数据创建一个模型。
class Cables(Base):
__tablename__ = 'cables'
id = Column(Integer, nullable=False)
route = Column(Geometry(geometry_type='LINESTRING', srid=4326), nullable=False)
现在,我想将这样的路线转换为GeoJSON。
我尝试过的事情
@app.route("/api/cable/<int:id>", methods=['GET'])
def get_cable(id):
cable = session.query(Cables).filter(Cables.id == id).first()
return str(geoalchemy2.functions.ST_AsGeoJSON(cable.route))
返回ST_AsGeoJSON(ST_GeomFromEWKB(:ST_GeomFromEWKB_1))
如果我改变了回报:
return geoalchemy2.functions.ST_AsGeoJSON(cable.route)
返回TypeError: 'ST_AsGeoJSON' object is not callable
return str(cable.route)
返回0102000020e610000002000000b34fd4d9bca351c032e14d5134c240c0d24f8055e0a351c0dedea9f4dcbf40c0
这表明我确实有一个几何对象。
return cable.route
返回TypeError: 'WKBElement' object is not callable
如果我打印路线类型,
print(type(cable.route))
返回
<class 'geoalchemy2.elements.WKBElement'>
我认为应该返回此类的对象,而不是类本身。我在这一点上感到困惑,我不知道我现在应该做些什么。
有什么建议吗?
答案 0 :(得分:2)
似乎调用ST_AsGeoJSON的正确方法是在查询中。 例如,
def ewkb_route_to_dict(self):
"""
returns the cable's route as a dictionary.
It uses shapely.wkb.loads. The first argument is the route as a bytestring,
and the second one (True) is to tell loads that
the input wkb will be represented as a hex string
"""
return mapping(shapely.wkb.loads(str(self.route), True))
我最终做的是安装一个新的库(形状)以读取十六进制字节串然后将其转换为字典,因为字典可以很容易地转换为json。
def __str__(self):
d = dict()
...
d["route"] = self.ewkb_route_to_dict()
...
return dumps(d)
然后在我的字符串方法中:
<a href"#" ..> ... </a>
这将正确地将几何转换为GeoJSON。
答案 1 :(得分:0)
我知道这篇文章很旧,但是对于那些仍然有此困难的人,请遵循我的解决方法:
import ast
from flask.json import jsonify
from sqlalchemy import func
@app.route("/api/cable/<int:id>", methods=['GET'])
def get_cable(id):
geom = session.query(func.ST_AsGeoJSON(Cables.route)).filter(Cables.id == id).scalar()
# The code below makes a geojson with CRS.
# See http://www.postgis.org/docs/ST_AsGeoJSON.html for more details.
#geom = session.query(func.ST_AsGeoJSON(Cables.route,15,2)).filter(Cables.id == id).scalar()
return jsonify(ast.literal_eval(geom))
答案 2 :(得分:0)
In the docs,PostGIS会帮助您:
ST_AsGeoJSON
仅构建几何。您需要自己从Postgres表中构建其余功能
实际上,尝试将ST_AsGeoJSON
的输出发送到Leaflet层将失败,因为它不是有效的Feature
。尽管该文档提供了25行PostGIS代码,但将其与SQLAlchemy结合使用并不吸引人。我发现执行此操作的最简单方法是使用小型python库shapely-geojson
。
$ pip install shapely-geojson
然后在您的代码中:
from shapely_geojson import dumps, Feature
from geoalchemy2.shape import to_shape
cable = session.query(Cables).filter(Cables.id == id).first()
feature = Feature(to_shape(cable[0]))
geoJSON = dumps(feature)
请注意,GeoJSON标准在2016年进行了更改,以强制实施right hand rule。根据数据中线或面的结构方式以及接收软件的顽强性,您可能需要使用geojson_rewind
来更改点的顺序。