Layer и Format в OpenLayers

Решенные задачи, первая запись - описание решения.
Ответить
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Layer и Format в OpenLayers

Сообщение Denis Rykov » 29 окт 2010, 09:01

Здравствуйте, хочу более четко представить себе порядок работы с API OL, в связи с чем вот такой вопрос.
В API есть Format GML и есть объект OpenLayers.Layer.GML. Недавно, я нашел в документации пример показывающий, что чтобы добавить слой GeoJSON на карту нужно использовать слой Layer.GML и в качестве параметра передать ему формат GeoJSON. Вопрос - почему есть Layer.GML, но нет Layer.GeoJSON? И вообще почему бы не взять, например Layer.Vector, и в качестве формата (хотя такого атрибута у него нет) подсовывать любой формат. Ведь получается - ключевой момент - это как раз формат. То есть сейчас получается, что я могу взять слой объект OpenLayers.Layer.WFS и в качестве параметра передать ему GML и чем это будет отличаться от OpenLayers.Layer.GML?
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: Layer и Format в OpenLayers

Сообщение Mavka » 29 окт 2010, 10:32

почему бы не взять, например Layer.Vector, и в качестве формата подсовывать любой формат
Именно! Обратите внимание, что слои типа WFS и GML содержат в описании слово "Deprecated". В итоге и пришли к описанной вами схеме.

Существует два пути. Первый заключается в том, что вы просто загружаете откуда то данные. Пусть это будет файл в формате GeoJSON, CSV, GML и т.п. Потом его нужно распарсить (классы Format). См. пример, функция deserialize(). Вы получите массив с гео-объектами. Потом - в цикле добавляем объекты на векторный слой.

Подробнее см. здесь.

Вариант второй. Объединяет векторный слой и процесс чтения данных. Вот как это выглядит:

Код: Выделить всё

var lay_wfs = new OpenLayers.Layer.Vector('пример', {
        strategies: [new OpenLayers.Strategy.Fixed()],
        protocol: new OpenLayers.Protocol.WFS({
            version: '1.1.0',
            url: "http://localhost/cgi-bin/mapserv.exe?map=d:/path/to/file.map",
            featureType: 'tatar-city',
            featureNS: 'http://localhost/Tatarstan',
            srsName: 'EPSG:900913'      // UMN всегда выдает 'epsg:4326'
        }),
        visibility: true
}); 
Очень часто данные не лежат в виде файла, а генерируются на основании запроса. С применением параметрических и пространственных фильтров. Второй вариант - это уже не просто "скачать и прочитать", а целый процесс (сервис). В приведенном примере:
  1. strategies - разновидности стратегий:
    • Fixed - загрузить сразу весь объем данных (экономия времени, больше обращаться к серверу не нужно);
    • BBOX - только на текущий экстент, видимая часть карты (экономия трафика);
    • Refresh - периодическое автообновление слоя (анимация);
    • и остальные, по которым ни слова в документации.
  2. protocol - протокол и его спец. параметры, реально в наличии имеется только WFS (есть еще SOS но по нему мало информации)
Если используется сервер WFS, который умеет отдавать не только GML но и GeoJSON (GeoServer, UMN MapServer), то можно попробовать подменить парсер в протоколе:

Код: Выделить всё

var lay_wfs = new OpenLayers.Layer.Vector('пример', {
        ...
        protocol: new OpenLayers.Protocol.WFS({
            readFormat: OpenLayers.Format.GeoJSON
            ...
        })
}); 
В доках про это не говорится, но в коде разводка сделана.

Если же используется сервер с отличными параметрами запроса (FeatureServer), то протокол WFS скорее всего не подойдет. Наверное, можно попробовать использовать базовый класс Protocol.HTTP, но тут я вступаю на совсем неизведанную тропу.
Последний раз редактировалось Mavka 01 ноя 2010, 13:00, всего редактировалось 1 раз.
лангольеры под окном жрали время ом-ном-ном

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Layer и Format в OpenLayers

Сообщение Denis Rykov » 29 окт 2010, 11:03

Большое спасибо! Как же не хватает подобной информации, объясняющей базовые принципы OL.
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: Layer и Format в OpenLayers

Сообщение Mavka » 29 окт 2010, 11:33

Надо писать вики, надо :(
лангольеры под окном жрали время ом-ном-ном

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: Layer и Format в OpenLayers

Сообщение Mavka » 01 ноя 2010, 11:03

Как любезно подсказал _DR_, можно работать со многими форматами через базовый протокол HTTP:

Код: Выделить всё

new OpenLayers.Layer.Vector("Aircraft Locations", {
    strategies: [new OpenLayers.Strategy.Fixed()],
    protocol: new OpenLayers.Protocol.HTTP({
        url: "kml-track.kml",
        format: new OpenLayers.Format.KML({
            extractTracks: true,
            trackAttributes: ["speed"]
        })
    })
}) 
Этот же пример в живую.

И вот тут нужно осторожно пользоваться стратегиями. Fixed будет работать всегда, т.к. на процесс загрузки данных он абсолютно не влияет. А вот BBOX действует по такой схеме: создается фильтр в формате OGC Filter Encoding, запрос на загрузку отправляется по POST с передачей фильтра. Т.е. с не OWS-сервисами это работать не будет, с FeatureServer в частности тоже.
лангольеры под окном жрали время ом-ном-ном

Ответить

Вернуться в «Рецепты»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей