Дипломная работа по Mapserver. Редактирование объектов.

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
rossomaha20101
Новоприбывший
Сообщения: 9
Зарегистрирован: 29 май 2013, 19:40
Репутация: 0

Дипломная работа по Mapserver. Редактирование объектов.

Сообщение rossomaha20101 »

Добрый день. Пишу диплом по Mapserver. Суть такая: получить карту с Mapserver и при клике на карту выбранный объект должен выделяться. Затем он отрисовывается на canvas и редактируется. Но я не могу понять как получить информацию об этом объекте(нужно знать и координаты объекта в проекции и его же координаты на экране для того чтоб отрисовать его на canvas). А потом если отрдактируется объект, тоизменённые координаты тоже надо получить в проекции. Пока что написала только вот это.

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

<html>
	<head>
  		<title>OpenLayers Example</title>
    		<script src="/workshop/local/OpenLayers-2.12/OpenLayers.js"></script>
    	</head>
    	<body onload="init()">
      		<div style="width:100%; height:100%" id="map"></div>
      		<script type="text/javascript">
			function init()
			{
    				options = {
        				div: "map",
        				maxExtent: new OpenLayers.Bounds(388107.634400379, 5203120.88405952, 500896.339019834, 5310243.30613897),
        				projection: new OpenLayers.Projection("EPSG:26915"),
        				layers: [
            					layer_drgs = new OpenLayers.Layer.WMS( "drgs",
            						"http://localhost/cgi-bin/mapserv?map=/var/www/mapserverdemo/workshop/itasca.map&",
            						{
                						layers: "drgs",
                						srs:"EPSG:26915",
                						transparent: true
            						},
            						{
                						singleTile: true,
                						ratio: 1,
                						isBaseLayer: false
            						}),
            					layer_airports = new OpenLayers.Layer.WMS( "airports",
            						"http://localhost/cgi-bin/mapserv?map=/var/www/mapserverdemo/workshop/itasca.map&",
            						{
                						layers: "airports",
                						srs:"EPSG:26915",
                						transparent: true,
                						visibility: true
            						},
            						{
                						singleTile: true,
                						ratio: 1,
                						isBaseLayer: false
            						}),
            					layer_majrdln3 = new OpenLayers.Layer.WMS( "majrdln3",
            						"http://localhost/cgi-bin/mapserv?map=/var/www/mapserverdemo/workshop/itasca.map&",
            						{
                						layers: "majrdln3",
                						srs:"EPSG:26915",
                						transparent: true,
                						visibility: true
            						},
            						{
                						singleTile: true,
                						ratio: 1,
                						isBaseLayer: false
            						}),
            					layer_dlgstln2 = new OpenLayers.Layer.WMS( "dlgstln2",
            						"http://localhost/cgi-bin/mapserv?map=/var/www/mapserverdemo/workshop/itasca.map&",
            						{
                						layers: "dlgstln2",
                						srs:"EPSG:26915",
                						transparent: true,
                						visibility: true
            						},
            						{
                						singleTile: true,
                						ratio: 1,
                						isBaseLayer: false
            						}),
            					layer_lakespy2 = new OpenLayers.Layer.WMS( "lakespy2",
            						"http://localhost/cgi-bin/mapserv?map=/var/www/mapserverdemo/workshop/itasca.map&",
            						{
                						layers: "lakespy2",
                						srs:"EPSG:26915",
                						transparent: true,
                						visibility: true
            						},
            						{
                						singleTile: true,
                						ratio: 1,
                						isBaseLayer: false
            						}),
            					layer_ctybdpy2 = new OpenLayers.Layer.WMS( "ctybdpy2",
            						"http://localhost/cgi-bin/mapserv?map=/var/www/mapserverdemo/workshop/itasca.map&",
            						{
                						layers: "ctybdpy2",
                						srs:"EPSG:26915",
                						transparent: true,
                						visibility: true
            						},
            						{
                						singleTile: true,
                						ratio: 1,
                						isBaseLayer: true
            						}),
            					layer_mcd90py2 = new OpenLayers.Layer.WMS( "mcd90py2",
            						"http://localhost/cgi-bin/mapserv?map=/var/www/mapserverdemo/workshop/itasca.map&",
            						{
                						layers: "mcd90py2",
                						srs:"EPSG:26915",
                						transparent: true,
                						visibility: true
            						},
            						{
                						singleTile: true,
                						ratio: 1,
                						isBaseLayer: false
            						}),
            					layer_twprgpy3 = new OpenLayers.Layer.WMS( "twprgpy3",
            						"http://localhost/cgi-bin/mapserv?map=/var/www/mapserverdemo/workshop/itasca.map&",
            						{
                						layers: "twprgpy3",
                						srs:"EPSG:26915",
                						transparent: true,
                						visibility: true
            						},
            						{
                						singleTile: true,
                						ratio: 1,
                						isBaseLayer: false
            						}), 
            					layer_ctyrdln3 = new OpenLayers.Layer.WMS( "ctyrdln3",
            						"http://localhost/cgi-bin/mapserv?map=/var/www/mapserverdemo/workshop/itasca.map&",
            						{
                						layers: "ctyrdln3",
                						srs:"EPSG:26915",
                						transparent: true,
                						visibility: true
            						},
            						{
                						singleTile: true,
                						ratio: 1,
                						isBaseLayer: false
            						}),
            					layer_ctyrdln3_anno = new OpenLayers.Layer.WMS( "ctyrdln3_anno",
            						"http://localhost/cgi-bin/mapserv?map=/var/www/mapserverdemo/workshop/itasca.map&",
            						{
                						layers: "ctyrdln3_anno",
                						srs:"EPSG:26915",
                						transparent: true,
                						visibility: true
            						},
            						{
                						singleTile: true,
                						ratio: 1,
                						isBaseLayer: false
            						}),
            					layer_majrdln3_anno = new OpenLayers.Layer.WMS( "majrdln3_anno",
            						"http://localhost/cgi-bin/mapserv?map=/var/www/mapserverdemo/workshop/itasca.map&",
            						{
                						layers: "majrdln3_anno",
                						srs:"EPSG:26915",
                						transparent: true,
                						visibility: true
            						},
            						{
                						singleTile: true,
                						ratio: 1,
                						isBaseLayer: false
            						}),
            					layer_mcd90py2_anno = new OpenLayers.Layer.WMS( "mcd90py2_anno",
            						"http://localhost/cgi-bin/mapserv?map=/var/www/mapserverdemo/workshop/itasca.map&",
            						{
                						layers: "mcd90py2_anno",
                						srs:"EPSG:26915",
                						transparent: true,
                						visibility: true
            						},
            						{
                						singleTile: true,
                						ratio: 1,
                						isBaseLayer: false
            						})
        					]
    					};
    				map = new OpenLayers.Map(options);
    				map.zoomToMaxExtent();
    				// шкала для выбора заранее настроенного масштаба
	  			map.addControl(new OpenLayers.Control.PanZoomBar());

      				// панель инструментов (сдвиг и масштабирование)
	  			//map.addControl(new OpenLayers.Control.MouseToolbar());

	  			// переключатель видимости слоев
      				map.addControl(new OpenLayers.Control.LayerSwitcher({'ascending':false}));

      				// координаты текущего положения мыши
      				map.addControl(new OpenLayers.Control.MousePosition());

	  			// обзорная карта
      				map.addControl(new OpenLayers.Control.OverviewMap());

   	  			// горячие клавиши
      				map.addControl(new OpenLayers.Control.KeyboardDefaults());
      				
      				
				function showInfo(e) {
       					var popup = new OpenLayers.Popup.FramedCloud("popup",
                   				map.getLonLatFromPixel(e.xy),
                   				new OpenLayers.Size(120,120),
                   				e.text,
                   				null,
                   				true
                				);
       					map.addPopup(popup);
    				}   
				var click_ctrl = new OpenLayers.Control.WMSGetFeatureInfo({
    					url: "http://localhost/cgi-bin/mapserv?map=/var/www/mapserverdemo/workshop/itasca.map",
    					layers: [layer_airports],
    					queryVisible: true,
    					infoFormat: 'application/vnd.ogc.gml',
    					autoActivate: true,
    					vendorParams: {radius: 10 },
					eventListeners: {
        					'getfeatureinfo': function(e) {
            						console.log(e);
      							console.log(e.xy);
      							console.log('freeText');
            						map.addPopup(new OpenLayers.Popup.FramedCloud(
                        					"chicken", 
                        					map.getLonLatFromPixel(e.xy),
                        					null,
                        					e.xy,
                        					null,
                        					true
                    			));

        			}
   			}
			});
			map.addControl(new OpenLayers.Control.LayerSwitcher());
			//click_ctrl.events.register('getfeatureinfo', this, showInfo);
			map.addControl(click_ctrl);
			//click_ctrl.activate();


			//map.addControl(new OpenLayers.Control.CustomNavToolbar());
			}
		</script>
	</body>
