GetFeatureInfo - вопрос новичка

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
gojko
Интересующийся
Сообщения: 18
Зарегистрирован: 28 июл 2009, 09:40
Репутация: 0

GetFeatureInfo - вопрос новичка

Сообщение gojko » 12 авг 2010, 12:09

Дорогие участники форума, еще один ламерский вопрос!

Свой mapfile я настроил в точности с инструкциями: http://gis-lab.info/qa/mapserver-getfeatureinfo.html.
Запрос у меня должен возвращаться в формате text/plain.

Однако никак не получается вывести GetfeatureInfo в OL, хотя все слои прекрасно отображаются. Просмотр примеров кода не дал мне ответа на мой вопрос. Хочу кликом мышки по полигону получить popup с атрибутами, подскажите, пожалуйста, что нужно для этого добавить в код?
Пока понял, что в код нужно добавить function (load) вместо function (init), function (add popup), function (showInfo)...правильно? Или что-то еще?

Заранее благодарен всем, кто откликнется!

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

Re: GetFeatureInfo - вопрос новичка

Сообщение Mavka » 12 авг 2010, 12:56

Пример (код) - включите тематические слои и посмотрите на popup'ы

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

wms_info = new OpenLayers.Control.WMSGetFeatureInfo({
    title: 'wmsinfo',
    layers: [thematic_1, thematic_2, thematic_3, oopt],
    url: 'http://gis-lab.info:8180/geoserver/wms',
    infoFormat: 'application/vnd.ogc.gml',
    queryVisible: true
});
wms_info.events.register('getfeatureinfo', this, showInfo);
map.addControl(wms_info);
wms_info.activate();
...
function showInfo(e) {
    ...
} 
лангольеры под окном жрали время ом-ном-ном

gojko
Интересующийся
Сообщения: 18
Зарегистрирован: 28 июл 2009, 09:40
Репутация: 0

Re: GetFeatureInfo - вопрос новичка

Сообщение gojko » 12 авг 2010, 15:37

Большое спасибо за отклик, но, к сожалению, мне этот код пока не помогает.

Мне непонятно самое главное - как заставить WMS выдавать информацию по клику мышкой? Какой оператор в коде за это отвечает?

Вы извините, что я прошу дать мне подробную инструкцию, но я в этом вопросе совсем новичок, и освоение дается пока что с трудом)

Спасибо!

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

Re: GetFeatureInfo - вопрос новичка

Сообщение Mavka » 12 авг 2010, 15:50

Само обращение к серверу WMS выглядит так:

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

http://gis-lab.info:8180/geoserver/wms?
<-- общая часть запроса WMS -->
SERVICE=WMS&
VERSION=1.1.1&
LAYERS=geosample:soils&
BBOX=75.805458,48.274987,89.139542,58.066013&
HEIGHT=514&WIDTH=700&
FORMAT=image/png&
INFO_FORMAT=application/vnd.ogc.gml&
SRS=EPSG:4326&
<-- непосредственно запрос информации -->
REQUEST=GetFeatureInfo&
QUERY_LAYERS=geosample:soils&
FEATURE_COUNT=10&
X=448&Y=263
Где задаются географические координаты углов карты и относительные координаты пикселя, по которому запрашивается информация.

Теперь по коду:
  1. Создаем контроллер - new OpenLayers.Control.WMSGetFeatureInfo
  2. Говорим, что при возникновении события 'getfeatureinfo' (получили ответ на запрос) вызвать функцию showInfo
  3. Добавляем контроллер на карту и активируем его (addControl и activate)
  4. Сама функция showInfo (ее текст смотрите по ссылке в пред. посте)
На этапе 4, если в Firebug поставить бряк на первую строчку функции showinfo, в параметре 'e' уже можно подсмотреть ответ сервера.
выдавать информацию по клику мышкой? Какой оператор в коде за это отвечает?
Нужно зарегистрировать обработчик событий "клик мышью" на div с картой. Примерно так. Тогда при щелчке будет вызываться приписанная функция. В этой функции вы должны сами прописать все параметры запроса (см. начало поста), отправить и принять его. Вот это все и делает контроллер WMSGetFeatureInfo.
лангольеры под окном жрали время ом-ном-ном

gojko
Интересующийся
Сообщения: 18
Зарегистрирован: 28 июл 2009, 09:40
Репутация: 0

Re: GetFeatureInfo - вопрос новичка

Сообщение gojko » 12 авг 2010, 16:25

Спасибо!
Подскажите, а обращение к серверу WMS надо писать в адресной строке? И как я могу посмотреть аналогичное обращение к своему серверу WMS?

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

Re: GetFeatureInfo - вопрос новичка

Сообщение Mavka » 12 авг 2010, 16:48

Да, это обычный url, только уберите <комментарии> и все соберите в одну строку.
Если подключитесь к WMS серверу из Quantum GIS (или аналога), то в нем можно инструментом "Определить объекты" пощелкать по карте. Убедиться что ответы приходят. А какие запросы к MapServer уходят узнать в логах Apache.
лангольеры под окном жрали время ом-ном-ном

gojko
Интересующийся
Сообщения: 18
Зарегистрирован: 28 июл 2009, 09:40
Репутация: 0

Re: GetFeatureInfo - вопрос новичка

Сообщение gojko » 17 авг 2010, 14:50

Я не программист... к сожалению, совет, данный mavka, так и не помог мне.
По поводу пунктов 1,2,3 - вот мой пример -

