Страница 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.