Как вернуть GeoJSON с Flask в Openlayers

У меня есть простая функция фляги, которая отображает шаблон с допустимой строкой 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 я пытаюсь отобразить этот GeoJSON с помощью OpenLayers:

 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)

позаботится об этом, однако я все еще не могу проанализировать GeoJSON в OpenLayers, хотя это допустимая строка в соответствии с geojsonlint.com

Это код 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]]]}';

У меня все еще есть проблема с отображением символов кавычек.


person camdenl    schedule 17.06.2014    source источник


Ответы (1)


Похоже, вы используете shapely, у которого есть http://toblerity.org/shapely/shapely.geometry.html#shapely.geometry.mapping для создания GeoJSON подобного объекта.

Для рендеринга json используйте фильтр tojson, который безопасен (см. фильтр safe) для последних версий flask, потому что jinja2 в flask по умолчанию экранирует все опасные символы для защиты XSS.

person tbicr    schedule 17.06.2014
comment
Это было частью проблемы, но все еще не там, смотрите мои правки. - person camdenl; 17.06.2014
comment
Все работает правильно, опасные символы по умолчанию экранированы с помощью jinja2 для защиты XSS. Для вставки безопасной разметки необходимо пометить переменную шаблона как безопасную с фильтром safe (см. {{ string|safe }}), но для json лучше использовать специальный фильтр tojson, который также безопасен (по крайней мере, для последних версий flask) и равен {{ flask.json.dupms(polygon)|safe }} (см. {{ string|tojson }}). - person tbicr; 17.06.2014
comment
Это правильный ответ, не могли бы вы добавить его в текст ответа? - person camdenl; 17.06.2014