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

OpenLayers активный слой

Добавлено: 06 сен 2012, 10:30
Malig
Есть работающая связка OL+MapServer+PostGis. В PG есть таблица, где каждая запись хранит геометрию некоторой полигон-фигуры.
OL отображает этот слой через WMS.
Хотелось бы, чтобы вместо фигуры выводился, например, треугольник, а по-хорошему, надо бы, чтобы заданный растрик в виде значка. Например знак дпс. И чтобы по клику на нем можно было выводить определенную инфу об этом знаке.

Т.е. логика примерно как в яндекс API у активных слоев.

Re: OpenLayers активный слой

Добавлено: 06 сен 2012, 11:48
Denis Rykov
Сделать view в PostGIS, хранящий центроиды полигонов, подключить его в MapServer и настроить символику, подключив нужные вам значки.

Re: OpenLayers активный слой

Добавлено: 06 сен 2012, 12:11
Malig
настроить символику, подключив нужные вам значки.
Здесь можно немного по подробнее?

Re: OpenLayers активный слой

Добавлено: 06 сен 2012, 12:20
Malig
Я не очень понимаю как туда вставить нужный мне растр.

Re: OpenLayers активный слой

Добавлено: 06 сен 2012, 12:31
Denis Rykov
Создаёте файл symbols.sym, в нём прописываете определение символов (подключаете нужный значок):

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

SYMBOLSET
SYMBOL
  NAME "herbary"
  TYPE pixmap
  IMAGE "grass.png"
END
Затем в map-файле подключаете файл стилей и используете его при определении стиля:

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

SYMBOLSET   "symbols/symbols.sym"

CLASS
    NAME "Herbary"
    STYLE
       SYMBOL "herbary"
    END
END

Re: OpenLayers активный слой

Добавлено: 06 сен 2012, 13:10
Malig
Огромное спасибо за подробный ответ.
Осталось выяснить, как повесить клик на эти значки, и различать их между собой, чтобы выводить свойственную значку инфу.

Re: OpenLayers активный слой

Добавлено: 06 сен 2012, 13:30
Denis Rykov
WMSGetFeatureInfo

Получилось настроить символику слоя?

Re: OpenLayers активный слой

Добавлено: 07 сен 2012, 05:51
Malig
Да, сделал таблицу с центрами полигонов, и к этим точкам привязал символ. Работает и с растрами и с вектором!

Сейчас буду изучать WMSGetFeatureInfo. Думаю вопросы еще будут

Re: OpenLayers активный слой

Добавлено: 07 сен 2012, 09:39
Malig
Возникло несколько вопросов:
1. Как обратиться к конкретному слою в WMS? Или придется делать на каждый слой отдельный map-файл. И подключать несколько WMS-слоев в OL?
2. Как из ответа получить конкретный атрибут, например ID?
3. Как это все можно кэшировать? После каждого клика существенная задержка.

Re: OpenLayers активный слой

Добавлено: 07 сен 2012, 11:17
Denis Rykov
1. Все слои описываются в одном map-файле, обращение идёт к слою согласно настройкам WMSGetFeatureInfo, например, можно сконфигурировать так, чтобы запросы шли только к слоям, которые сейчас включены;
2. При возвращении ответа от сервера OpenLayers автоматом парсит ответ (если тип запроса application/vnd.ogc.gml):

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

eventListeners: {
    'getfeatureinfo': function(e) {
        //Обращение к атрибуту 'attr' первого объекта из массива features
        console.log(e.features[0].attributes['attr']);
    }
}
3. Что кэшировать, ответы?

Re: OpenLayers активный слой

Добавлено: 07 сен 2012, 11:31
Malig
Да, ответы

Re: OpenLayers активный слой

Добавлено: 07 сен 2012, 11:56
Malig
Что то я не догоняю слегка....

Вот слой WMS в OL:

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

var M = new OpenLayers.Layer.WMS("RoadLayer", "http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/wms - mezhuzl.map&", {transparent: 'true', layers: 'uzl,azs', format: 'png'});
Вот создание контрола:

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

var click_ctrl = new OpenLayers.Control.WMSGetFeatureInfo({
    url: "http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/wms - mezhuzl.map&",
    layers: [M],
    queryVisible: true,
    infoFormat: 'application/vnd.ogc.gml',
    maxFeatures: 50,
    autoActivate: true,
    vendorParams: {
        radius: 10
    },
    eventListeners: {
        'getfeatureinfo': function(e) {
            alert(e.features[0].attributes['id']);
         }
    }
});
Как мне сделать так, чтобы кликалось только по слою "azs"? При этом должны отображаться и azs и uzl

Re: OpenLayers активный слой

Добавлено: 07 сен 2012, 15:05
Denis Rykov
Опишите каждый wms слой отдельным объектом OpenLayers.Layer.WMS, и используйте в контроле нужный вам слой.

[ Сообщение с мобильного устройства ]

Re: OpenLayers активный слой

Добавлено: 12 сен 2012, 05:52
Malig
Все настроил, все работало, пока не столкнулся с новой проблемой.

Настроил кэширование через GeoWebCache. И соответственно перестал работать Control.WMSGetFeatureInfo...
Как его перенастроить?

Re: OpenLayers активный слой

Добавлено: 12 сен 2012, 07:48
Denis Rykov
То есть вы отдаёте на клиента тайлы и поменяли тип слоя с WMS на XYZ или TMS? Можно попробовать указать опцию layerUrls в контроле WMSGetFeatureInfo.