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

Получение значений из WMS слоя в Openlayers

Добавлено: 07 окт 2009, 06:41
Максим Дубинин
Помогите примером кода, получающим значение из WMS слоя (Mapserver) в Openlayers. Я посмотрел источник геосэмпла на геосервер и сделал так.

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

wms_info = new OpenLayers.Control.WMSGetFeatureInfo({
		title: 'wmsinfo',
		layers: [errors],
		url: "http://gis-lab.info/cgi-bin/mapserv?map=/usr/local/www/gis-lab/data/projects/osmrus/errors-wms/wms.map",
		infoFormat: 'application/vnd.ogc.gml',
		queryVisible: true
	});
wms_info.events.register('getfeatureinfo', this, showInfo);	
map.addControl(wms_info);
wms_info.activate();
Но вот с процедурой получения и выведения в popup значения у меня не очень получается, e.length все время выдает 0, но щелчок обрабатывается и в popup всякие значения писать могу. Мне надо с объекта по которому щелкнуто получить значение из определенного поля. Не поделитесь ли упрощенным примером? Как это все сейчас работает можно посмотреть вот здесь.

Re: Получение значений из WMS слоя в Openlayers

Добавлено: 07 окт 2009, 10:06
Mavka
e.length в FireBug показывает 0? Может в UMN какие то настройки, типа DUMP TRUE нужны?

Re: Получение значений из WMS слоя в Openlayers

Добавлено: 08 окт 2009, 07:06
Максим Дубинин
никак толком не освою Firebug, просто выводил e.features.length в popup

DUMP TRUE - помогло, спасибо! теперь e.features.length !=0

однако дальше не могу продвинуться, никак не получается с полями

e.features[0].attributes.length все время 0 (названия полей знаю и e.features[0].attributes.LON пробовал - undefined). Нашел что вроде надо бы сделать в LAYER "gml_include_items" "all", но после этого объекты опять перестают вытягиваться.

Re: Получение значений из WMS слоя в Openlayers

Добавлено: 08 окт 2009, 07:38
Максим Дубинин
Сломил сопротивление противника. Резюме.

1. "gml_include_items" "all" для слоя - обязательно
2. В именах полей не должно быть пробелов! (у меня оказался и испортил 2 часа жизни)
3. Firebug и GML запрос - рулят!

Re: Получение значений из WMS слоя в Openlayers

Добавлено: 08 окт 2009, 08:58
Mavka
"gml_include_items" это vendor-фича UMN?

Re: Получение значений из WMS слоя в Openlayers

Добавлено: 08 окт 2009, 15:58
Максим Дубинин
Да, по умолчанию UMN возвращает plain text и gml, если указано отдельно то html. Так вот в первом случае, если хочешь парсить объекты .attributes и т.п., то обязательно надо указать в описании слоя "gml_include_items" "all". При этом в доке указано Optional, однако Optional касается только случая если ни txt ни gml не используется.

Сбивает с толку то, если если это не указать, то объект возвращаться будет: e.features.length !=0, но все попытки получить с него атрибуты будут приводить к undefined.

Речь, конечно, идет о случае когда в WMSGetFeatureInfo() в OL указано: infoFormat: 'application/vnd.ogc.gml',

Re: Получение значений из WMS слоя в Openlayers

Добавлено: 14 дек 2009, 11:39
Shifted
Проблема всё таже, не могу получить данные из WMS слоя (Mapserver) в Openlayers. Сама база в Postgre.

