Страница 1 из 1

Layer и Format в OpenLayers

Добавлено: 29 окт 2010, 09:01
Denis Rykov
Здравствуйте, хочу более четко представить себе порядок работы с 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?

Re: Layer и Format в OpenLayers

Добавлено: 29 окт 2010, 10:32
Mavka
почему бы не взять, например 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, но тут я вступаю на совсем неизведанную тропу.

Re: Layer и Format в OpenLayers

Добавлено: 29 окт 2010, 11:03
Denis Rykov
Большое спасибо! Как же не хватает подобной информации, объясняющей базовые принципы OL.

Re: Layer и Format в OpenLayers

Добавлено: 29 окт 2010, 11:33
Mavka
Надо писать вики, надо :(

Re: Layer и Format в OpenLayers

Добавлено: 01 ноя 2010, 11:03
Mavka
Как любезно подсказал _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 в частности тоже.