</html>
Ещё был такой вариант пересчёта координат, но я не до конца поняла как потом наложить под него правильно подложку.

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

<html>
	<canvas id="canv" width="870px" height="470px" style="position: absolute; left: 1px; top: 1px; z-index: 1; border: solid 2px;">
	</canvas>
	<img id="cat" src="/workshop/graphics/reference.png" alt="Спящий кот" width="470" height="470">
	<script type="text/javascript">
		canva = document.getElementById("canv");
		ctx = canva.getContext("2d");
		//var pic = new Image(); // "Создаём" изображение
    		//pic.src = "/111111.png";
		//ctx.drawImage(pic, 0, 0);
		//ctx.fillRect(20,20,400,400);
		//canva.style.display = "none";
		
		
		// Global coord map
		x_1_g = 388107.634400379;
		y_1_g = 5203120.88405952;
		x_2_g = 500896.339019834;
		y_2_g = 5310243.30613897;
		
		
		// Width and Height global map
		w_g = x_2_g - x_1_g;
		h_g = y_2_g - y_1_g;
		if(h_g > 470)
		{
			//document.write(w_g+"<br>");
			//document.write(h_g+"<br>");
			h_g = h_g/1000;
			//document.write(h_g+"<br>");
		}
		
		// Global coord point
		x_p_g = 469137.000000;
		y_p_g = 5271647.000000;
		
		
		// Global coord with null
		x_p_g_m = x_p_g - x_1_g;
		y_p_g_m = y_p_g - y_1_g;
		
		x_p_g_m = x_p_g_m/1000;//
		y_p_g_m = y_p_g_m/1000;//
		//document.write(x_p_g_m+"<br>");
		//document.write(y_p_g_m+"<br>");
		// 
		pix_x = w_g/870;
		pix_y = h_g/470;
		//document.write(pix+"<br>");
		l_x = x_p_g_m/pix_x;
		l_y = y_p_g_m/pix_y;
		//document.write(l_x+"<br>");
		//document.write(l_y+"<br>");
		
		x = x_p_g - x_1_g;
		y = y_1_g - y_p_g;
		
		//document.write(x+"<br>");
		//document.write(y+"<br>");