все делал как описано выше, однако результат нулевой :(

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

var    info = new OpenLayers.Control.WMSGetFeatureInfo({
            url: 'http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/kirov/City.map&', 
            title: 'citykirov',
            queryVisible: true,
            INFO_FORMAT: 'application/vnd.ogc.gml',
            eventListeners: {
                getfeatureinfo: function(event) {
                    map.addPopup(new OpenLayers.Popup.FramedCloud(
                        "citykirov", 
                        map.getLonLatFromPixel(event.xy),
                        null,
                        [event.features.length],
                        null,
                        true
                    ));
                }
            }
        });

        map.addControl(info);
        info.activate();
map файл:

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

    # WMS server settings
    METADATA
      wms_title           "CityKirov"
      wms_onlineresource  "http://localhost/cgi-bin/mapserv.exe?map=c:/ms4w/apps/kirov/City.map&"
      wms_srs             "EPSG:4326"
      wms_getfeatureinfo         "http://localhost/cgi-bin/mapserv.exe?map=c:/ms4w/apps/kirov/City.map&"
      wms_featureinfoformat      "gml"
    END

  END



  LAYER
    NAME 'citykirov'
    TYPE POLYGON
    CONNECTIONTYPE postgis
    CONNECTION "dbname='postgis' host=localhost port=5432 user='postgres' password='1'"
    DATA "the_geom FROM (select * from citykirov order by layer) as city using unique gid using srid=4326"
    METADATA
      "wms_title" "citykirov"
      "gml_include_items" "all"  ## Optional (serves all attributes for layer)
    END

    DUMP TRUE

    STATUS DEFAULT
    TRANSPARENCY 100
    PROJECTION
    "proj=longlat"
    "ellps=WGS84"
    "datum=WGS84"
    "no_defs"
    ""
    END

    CLASS
       NAME "citykirov"
       STYLE
         SYMBOL 0 
         SIZE 12 
         OUTLINECOLOR 0 0 0
         COLOR [Color]
       END
    END

  END
результат: e.features.length =0, как я понял, дожен быть !=0 , как вывести значения поля id? В чем ошибка?

Re: Получение значений из WMS слоя в Openlayers

Добавлено: 14 дек 2009, 11:54
Mavka
1. Почему "INFO_FORMAT" а не "infoFormat"?
2. Возьмите Firebugs и не нужно будет гадать по .features.length. Просто посмотрите что возвращает сервер.

Re: Получение значений из WMS слоя в Openlayers

Добавлено: 14 дек 2009, 13:03
Shifted
чето ничего не понимаю, похоже возвращаются нулевые значения?

параметры запроса:

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

bbox	8115.552846,13922.377777,8284.447154,14077.622223
feature_count	10
height	853
info_format	application/vnd.ogc.gml
layers	citykirov
map	/ms4w/apps/kirov/City.map
query_layers	citykirov
request	GetFeatureInfo
service	WMS
srs	EPSG:4326
styles	
version	1.1.0
width	928
x	493
y	164

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

[b]Заголовки ответа[/b]
Date	Mon, 14 Dec 2009 09:59:28 GMT
Server	Apache/2.2.11 (Win32)
Keep-Alive	timeout=5, max=100
Connection	Keep-Alive
Transfer-Encoding	chunked
Content-Type	application/vnd.ogc.se_xml
[b]Заголовки запроса[/b]
Host	localhost
User-Agent	Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2
Accept	text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language	ru,en-us;q=0.7,en;q=0.3
Accept-Encoding	gzip,deflate
Accept-Charset	windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive	300
Connection	keep-alive
Origin	null
ну и пишет что ошибка в этой строке :this._object.send(vData);if(bGecko&&!this._async){this.readyState=cXMLHttpRequest.OPENED;fSynchronizeValues(this);while(this.readyState<cXMLHttpRequest.DONE){this.readyState++;fReadyStateChange(this);if(this._aborted)


чето даже не знаю в чем косяк

Re: Получение значений из WMS слоя в Openlayers

Добавлено: 14 дек 2009, 14:27
Mavka
Сдается мне вы забыли указать слой:
layers: [my_citykirov_wms_layer],

Re: Получение значений из WMS слоя в Openlayers

Добавлено: 15 дек 2009, 09:57
Shifted
если тут:

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

var    info = new OpenLayers.Control.WMSGetFeatureInfo({
            url: 'http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/kirov/City.map&', 
            title: 'citykirov',
            queryVisible: true,
            INFO_FORMAT: 'application/vnd.ogc.gml',
            eventListeners: {
                getfeatureinfo: function(event) {
                    map.addPopup(new OpenLayers.Popup.FramedCloud(
                        "citykirov", 
                        map.getLonLatFromPixel(event.xy),
                        null,
                        [event.features.length],
                        null,
                        true
                    ));
                }
            }
        });

        map.addControl(info);
        info.activate();
то вроде ненужно.

Re: Получение значений из WMS слоя в Openlayers

Добавлено: 20 фев 2010, 01:26
dimas4
А вот я все делаю как в примере http://trac.openlayers.org/wiki/ru_wmsgetfeatureinfo, но ничего не получается, когда нажимаю на объект получаю такой ответ "msWMSFeatureInfo(): WMS server error. Requested layer(s) are not queryable. " :( Когда делаю как Shifted тоже получаю ноль. Когда делаю как в примере sim (http://gis-lab.info/projects/osm-errors.html) вообще ничего не выдает, потомучто походу тоже ноль. :( Ткните носом пожалуйста!

Re: Получение значений из WMS слоя в Openlayers

Добавлено: 20 фев 2010, 16:33
Mavka
"Requested layer(s) are not queryable" - может чего в настройках UMN MapServer не указали?

Re: Получение значений из WMS слоя в Openlayers

Добавлено: 16 апр 2010, 19:34
Denis Rykov
"Requested layer(s) are not queryable" - признак отсутствия обязательного тега TEMPLATE в описании слоя, даже если вы запрашиваете информацию с сервера в application/vnd.ogc.gml или text/plain - все равно в TEMPLATE нужно указывать файл, причем не обязательно чтобы он существовал. Фактически файл, указанный в TEMPLATE будет использован только в случае запроса в text/html.