Как преобразовать формат geoJSON из запроса jsonp в удобный формат Open Layers 3

Я использую jsonp-запрос к серверу, который возвращает строку, содержащую геометрию многострочного вектора. Это выглядит так (я его немного урезал):

MULTILINESTRING((-0.61122 44.88987,-0.61108 44.88961,-0.6109 44.88926))

В Open Layers 3, когда я обычно создаю векторный объект, я предоставляю строку, содержащую геометрию, используя следующий код:

var vectorFeature = new ol.Feature({
    geometry: new ol.geom.MultiLineString([[-0.11151,21.24112],[-0.11151,81.24112]])
});

Обратите внимание на разницу в форматировании строк. Есть ли способ в Open Layers 3 быстро переформатировать ответ от jsonp-запроса, чтобы я мог быстро создать новую векторную функцию на основе этих данных, или мне придется самому разбирать строку и добавлять форматирование []?

Изменить:

Если я использую объект, возвращенный из запроса JSONP, в качестве аргумента непосредственно в MultiLineString (как показано ниже):

var vectorFeature = new ol.Feature({
geometry: new ol.geom.MultiLineString(data.geometry)
});

тогда, если я попытаюсь получить координаты объекта, используя:

console.log(vectorFeature.getGeometry().getCoordinates());

Я получаю массив [массив [1], массив [1], массив [1] ...]

Что неверно и указывает на неправильное форматирование якобы объекта geoJSON?

Изменить 2

Объект, возвращаемый из запроса JSON, оказался WKT, а не geoJSON, что объясняет трудности.


person Single Entity    schedule 03.03.2015    source источник


Ответы (2)


На мой взгляд, в этом случае хорошим решением будет использование регулярного выражения:

var string = 'MULTILINESTRING((-0.61122 44.88987,-0.61108 44.88961,-0.6109 44.88926))',
    matches = string.match(/(\-?\d+(\.\d+)?)\s(\-?\d+(\.\d+)?)+/g),
    results = [];

matches.forEach(function (match) {
    results.push(match.split(' '));
});

Возвращает results как объект вложенного массива:

[
    ["-0.61122","44.88987"],
    ["-0.61108","44.88961"],
    ["-0.6109","44.88926"]
]

Рабочий пример на Plunker: http://plnkr.co/edit/mEjuaoPqWM0Zy6Y0RHER?p=preview

Примечание: строка, возвращаемая сервером, не является GeoJSON:

MULTILINESTRING((-0.61122 44.88987,-0.61108 44.88961,-0.6109 44.88926))

Правильная геометрия GeoJSON MultiLineString будет выглядеть так:

{
    "type": "MultiLineString",
    "coordinates": [
        [[100.0, 0.0], [101.0, 1.0]],
        [[102.0, 2.0], [103.0, 3.0]]
    ]
}

Справочная спецификация: http://geojson.org/geojson-spec.html#id6

person iH8    schedule 03.03.2015
comment
Спасибо, но вывод должен быть строкой, и действительно вопрос заключался в том, нужно ли мне беспокоиться о форматировании строки или есть ли решение Open Layers 3 (что меня удивляет, если его нет). Однако, спасибо. - person Single Entity; 03.03.2015
comment
Вы не передаете здесь строку: new ol.geom.MultiLineString([[-0.11151,21.24112],[-0.11151,81.24112]]) Вы передаете объект массива, который содержит массивы. Если бы это была строка, она была бы заключена в одинарные или двойные кавычки, например: new ol.geom.MultiLineString("[[-0.11151,21.24112],[-0.11151,81.24112]]") Это большая разница. Open Layers не принимает строку в качестве аргумента для ol.geom.MultiLineString. Проверьте документацию по API: openlayers.org/en/v3.2.1 /apidoc/ol.geom.MultiLineString.html - person iH8; 03.03.2015
comment
Однако на данный момент ответ jsonp, который я получаю от сервера, представляет собой объект JSON, который я конвертирую в строку (что довольно глупо, судя по его звукам). Если у меня есть объект JSON под названием «Данные», как передать его в ol.geom.MultiLineString? - person Single Entity; 03.03.2015
comment
Понятно, еще раз благодарю вас за вашу помощь. Теперь это имеет для меня гораздо больше смысла. - person Single Entity; 03.03.2015
comment
Я добавил дополнительную информацию о GeoJSON к своему ответу, потому что то, что вы получаете в качестве ответа, далеко не GeoJSON. Теперь о вашем объекте: если вы правильно выполняете свой JSONP (комментарии слишком короткие, чтобы вдаваться в них), функция обратного вызова для этого запроса должна возвращать объект массива, который вам нужно использовать с ol.geom.MultiLineString - person iH8; 03.03.2015
comment
Я исправлю свой вопрос, чтобы включить то, что происходит, когда я помещаю объект ответа JSONP в качестве аргумента в MultiLineString, это кажется довольно странным, и именно поэтому объект в первую очередь преобразовывался в строку ... - person Single Entity; 03.03.2015

Мне ответ выглядит как WKT, не так ли? У OpenLayers есть прямая поддержка.

person mcepl    schedule 22.07.2015