var cat = document.getElementById("cat");
ctx.drawImage(cat,0,0,470,470);

		ctx.fillRect(x_p_g_m,y_p_g_m,4,4);
	</script>
</html>
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Дипломная работа по Mapserver. Редактирование объектов.

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

Какой-то велосипед, почему бы не дать возможность отрисовки объектов самому OpenLayers, да и инструменты редактирования в OpenLayers довольно богатые.
Spatial is now, more than ever, just another column- The Geometry Column.
rossomaha20101
Новоприбывший
Сообщения: 9
Зарегистрирован: 29 май 2013, 19:40
Репутация: 0

Re: Дипломная работа по Mapserver. Редактирование объектов.

Сообщение rossomaha20101 »

Вот и мучаюсь со своим велосипедом. Просто я первый раз имею дело с Mapserver и OpenLayers. До этого написала в качестве курсовой работы редактор векторной графики на canvas и преподаватель подумал, что в качестве диплома можно было бы использовать его в качестве редактора для электронных карт. Потом столкнулись с тем, что моя версия Mapserver не поддерживает транзакции. Это было перед предзащитой. Вот теперь срок дали до 13 всё переделать. Не подскажите где можно найти пример такого редактирования или документацию по данной библиотеке.(чтобы очень доступно было написано). А то я честно говоря с тем что нашла вообще методом тыка делаю. Читала тему viewtopic.php?t=2014&p=60451 . На основе прочитанного попыталась сделать. Но наверное что-то не так потому что у меня определяются локальные точки как мне кажется. А как редактирование сделать так и не поняла.
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Дипломная работа по Mapserver. Редактирование объектов.

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

