OpenLayers WMSGetFeatureInfo пример

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
SantoSB
Участник
Сообщения: 67
Зарегистрирован: 10 сен 2010, 12:19
Репутация: 0

OpenLayers WMSGetFeatureInfo пример

Сообщение SantoSB » 20 апр 2011, 13:14

Здравствуйте! у меня OpenLayers+WMS необходимо получить информацию об объекте по клику на него. нашел следующи пример использования WMSGetFeatureInfo пример После добавления

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

infoControls = {
            click: new OpenLayers.Control.WMSGetFeatureInfo({
                url: 'http://demo.opengeo.org/geoserver/wms', 
                title: 'Identify features by clicking',
                layers: [water],
                queryVisible: true
            }),
            hover: new OpenLayers.Control.WMSGetFeatureInfo({
                url: 'http://demo.opengeo.org/geoserver/wms', 
                title: 'Identify features by clicking',
                layers: [water],
                hover: true,
                // defining a custom format options here
                formatOptions: {
                    typeName: 'water_bodies', 
                    featureNS: 'http://www.openplans.org/topp'
                },
                queryVisible: true
            })
        }
OpenLayers+WMS перестает работать ничего не показывается. Если кто-то писал подобную функциональность через WMSGetFeatureInfo можете привести пример?!
Заранее спасибо!

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

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение Mavka » 20 апр 2011, 14:04

1 + 2 + 3
Все запросы к серверу прекрасно видно в Firebug на вкладке Console.
лангольеры под окном жрали время ом-ном-ном

SantoSB
Участник
Сообщения: 67
Зарегистрирован: 10 сен 2010, 12:19
Репутация: 0

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение SantoSB » 20 апр 2011, 15:42

Спасибо!

SantoSB
Участник
Сообщения: 67
Зарегистрирован: 10 сен 2010, 12:19
Репутация: 0

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение SantoSB » 21 апр 2011, 13:55

почитал ссылки!Все сделал почему-то при клике на карту в заголовке нет REQUEST код:

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

<html>
<head>
  <title>OpenLayers Example</title>
    <script
    src="../htdocs/OpenLayers.js"></script>
	 <script src="http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAINgesJb4VJ2iYHIcc-gT7hQGhS5yCmtMNZMUBKgpbJFW2uH_cRSd35D9AE7VSWY096Cd7dLkCk3bRA" type="text/javascript" encoding="utf-8"></script>

      <script defer="defer" type="text/javascript">
		var lon = 43;
		var lat = 45;
		var zoom = 8;

		function load()
		{
        var map = new OpenLayers.Map('map');
		map.addControl(new OpenLayers.Control.LayerSwitcher());

		var gmap = new OpenLayers.Layer.Google(
		"Google Streets", // the default
		{numZoomLevels: 20}
		);
		var gsat = new OpenLayers.Layer.Google(
			"Google Satellite",
			{type: G_SATELLITE_MAP, numZoomLevels: 20}
		);

        var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
            "http://localhost/cgi-bin/mapserv.exe",
			{
				map: '/ms4w/apps/tutorial/htdocs/sk2.map', 
				transparent: 'TRUE', 
				layers: 'sk_rayon_deg',
			},
			{'reproject': true} );
			
		var wms_info = new OpenLayers.Control.WMSGetFeatureInfo(
		{
                 title: 'wmsinfo',
                 layers: ['sk_rayon_deg'],
                 url: 'http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/tutorial/htdocs/sk2.map&',
                 queryVisible: true
		});
    
		map.addLayers([gsat,gmap,wms]);
		map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
		map.addControl(new OpenLayers.Control.LayerSwitcher());
		wms_info.events.register('getfeatureinfo', this, showInfo);
		map.addControl(wms_info);
		wms_info.activate();
		
		}
		function showInfo(evt) 
	        {
		var popup_markers = new OpenLayers.Popup.FramedCloud(
		"chicken",
		map.getLonLatFromPixel(evt.xy), 
		null,
		evt.text, 
		null,
		true
		);
		map.addPopup(popup_markers);
	} 
      </script>
    </head>
    <body onload="load()">
      <div style="width:100%; height:100%" id="map"></div>
</body>
</html>
это кусок кода из map файла

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