var wms_info = new OpenLayers.Control.WMSGetFeatureInfo({
url: 'http://localhost/cgi-bin/mapserv.exe?ma ... /U4MDB.map&',
title: 'wmsinfo',
layers: [wms],
infoFormat: 'text/plain',
queryVisible: true
});
wms_info.events.register('getfeatureinfo', this, showInfo);
map.addControl(wms_info);
wms_info.activate();

- мне вроде бы все понятно. Но пункт 4 - создать функцию ShowInfo и прикрутить ее к движениям мыши - для меня до сих пор в тумане. В примере http://openlayers.org/dev/examples/getf ... ntrol.html, скажем, этого не указано.
Помогите, добрые люди, покажите код, где явно понятно, как движения мыши связать с getfeatureinfo! Буду очень благодарен.

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

Re: GetFeatureInfo - вопрос новичка

Сообщение Mavka » 01 сен 2010, 20:29

Если вам нужно, что бы запросы отправлялись не только на щелчок мышкой, но и просто при движении, то для этого в том же контроллере есть hover.

Жаль что мое объяснение вам ничего не дает :(
лангольеры под окном жрали время ом-ном-ном

oxch
Участник
Сообщения: 53
Зарегистрирован: 04 мар 2010, 11:30
Репутация: 0
Откуда: Комсомольск-на-Амуре
Контактная информация:

Re: GetFeatureInfo - вопрос новичка

Сообщение oxch » 04 сен 2010, 12:46

Я реализую получение информации в Popup таким образом:

// создаю слой:
var layer = new OpenLayers.Layer.WMS('layer info',
'http://www.kmsmap.ru:8080/geoserver/wms',
{'layers': 'kmsmap:adr_pnt_clients'},
{isBaseLayer: false}
);
// создаю контроллер для слоя
var layer_ctrl = new OpenLayers.Control.WMSGetFeatureInfo({
url: 'http://www.kmsmap.ru:8080/geoserver/wms',
title: 'title control',
layers: [layer],
queryVisible: true
}
);
// подключаю слой:
map.addLayer(layer);
// определяю события на которое должен реагировать контроллер и функцию какую должен при этом вызывать
// showInfo - это имя вызываемой функции
layer_ctrl.events.register('getfeatureinfo', this, showInfo);
// подключаем контроллер и активируем его
map.addControl(layer_ctrl);
kmsmap_ctrl.activate();

Все что выше, обычно располагается в функции init(), вызываемой при загрузке страницы.

Функция showInfo у меня реализована так:

function showInfo(evt) {
var popup_markers = new OpenLayers.Popup.FramedCloud(
"chicken",
map.getLonLatFromPixel(evt.xy), // определяем координаты для popup-окна по месту клика мыши
null,
evt.text, // в этой переменной текст, вернутый geoserver'ом
null,
true
);
map.addPopup(popup_markers);
}

На самом деле все просто, но если ты идешь первый раз....
Чудес на свете не бывает, они просто случаются.
Знать - значит уметь использовать.
Интерактивная карта-схема Хабаровского края

dravig
Участник
Сообщения: 54
Зарегистрирован: 18 мар 2010, 16:58
Репутация: 0

Re: GetFeatureInfo - вопрос новичка

Сообщение dravig » 23 сен 2010, 12:33

Тоже столкнулся с этой проблемой (работаю с Mapserver+OpenLayers), и появился ряд нерешенных вопросов:
1. что определяет параметр "е" (в нижнем примере "evt") в функции showinfo?
2. oxch пишет
evt.text, // в этой переменной текст, вернутый geoserver'ом
Как это должно выглядеть при работе с mapserver
3. в примере этом функция "function info ()" заменена на "function load ()" ... какой в этом физический смысл?

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

Re: GetFeatureInfo - вопрос новичка

Сообщение Mavka » 24 сен 2010, 10:30

1. Когда сработает функция showinfo в параметре 'e' будет содержаться ответ сервера - аттрибуты и геометрия. Поставьте breakpoint в Firebug и посмотрите содержимое переменной, все сразу поймете.
2. Вот тут - в самом конце раздела 'text/plain'.
3. Ммм... сейчас там "function showInfo(evt)" точно как в примерах выше. Поясните.
Последний раз редактировалось Mavka 24 сен 2010, 12:15, всего редактировалось 1 раз.
лангольеры под окном жрали время ом-ном-ном

dravig
Участник
Сообщения: 54
Зарегистрирован: 18 мар 2010, 16:58
Репутация: 0

Re: GetFeatureInfo - вопрос новичка

Сообщение dravig » 24 сен 2010, 11:39

Извиняюсь, вышла описка: имел ввиду "function init()"

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

Re: GetFeatureInfo - вопрос новичка

Сообщение Mavka » 24 сен 2010, 12:14

В html-документе в тэге <body onload="my_function()"> вы указываете функцию, которая будет вызвана по окончании загрузки всего документа. Как ее называть не принципиально.
лангольеры под окном жрали время ом-ном-ном

dravig
Участник
Сообщения: 54
Зарегистрирован: 18 мар 2010, 16:58
Репутация: 0

Re: GetFeatureInfo - вопрос новичка

Сообщение dravig » 05 окт 2010, 15:09

Какую функциональную нагрузку несет строчка 'OpenLayers.ProxyHost= ', ведь простейшие карты работают без нее?

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

Re: GetFeatureInfo - вопрос новичка

Сообщение Mavka » 05 окт 2010, 16:17

Она нужна, если вы используете сторонний wms-сервер (на другом сервере или порте).
лангольеры под окном жрали время ом-ном-ном

Ответить

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

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

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