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

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9129
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 748
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

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

Сообщение Максим Дубинин »

Помогите примером кода, получающим значение из 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 всякие значения писать могу. Мне надо с объекта по которому щелкнуто получить значение из определенного поля. Не поделитесь ли упрощенным примером? Как это все сейчас работает можно посмотреть вот здесь.
пристегивайтесь, турбулентность прямо по курсу
Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

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

Сообщение Mavka »

e.length в FireBug показывает 0? Может в UMN какие то настройки, типа DUMP TRUE нужны?
лангольеры под окном жрали время ом-ном-ном
Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9129
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 748
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

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

Сообщение Максим Дубинин »

никак толком не освою 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", но после этого объекты опять перестают вытягиваться.
пристегивайтесь, турбулентность прямо по курсу
Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9129
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 748
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

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

Сообщение Максим Дубинин »

Сломил сопротивление противника. Резюме.

1. "gml_include_items" "all" для слоя - обязательно
2. В именах полей не должно быть пробелов! (у меня оказался и испортил 2 часа жизни)
3. Firebug и GML запрос - рулят!
пристегивайтесь, турбулентность прямо по курсу
Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

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

Сообщение Mavka »

"gml_include_items" это vendor-фича UMN?
лангольеры под окном жрали время ом-ном-ном
Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9129
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 748
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

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

Сообщение Максим Дубинин »

Да, по умолчанию 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',
пристегивайтесь, турбулентность прямо по курсу
Shifted
Интересующийся
Сообщения: 23
Зарегистрирован: 09 дек 2009, 15:00
Репутация: 0

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

Сообщение 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? В чем ошибка?
Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

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

Сообщение Mavka »

1. Почему "INFO_FORMAT" а не "infoFormat"?
2. Возьмите Firebugs и не нужно будет гадать по .features.length. Просто посмотрите что возвращает сервер.
лангольеры под окном жрали время ом-ном-ном
Shifted
Интересующийся
Сообщения: 23
Зарегистрирован: 09 дек 2009, 15:00
Репутация: 0

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

Сообщение 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)


чето даже не знаю в чем косяк
Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

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

Сообщение Mavka »

Сдается мне вы забыли указать слой:
layers: [my_citykirov_wms_layer],
лангольеры под окном жрали время ом-ном-ном
Shifted
Интересующийся
Сообщения: 23
Зарегистрирован: 09 дек 2009, 15:00
Репутация: 0

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

Сообщение 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();
то вроде ненужно.
dimas4
Интересующийся
Сообщения: 17
Зарегистрирован: 16 апр 2009, 18:28
Репутация: 0

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

Сообщение 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) вообще ничего не выдает, потомучто походу тоже ноль. :( Ткните носом пожалуйста!
Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

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

Сообщение Mavka »

"Requested layer(s) are not queryable" - может чего в настройках UMN MapServer не указали?
лангольеры под окном жрали время ом-ном-ном
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov »

"Requested layer(s) are not queryable" - признак отсутствия обязательного тега TEMPLATE в описании слоя, даже если вы запрашиваете информацию с сервера в application/vnd.ogc.gml или text/plain - все равно в TEMPLATE нужно указывать файл, причем не обязательно чтобы он существовал. Фактически файл, указанный в TEMPLATE будет использован только в случае запроса в text/html.
Spatial is now, more than ever, just another column- The Geometry Column.
Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 11 гостей