OpenLayers WMSGetFeatureInfo пример

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Аватара пользователя
Pavel
Активный участник
Сообщения: 171
Зарегистрирован: 15 июл 2009, 07:45
Репутация: 7

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение Pavel » 29 сен 2011, 13:35

Хорошо. Вот:
Спойлер

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

<html>
    <head>
<link rel="stylesheet" type="text/css" href="http://localhost:8080/geoserver/openlayers/theme/default/style.css"/>
 
    <script
    src="http://192.168.1.3:8080/geoserver/openlayers/lib/OpenLayers.js" type="text/javascript"></script>
   
              <script defer="defer" type="text/javascript">
    var info;
function load() {

       var bounds = new OpenLayers.Bounds(...);
       var options = {                   
                        controls:[],
                        maxExtent: bounds,
                        maxResolution: 147.527050781249955,
                        projection: "EPSG:32638",
                        units: 'm'

                    };
            var map = new OpenLayers.Map('map', options);
            var wms = new OpenLayers.Layer.WMS( "test",
                "http://192.168.1.3:8080/geoserver/nurc/wms",
    {layers: 'nurc:poligon_test',
    STYLES: 'PH-test',format: 'image/gif'
    }
    );
            map.addLayer(wms);
            map.zoomToMaxExtent();
    // build up all controls
                    map.addControl(new OpenLayers.Control.PanZoomBar({
                        position: new OpenLayers.Pixel(2, 15)
                    }));
                    map.addControl(new OpenLayers.Control.Navigation());
                    map.addControl(new OpenLayers.Control.Scale($('scale')));
          
                    //map.addControl(new OpenLayers.Control.MousePosition({element: $('location')}));
                    map.zoomToExtent(bounds);
      wms_info = new OpenLayers.Control.WMSGetFeatureInfo({
          title: 'wmsinfo',
          layers: [wms],
          url: 'http://192.168.1.3:8080/geoserver/nurc/wms',
          infoFormat: 'application/vnd.ogc.gml',
          queryVisible: true
       });
       wms_info.events.register('getfeatureinfo', this, showInfo);
       map.addControl(wms_info);
       wms_info.activate();

       map.zoomToMaxExtent();

    function showInfo(e) {
       var reg = /^reg\./;
    var text = '';
       for(i in e.features) {
          if (i != 0) text += '<br>';
          if (reg.test(e.features[i].fid)) {
             if (e.features.length != 1)
                text += '<b>Цвет:</b><br>';
             text += e.features[i].attributes.A+ ' "'
          }
    }
    var popup = new OpenLayers.Popup.FramedCloud("popup",
                   map.getLonLatFromPixel(e.xy),
                   new OpenLayers.Size(640,480),
                   text,
                   null,
                   true
                );
       map.addPopup(popup);
    }
           }
</script>
 </head>
 <body onload="load()">
 <div style="width: 640px; height: 480px; border: 2px solid black;" id="map"></div>
<div>test</div>
</body>
</html>
Быстро, качественно, недорого - выбирайте любые два пункта...

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение Denis Rykov » 29 сен 2011, 13:44

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

var bounds = new OpenLayers.Bounds(...);
Прям так и написано?
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Pavel
Активный участник
Сообщения: 171
Зарегистрирован: 15 июл 2009, 07:45
Репутация: 7

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение Pavel » 29 сен 2011, 13:52

Нет. Там нормальные координаты. Карта отображается правильно. Трудности возникают только при попытке сделать что-нибудь отличное от приблизить/отдалить/переместить.
Быстро, качественно, недорого - выбирайте любые два пункта...

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение Denis Rykov » 30 сен 2011, 06:47

Похоже на проблему отображения попапа в случае пустого ответа. Попробуйте перед var popup = new OpenLayers.Popup.FramedCloud написать следующую строку, должно помочь:

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

(text === '') ? text = '&nbsp' : text = text; 
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Pavel
Активный участник
Сообщения: 171
Зарегистрирован: 15 июл 2009, 07:45
Репутация: 7

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение Pavel » 30 сен 2011, 07:35

Спасибо! Помогло!:)

Ну и на закуску.:)

При щелчке на объект показывает пустое всплывающее окошко.
В ошибках:

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

Ошибка: элемент не найден
Источник: http://127.0.0.1/exapmle3.html
Строка: 1
Смотреть опять в сторону html?
Быстро, качественно, недорого - выбирайте любые два пункта...

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение Denis Rykov » 30 сен 2011, 08:34