Если нужно именно редактирование, то публикуете данные по WFS-T (TinyOWS, GeoServer) и подключаете слой в OpenLayers, добавляете нужные контролы и все. Но тогда не понятно в чем будет суть диплома. Вот пример.
Spatial is now, more than ever, just another column- The Geometry Column.
rossomaha20101
Новоприбывший
Сообщения: 9
Зарегистрирован: 29 май 2013, 19:40
Репутация: 0

Re: Дипломная работа по Mapserver. Редактирование объектов.

Сообщение rossomaha20101 »

Спасибо за пример) А что вы тогда можете альтернативное посоветовать на mapserver сделать? Мой научный руководитель хочет, чтобы например было так: происходит клик на объекте и он выделяется. Затем каким-то образом прорисовывается на canvas. Там он редактируется и отредактированный объект записывается в txt файл вместе с именем слоя, его id и т.д. Мне кажется это бредом. Вроде как он говорит, что вот когда у Mapserver появятся транзакции, то мы сможет использовать этот редактор и передавать эти данные не в файл txt, а например по протоколу wfs-t. Но он не понимает, что подобное уже существует. Ведь этот пример можно будет использовать и на Mapserver, когда у него появятся транзакции.
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Дипломная работа по Mapserver. Редактирование объектов.

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

Я не понял, что значит прорисовывается на canvas? canvas - это рендерер и если вы передаете на клиента данные в векторном виде, то он рендерится на нем же, хоть с помощью canvas, хоть с помощью svg. То ест если вы кликаете на объекте, он уже отрендерен, зачем его опять рендерить с помощью canvas?
Spatial is now, more than ever, just another column- The Geometry Column.
ericsson
Гуру
Сообщения: 3321
Зарегистрирован: 27 июл 2009, 19:26
Репутация: 748
Ваше звание: Вредитель полей

Re: Дипломная работа по Mapserver. Редактирование объектов.

Сообщение ericsson »

Вопрос переходит из технологической плоскости в плоскость психиатрическую: как объяснить научному руководителю в обсессивном состоянии, что предлагаемое им - бред.
Смею предположить, что требуется медикаментозное лечение. По науке - бензодиазепинами, по-простому - постоянным употреблением алкоголя, услужливо предоставленного подневольными студентами.
rossomaha20101
Новоприбывший
Сообщения: 9
Зарегистрирован: 29 май 2013, 19:40
Репутация: 0

Re: Дипломная работа по Mapserver. Редактирование объектов.

Сообщение rossomaha20101 »

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

Re: Дипломная работа по Mapserver. Редактирование объектов.

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

