如何在Flask中返回GeoJSON给Openlayers

3 投票
1 回答
2959 浏览
提问于 2025-04-18 10:03

我有一个简单的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 攻击。

撰写回答