如何在Flask中返回GeoJSON给Openlayers
我有一个简单的Flask函数,它可以用一个有效的GeoJSON字符串来渲染一个模板:
@app.route('/json', methods=['POST'])
def json():
polygon = Polygon([[[0,1],[1,0],[0,0],[0,1]]])
return render_template('json.html',string=polygon)
在我的json.html文件中,我想用OpenLayers来显示这个GeoJSON:
function init(){
map = new OpenLayers.Map( 'map' );
layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
"http://vmap0.tiles.osgeo.org/wms/vmap0",
{layers: 'basic'} );
map.addLayer(layer);
map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
var fc = {{string}}; //Here is the JSON string
var geojson_format = new OpenLayers.Format.GeoJSON();
var vector_layer = new OpenLayers.Layer.Vector();
map.addLayer(vector_layer);
vector_layer.addFeatures(geojson_format.read(fc));
但是这失败了,"
字符变成了'
。我尝试过像这个问题中提到的字符串格式化,但没有成功。
编辑:
我确实忘了把我的json转换成实际的字符串,我正在使用geojson库,所以加上这个函数:
dumps(polygon)
就能解决这个问题,不过我在OpenLayers中还是无法解析这个GeoJSON,尽管根据geojsonlint.com,它是一个有效的字符串。
这是用来从Flask发送的字符串创建变量的JavaScript代码:
var geoJson = '{{string}}';
这是在源页面中它的样子:
'{"type": "Polygon", "coordinates": [[[22.739485934746977, 39.26596659794341], [22.73902517923571, 39.266115931275074], [22.738329551588276, 39.26493626464484], [22.738796023230854, 39.26477459496181], [22.739485934746977, 39.26596659794341]]]}';
我仍然在渲染引号字符时遇到问题。
1 个回答
1
看起来你在使用 shapely
这个库,它有一个方法可以创建类似 GeoJSON
的对象,具体可以查看这个链接:http://toblerity.org/shapely/shapely.geometry.html#shapely.geometry.mapping。
如果你想渲染 json
数据,可以使用 tojson
这个过滤器,它是安全的(可以参考 safe
过滤器),因为在最新的 Flask 版本中,jinja2
默认会对所有危险的符号进行转义,以保护你免受 XSS 攻击。