WEB
    TEMPLATE  '/ms4w/apps/tutorial/templates/template1.html'
    IMAGEPATH '/ms4w/tmp/ms_tmp/'
    IMAGEURL  '/ms_tmp/'
	METADATA
		wms_title "Заголовок"
		wms_abstract "Описание"
		wms_onlineresource "http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/tutorial/htdocs/sk2.map&"
	
       wms_getfeatureinfo "http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/tutorial/htdocs/sk2.map&"
       wms_featureinfoformat "text/plain"
		wms_feature_info_mime_type "text/html"

		wms_srs "EPSG:4326"
	END
END
Подскажите в чем может быть проблема?

SantoSB
Участник
Сообщения: 67
Зарегистрирован: 10 сен 2010, 12:19
Репутация: 0

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение SantoSB » 21 апр 2011, 13:56

почитал ссылки!Все сделал почему-то при клике на карту в заголовке нет REQUEST код:

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

<html>
<head>
  <title>OpenLayers Example</title>
    <script
    src="../htdocs/OpenLayers.js"></script>
	 <script src="http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAINgesJb4VJ2iYHIcc-gT7hQGhS5yCmtMNZMUBKgpbJFW2uH_cRSd35D9AE7VSWY096Cd7dLkCk3bRA" type="text/javascript" encoding="utf-8"></script>

      <script defer="defer" type="text/javascript">
		var lon = 43;
		var lat = 45;
		var zoom = 8;

		function load()
		{
        var map = new OpenLayers.Map('map');
		map.addControl(new OpenLayers.Control.LayerSwitcher());

		var gmap = new OpenLayers.Layer.Google(
		"Google Streets", // the default
		{numZoomLevels: 20}
		);
		var gsat = new OpenLayers.Layer.Google(
			"Google Satellite",
			{type: G_SATELLITE_MAP, numZoomLevels: 20}
		);

        var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
            "http://localhost/cgi-bin/mapserv.exe",
			{
				map: '/ms4w/apps/tutorial/htdocs/sk2.map', 
				transparent: 'TRUE', 
				layers: 'sk_rayon_deg',
			},
			{'reproject': true} );
			
		var wms_info = new OpenLayers.Control.WMSGetFeatureInfo(
		{
                 title: 'wmsinfo',
                 layers: ['sk_rayon_deg'],
                 url: 'http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/tutorial/htdocs/sk2.map&',
                 queryVisible: true
		});
    
		map.addLayers([gsat,gmap,wms]);
		map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
		map.addControl(new OpenLayers.Control.LayerSwitcher());
		wms_info.events.register('getfeatureinfo', this, showInfo);
		map.addControl(wms_info);
		wms_info.activate();
		
		}
		function showInfo(evt) 
	        {
		var popup_markers = new OpenLayers.Popup.FramedCloud(
		"chicken",
		map.getLonLatFromPixel(evt.xy), 
		null,
		evt.text, 
		null,
		true
		);
		map.addPopup(popup_markers);
	} 
      </script>
    </head>
    <body onload="load()">
      <div style="width:100%; height:100%" id="map"></div>
</body>
</html>
это кусок кода из map файла

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

WEB
    TEMPLATE  '/ms4w/apps/tutorial/templates/template1.html'
    IMAGEPATH '/ms4w/tmp/ms_tmp/'
    IMAGEURL  '/ms_tmp/'
	METADATA
		wms_title "Заголовок"
		wms_abstract "Описание"
		wms_onlineresource "http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/tutorial/htdocs/sk2.map&"
	
       wms_getfeatureinfo "http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/tutorial/htdocs/sk2.map&"
       wms_featureinfoformat "text/plain"
		wms_feature_info_mime_type "text/html"

		wms_srs "EPSG:4326"
	END
END
Подскажите в чем может быть проблема?

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

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение Mavka » 21 апр 2011, 14:47

В контроллере WMSGetFeatureInfo измените на:

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

layers: [wms] 
В Firebug через DOM докопайтесь до контроллера и проверьте какие слои он цепляет.
лангольеры под окном жрали время ом-ном-ном

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

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение Pavel » 29 сен 2011, 10:08

Доброго времени суток!
Дабы не плодить похожие темы (их и так уже хватает), отпишусь здесь:)

