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