От сервера ответ приходит? Вот попытался воспроизвести ваш проект, только с другим WMS.
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Pavel
Активный участник
Сообщения: 171
Зарегистрирован: 15 июл 2009, 07:45
Репутация: 7

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение Pavel » 30 сен 2011, 09:02

Ответы приходят, окошки выскакивают. Но в них пусто.
(см.вложение)

Я начинаю подозревать, что проблемы в самом слое. С атрибутикой.
Сейчас посмотрел исходный код (и ваш и мой) и возникли два вопроса. Если ошибаюсь, то поправьте меня:
1.

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

text += e.features[i].attributes.address+ ' "'
Я так понимаю здесь address - это колонка в таблице атрибутов?

2.

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

var reg = /^car/;
Что за значение такое /^car/?
Вложения
Снимок.png
Снимок.png (25.98 КБ) 13581 просмотр
Быстро, качественно, недорого - выбирайте любые два пункта...

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение Denis Rykov » 30 сен 2011, 09:24

1. Да
2. А это я у вас взял (по сути можно без этого, но я подумал, что вы специально такое условие накрутили) - это регулярка, только у вас var reg = /^reg\./, а у меня var reg = /^car/. В условии if (reg.test(e.features.fid)) матчатся только те фичи, fid которых соответствует регулярке, то есть в моём случае -начинающиеся с "car". Я в консоль вывожу объект ответа, так что можете изучить - что приходит у меня и посмотреть, что приходит у вас. С фаербагом дружите?
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Pavel
Активный участник
Сообщения: 171
Зарегистрирован: 15 июл 2009, 07:45
Репутация: 7

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение Pavel » 30 сен 2011, 09:30

_DR_ писал(а): С фаербагом дружите?
Да.
А по поводу регулярных условий... Стянул с примера.:) Вот и пытаюсь понять, как все это делло работает.
Быстро, качественно, недорого - выбирайте любые два пункта...

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение Denis Rykov » 30 сен 2011, 09:43

Тогда сделайте по-простому. Перепишите функцию showInfo, чтобы выглядела так:

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

function showInfo(e) {
    var popup = new OpenLayers.Popup.FramedCloud("popup",
       map.getLonLatFromPixel(e.xy),
       new OpenLayers.Size(640,480),
       e.text,
       null,
       true
    );
    map.addPopup(popup);
} 
И в контроле WMSGetFeatureInfo уберите строку infoFormat: 'application/vnd.ogc.gml'. Результат.
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Pavel
Активный участник
Сообщения: 171
Зарегистрирован: 15 июл 2009, 07:45
Репутация: 7

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение Pavel » 30 сен 2011, 12:24

Как все забавно получается...

Стал проверять - openlayers.org упал...

Надеюсь, не я его сломал... :oops:
Чуть по позже попробую и отпишусь
Быстро, качественно, недорого - выбирайте любые два пункта...

Аватара пользователя
Pavel
Активный участник
Сообщения: 171
Зарегистрирован: 15 июл 2009, 07:45
Репутация: 7

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение Pavel » 03 окт 2011, 08:37

Итак... После тщательного разбора, нашел, что у меня не работает скрипт proxy.cgi. Толи поддержка не включена, толи еще что-то. Это будем копать...
При щелчке на объекте во всплывающем окне пишется

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

Access forbidden!

You don't have permission to access the requested object. It is either read-protected or not readable by the server.

If you think this is a server error, please contact the webmaster. 
Что очень странно, так как все разрешения стоят правильно.

Исходя из этого вопрос: можно ли использовать popup без объявления прокси? Этот скрипт обязателен для всех запросов GetFeatureInfo? Или можно обойтись без него?
Быстро, качественно, недорого - выбирайте любые два пункта...

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение Denis Rykov » 03 окт 2011, 09:42

Да, для запроса данных по AJAX - прокси обязателен.
Spatial is now, more than ever, just another column- The Geometry Column.

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

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение Mavka » 03 окт 2011, 15:52

Cross-domain security - viewtopic.php?f=41&t=6353
P.S. Проверьте путь к python
лангольеры под окном жрали время ом-ном-ном

Аватара пользователя
Pavel
Активный участник
Сообщения: 171
Зарегистрирован: 15 июл 2009, 07:45
Репутация: 7

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение Pavel » 05 окт 2011, 07:33

Получилось наконец-то запустить все это дело! Правда, как всегда с костылями...

Пришлось отказаться от апача (так и не смог настроить в нем cgi и привязать к питону, что странно) и поставить nginx. Несколько "легких" движений и все заработало.

_DR_ и Mavka , большое спасибо за помощь и разъяснения!
Быстро, качественно, недорого - выбирайте любые два пункта...

Ответить

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

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

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