Layer и Format в OpenLayers
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Layer и Format в OpenLayers
Здравствуйте, хочу более четко представить себе порядок работы с 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?
В 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
Именно! Обратите внимание, что слои типа WFS и GML содержат в описании слово "Deprecated". В итоге и пришли к описанной вами схеме.почему бы не взять, например Layer.Vector, и в качестве формата подсовывать любой формат
Существует два пути. Первый заключается в том, что вы просто загружаете откуда то данные. Пусть это будет файл в формате 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
});
- strategies - разновидности стратегий:
- Fixed - загрузить сразу весь объем данных (экономия времени, больше обращаться к серверу не нужно);
- BBOX - только на текущий экстент, видимая часть карты (экономия трафика);
- Refresh - периодическое автообновление слоя (анимация);
- и остальные, по которым ни слова в документации.
- protocol - протокол и его спец. параметры, реально в наличии имеется только WFS (есть еще SOS но по нему мало информации)
Код: Выделить всё
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
Большое спасибо! Как же не хватает подобной информации, объясняющей базовые принципы OL.
Spatial is now, more than ever, just another column- The Geometry Column.
- Mavka
- Гуру
- Сообщения: 2060
- Зарегистрирован: 14 мар 2008, 17:36
- Репутация: 9
- Mavka
- Гуру
- Сообщения: 2060
- Зарегистрирован: 14 мар 2008, 17:36
- Репутация: 9
Re: Layer и Format в OpenLayers
Как любезно подсказал _DR_, можно работать со многими форматами через базовый протокол HTTP:
Этот же пример в живую.
И вот тут нужно осторожно пользоваться стратегиями. Fixed будет работать всегда, т.к. на процесс загрузки данных он абсолютно не влияет. А вот BBOX действует по такой схеме: создается фильтр в формате OGC Filter Encoding, запрос на загрузку отправляется по POST с передачей фильтра. Т.е. с не OWS-сервисами это работать не будет, с FeatureServer в частности тоже.
Код: Выделить всё
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 гостей