Все та же проблема с WMSGetFeatureInfo.
Что есть:
OpenSuse 11.3
Apache 2.2.15
GeoServer 2.1.1
WMS 1.1.1

Скрипт:
Спойлер

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

<script defer="defer" type="text/javascript">
var info;

   var bounds = new OpenLayers.Bounds(minX,minY,maxX,maxY);
   var options = {                   
                    controls:[],
                    maxExtent: bounds,
                    maxResolution: 147.527050781249955,
                    projection: "",//указана правильно
                    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: 'color',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 + ' "' +
					e.features[i].attributes.B;
		}
}
var popup = new OpenLayers.Popup.FramedCloud("popup",
					map.getLonLatFromPixel(e.xy),
					new OpenLayers.Size(200,200),
					text,
					null,
					true
				);
	map.addPopup(popup);
}
        </script>
Карта отрисовывается правильно и красиво.
При щелчке кнопкой мыши ничего не происходит, а в консоле ошибок огнелисы появляется строка:

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

Ошибка: OpenLayers.Control.WMSGetFeatureInfo is not a constructor
Источник: http://127.0.0.1/exapmle2.html
Строка: 49
Это в принципе раз.

Второй момент. Не могу понять, нужно ли в скрипте рисовать html-окружение для вывода информации (атрибутики)? Или этим занимается сам GeoServer?
Быстро, качественно, недорого - выбирайте любые два пункта...

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

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение Denis Rykov » 29 сен 2011, 11:25

Версия OpenLayers?
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, 11:35

OpenLayers 2.8

Могу ошибаться, так как взято из стандартной поставки GeoServer. То есть они уже там сами стоят:)
Во всяком случае, в ReadMe так написано.
Быстро, качественно, недорого - выбирайте любые два пункта...

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

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение Denis Rykov » 29 сен 2011, 11:46

Попробуйте новую версию, на текущий момент - это 2.11, похоже ошибка в этом.
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, 11:51

Да, спасибо! Я уже начал догадываться, куда вы намекаете.:)

Поставил 2.11. Скрипт без изменений. Все пути правильные.
При выборе объекта на карте происходит следующее:

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

Ошибка: элемент не найден
Источник: http://127.0.0.1/exapmle2.html
Строка: 1

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

Ошибка: this.size is null
Источник: http://192.168.1.3:8080/geoserver/openlayers/OpenLayers.js
Строка: 1759
exapmle2.html - это как раз и есть выполняемый скрипт.
Больше всего удивила как раз первая ошибка.

Копать уже в самом файле или все-таки это опять OpenLayers?
Быстро, качественно, недорого - выбирайте любые два пункта...

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

Re: OpenLayers WMSGetFeatureInfo пример

Сообщение Denis Rykov » 29 сен 2011, 12:37

Приведите код example2.html. Для отладки советую использовать не минифицированную версию OL.
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, 12:51

По сути, кода-то и нет. Почти.
Стандартная шапка html:
Спойлер

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

<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/OpenLayers.js" type="text/javascript"></script>
    </head>
    <body>
      <div style="width: 640px; height: 480px; border: 2px solid black;" id="map"></div>
      <script defer="defer" type="text/javascript">
...

 </script>
<div>test</div>
</body>
</html>
Быстро, качественно, недорого - выбирайте любые два пункта...

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

Re: OpenLayers WMSGetFeatureInfo пример

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

С предыдущей ошибкой разобрался: несовпадали размеры выводимой карты. Исправил на

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

...
 new OpenLayers.Size(640,480),
...
Стала выползать другая:

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

Ошибка: load is not defined
Источник: http://127.0.0.1/exapmle2.html
Строка: 1
Добавил function load() {} - вернулась страя ошибка:

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

Ошибка: this.size is null
Источник: http://192.168.1.3:8080/geoserver/openlayers/lib/OpenLayers/Popup.js
Строка: 917
Быстро, качественно, недорого - выбирайте любые два пункта...

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

Re: OpenLayers WMSGetFeatureInfo пример

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

Я не понял, new OpenLayers.Size(640,480) - это вообще к чему? Приведите полностью ваш код, а не по частям, чтобы было удобнее.
Spatial is now, more than ever, just another column- The Geometry Column.

Ответить

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

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

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