Очевидно же, что нигде. В рецептах можете что-то полезное найти. А вообще у OL довольно хорошая документация + очень много примеров на официальном сайте, которые покрывают большинство задач (только сегодня что-то поломали в транке и в настоящий момент примеры не работают, уверен скоро поправят).
Spatial is now, more than ever, just another column- The Geometry Column.
rossomaha20101
Новоприбывший
Сообщения: 9
Зарегистрирован: 29 май 2013, 19:40
Репутация: 0

Re: Дипломная работа по Mapserver. Редактирование объектов.

Сообщение rossomaha20101 »

А как можно отобразить WFS слой в MapServer? В рецептах написано только про GeoServer.

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

layer_WFS = new OpenLayers.Layer.Vector("editLayer", 
					{
						projection: projection,
						layer: "airports",
						url: mapservPath,
						featureNS:"/data",
						featureType: "airports",
						protocol: new OpenLayers.Protocol.WFS({
            						version: "1.0.0",
            						srsName: "EPSG:26915"
        						})
					});
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Дипломная работа по Mapserver. Редактирование объектов.

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

Слой нужно отображать не в MapServer, а в клиентском приложении (хотя MapServer может выступать и в роли клиента). Подключается он в OpenLayers точно так же, как и слой, опубликованный по WFS с помощью GeoServer - никакой принципиальной разницы. В документации все описано. Вы читали? Но слой, опубликованный по WFS нельзя отредактировать и сохранить изменения, для этого служит WFS-T, поэтому если хотите редактировать, то MapServer - это не ваш случай.
Spatial is now, more than ever, just another column- The Geometry Column.
rossomaha20101
Новоприбывший
Сообщения: 9
Зарегистрирован: 29 май 2013, 19:40
Репутация: 0

Re: Дипломная работа по Mapserver. Редактирование объектов.

Сообщение rossomaha20101 »

Попробовала просто создавать два слоя и на первом отрисовывать подложку wms, а на втором нарисовать точку. Всё равно не работает.... Подложка отрисовывается, а точка нет.

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

function init()
			{
				// переменные
				
				// границы
				var bounds = new OpenLayers.Bounds(388107.634400379, 5203120.88405952, 500896.339019834, 5310243.30613897);
				var srs = "EPSG:26915";
				var projection = new OpenLayers.Projection(srs);
				var mapservPath = "http://localhost/cgi-bin/mapserv?map=/var/www/mapserverdemo/workshop/itasca.map";
				var baseLayers = "drgs,twprgpy3";
				
				// слой подложки
				var layer_WMS = new OpenLayers.Layer.WMS( 
									"baseLayer",
									mapservPath,
									{layers: baseLayers, srs: srs, transparent: true},
									{singleTile: true, ratio: 1, isBaseLayer: true}
								);
				var layer_WFS = new OpenLayers.Layer.Vector(
									"editLayer"
									);
				var options = {
					div: "map",
        				maxExtent: bounds,
        				projection: projection,
        				displayProjection: projection,
        				restrictedExtent: bounds,
        				layers: [layer_WMS,layer_WFS]
    					};
				map = new OpenLayers.Map(options);
				map.setCenter(bounds.getCenterLonLat(), 1);
				OpenLayers.Feature.Vector.style['default']['strokeWidth'] = '2';
				var feature = new OpenLayers.Feature.Vector(
                			OpenLayers.Geometry.fromWKT("POINT(493479.283041, 5386063.274559)"));
            			layer_WFS.addFeatures([feature]);					
			}
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Дипломная работа по Mapserver. Редактирование объектов.

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

Сначала убедитесь в том, что ваш wfs сервис работает, то есть откройте его в каком-нибудь настольном приложении, например в QGIS. Еще, вы используете какую-то проекцию EPSG:26915, такой OL не знает, потребуется proj4js, либо перепроецирование на серверной стороне.
Spatial is now, more than ever, just another column- The Geometry Column.
Ответить

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

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

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