Post Reply

Geoportal raz jeszcze - warstwa wizualizacji BDOT

Post by FranekKimonoSpeedy
Ponieważ miałem chwilę wolnego czasu postanowiłem przerobić tutejszy skrypt dodający warstwy geoportalu do WME o nową warstwę - wizualizację BDOT - żeby mi ktoś nie zarzucił, że jestem programistą i się nie udzielam... (tak naprawdę to skończyłem inne studia i pracuję zupełnie w innym temacie...)

Kto ma tampermonkey może wkleić sobie zawartość tego skryptu i włączyć warstwę Geoportal - topo#1

Code: Select all

// ==UserScript==
// @name            geoportal.gov.pl layers for WME without translating PROXY
// @version         0.2.10.1
// @description     Displays layers from geoportal.gov.pl in WME
// @grant 			none
// @grant 			GM_info
// @include         https://*.waze.com/*/editor/*
// @include         https://*.waze.com/editor/*
// @include         https://*.waze.com/map-editor/*
// @include         https://*.waze.com/beta_editor/*
// @include         https://editor-beta.waze.com/*
// @copyright		2013,2014+, Patryk Ściborek, Paweł Pyrczak
// @run-at 			document-end
// @namespace https://greasyfork.org/users/193
// ==/UserScript==


function GEOPORTAL_bootstrap()
{
	var bGreasemonkeyServiceDefined = false;
	
	try {
		var ver = window.navigator.appVersion.match(/Chrome\/(.*?) /)[1];
	} catch(err) {
		var ver = null;
	}
	if (null !== ver) {
		var itschrome = true;
		///ver = "27.0.1438.7"; // last old working version
		// example: 32.0.1700.107
		// [0] - major versin
		// [2] - minor version
		ver = ver.split(".");
		ver[0] = parseInt(ver[0]);
		ver[2] = parseInt(ver[2]);
		if (ver[0] > 27) {
			var newmethod = true;
		} else if (ver[0] == 27) {
			if (ver[2] <= 1438) {
				var newmethod = false;
			} else {
				var newmethod = true;
			}
		} else {
			var newmethod = false;	
		}
	} else {
		var itschrome = false;
		var newmethod = false;
	}


	try
	{
		if ("object" === typeof Components.interfaces.gmIGreasemonkeyService)  // Firefox tells that "Components" is deprecated
		{
			bGreasemonkeyServiceDefined = true;
		}
    }	catch (err) { };

	try
	{
		if  ("object" === typeof GM_info)
		{
			bGreasemonkeyServiceDefined = true;
		}
    }	catch (err) { };    

    
	if ( "undefined" === typeof unsafeWindow  ||  ! bGreasemonkeyServiceDefined)
	{
		try {
			unsafeWindow    = ( function ()
			{
				var dummyElem   = document.createElement('p');
				dummyElem.setAttribute ('onclick', 'return window;');
				return dummyElem.onclick ();
			} ) ();
		} 
		catch (err)
		{
			//Ignore.
		}
	}

	//And check again for new chrome, and no tamper(grease)monkey
	if ( itschrome && newmethod &&  !bGreasemonkeyServiceDefined)
	{
		console.log("Geoportal: no Tampermonkey/Greasemonkey found - injecting code to page.");
		//use "dirty" but effective method with injection to document
		var DLscript = document.createElement("script");
		DLscript.textContent =''+
		geoportal_run.toString()+'unsafeWindow=window; \n'+
		'geoportal_run() \n';
		DLscript.setAttribute("type", "application/javascript");
		document.body.appendChild(DLscript);
	} else {  
		/* begin running the code! */
		console.log("Geoportal: unsafeWindow found - runing code.");
		setTimeout(geoportal_run,100);
	}
	
	
}

function geoportal_run() {

GEOPORTAL = { ver: "0.2.9" };


GEOPORTAL.init = function(w)
{
 console.log('Geoportal: start init '); 

 //wms_service="http://sdi.geoportal.gov.pl/wms_orto/wmservice.aspx?"; // layer: ORTOFOTO,ORTOFOTO_ISOK
 wms_service_orto="http://mapy.geoportal.gov.pl/wss/service/img/guest/ORTO/MapServer/WMSServer?"; // layer: Raster
 //wms_service_orto_2="http://mapproxy.sciborek.com/service?"; // layer: geoportal_orto
 wms_service_orto_2="http://sdi.geoportal.gov.pl/wms_orto/wmservice.aspx?"; // layer: ORTOFOTO,ORTOFOTO_ISOK
 wms_service_prng="http://mapy.geoportal.gov.pl/wss/service/pub/guest/G2_PRNG_WMS/MapServer/WMSServer?"; // nazwy
 wms_service_bud="http://mapy.geoportal.gov.pl/wss/service/pub/guest/G2_BDOT_BUD_2010/MapServer/WMSServer?"; // budynki
    
 wms_service_topo_1="http://mapy.geoportal.gov.pl/wss/service/pub/guest/kompozycjaG2_TBD_WMS/MapServer/WMSServer?";	// topo

    var my_wazeMap = w;
    if (typeof my_wazeMap == undefined) my_wazeMap = unsafeWindow.Waze.map;
       
        var epsg900913 = new unsafeWindow.OpenLayers.Projection("EPSG:900913");
		var epsg4326 =  new unsafeWindow.OpenLayers.Projection("EPSG:4326");
		var tileSizeG = new unsafeWindow.OpenLayers.Size(512,512);
        
        getUrl4326 = function (bounds) {
			/* this function is modified Openlayer WMS CLASS part */
			/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
			* full list of contributors). Published under the 2-clause BSD license.
			* See license.txt in the OpenLayers distribution or repository for the
			* full text of the license. */
			bounds = bounds.clone(); // Zrobione dlatego że tranformacja była dziedziczona do parenta i się sypało aż niemiło

			bounds = this.adjustBounds(bounds);
			
			var imageSize = this.getImageSize(bounds);
			var newParams = {};
			bounds.transform(this.epsg900913,this.epsg4326);
			// WMS 1.3 introduced axis order
			var reverseAxisOrder = this.reverseAxisOrder();
			newParams.BBOX = this.encodeBBOX ?
				bounds.toBBOX(null, reverseAxisOrder) :
				bounds.toArray(reverseAxisOrder);
			newParams.WIDTH = imageSize.w;
			newParams.HEIGHT = imageSize.h;
			var requestString = this.getFullRequestString(newParams);
			//this.setZIndex(3);
			//this.map.getLayersBy("uniqueName","satellite_imagery").first().setZIndex(1);
			return requestString;
        };
        
        getFullRequestString4326 = function(newParams, altUrl) {
			/* this function is modified Openlayer WMS CLASS part */
			/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
			* full list of contributors). Published under the 2-clause BSD license.
			* See license.txt in the OpenLayers distribution or repository for the
			* full text of the license. */
			var mapProjection = this.map.getProjectionObject();
			var projectionCode = this.projection.getCode();
			var value = (projectionCode == "none") ? null : projectionCode;
			if (parseFloat(this.params.VERSION) >= 1.3) {
				this.params.CRS = value;
			} else {
				this.params.SRS = "EPSG:4326"; //na sztywno najlepiej
			}
			
			if (typeof this.params.TRANSPARENT == "boolean") {
				newParams.TRANSPARENT = this.params.TRANSPARENT ? "TRUE" : "FALSE";
			}

			return unsafeWindow.OpenLayers.Layer.Grid.prototype.getFullRequestString.apply(
														this, arguments);
		};
        
    var geop_orto = new unsafeWindow.OpenLayers.Layer.WMS("Geoportal - orto#1",
			wms_service_orto,
            {
                layers: "Raster",
                format: "image/jpeg"
            },{
				tileSize: tileSizeG,
				isBaseLayer: false,
				visibility: false,
				transitionEffect: "resize",
				uniqueName: "orto1",
				epsg900913: epsg900913,
				epsg4326: epsg4326,
				getURL: getUrl4326,
				getFullRequestString: getFullRequestString4326
			});
			
		I18n.translations.en.layers.name["orto1"] = "Geoportal - orto#1";

        
       var  geop_orto2 = new OpenLayers.Layer.WMS("Geoportal - orto#2",
			wms_service_orto_2,
            {
                layers: "ORTOFOTO,ORTOFOTO_ISOK",
                format: "image/jpeg"
          },{
				tileSize: tileSizeG,
				isBaseLayer: false,
				visibility: false,
				transitionEffect: "resize",
				uniqueName: "orto2",
				epsg900913: epsg900913,
				epsg4326: epsg4326,
				getURL: getUrl4326,
				getFullRequestString: getFullRequestString4326
			})
        I18n.translations.en.layers.name["orto2"] = "Geoportal - orto#2";

    	// geoportal
        var  geop_topo1 = new OpenLayers.Layer.WMS("Geoportal - topo#1",
			wms_service_topo_1,
            {
                layers: "LasZadrz_A,Kolej_L,Zabudowa_A,NazUl_L,Bud_A,PktAdr_P,Autost_L,Tunel_L,DrEksp_L,DrGl_L,DrZb_L,DrLokUtw_L",
                format: "image/jpeg",
                transparent: "false",                
          },{
				tileSize: tileSizeG,
				isBaseLayer: false,
				visibility: false,
              	opacity: 0.3,
				transitionEffect: "resize",
				uniqueName: "topo1",
				epsg900913: epsg900913,
				epsg4326: epsg4326,
				getURL: getUrl4326,
				getFullRequestString: getFullRequestString4326
			})
        I18n.translations.en.layers.name["topo1"] = "Geoportal - topo#1";

        
        //geoportal_prng
        var geop_prng = new OpenLayers.Layer.WMS("Geoportal - nazwy",
			wms_service_prng,
			{
				layers: "Wies,Miasto,Drogi",
                transparent: "true",
                format: "image/png"
			},{
				tileSize: tileSizeG,
				isBaseLayer: false,
				visibility: false,
				uniqueName: "nazwy",
				epsg900913: epsg900913,
				epsg4326: epsg4326,
				getURL: getUrl4326,
				getFullRequestString: getFullRequestString4326
			});
        I18n.translations.en.layers.name["nazwy"] = "Geoportal - nazwy";
        
        var geop_adresy = new OpenLayers.Layer.WMS("Geoportal - adresy",
			wms_service_bud,
			{
				layers: "12,11,10,9,8,7,6,5,4,3,2,1,0",
				transparent: "true",
				format: "image/png"
			},{
				tileSize: tileSizeG,
				isBaseLayer: false,
				visibility: false,
				uniqueName: "adresy",
				epsg900913: epsg900913,
				epsg4326: epsg4326,
				getURL: getUrl4326,
				getFullRequestString: getFullRequestString4326
			});
		I18n.translations.en.layers.name["adresy"] = "Geoportal - adresy";
   
    console.log('Geoportal: adding layers');
	if(my_wazeMap.getLayersByName("Geoportal - orto").length == 0)
	{       
		my_wazeMap.addLayer(geop_orto);
		my_wazeMap.addLayer(geop_orto2);
        my_wazeMap.addLayer(geop_topo1);
		my_wazeMap.addLayer(geop_prng);
		my_wazeMap.addLayer(geop_adresy);

		console.log('Geoportal: layers added');
		this.OrtoTimer();
	}

}


GEOPORTAL.OrtoTimer = function() {
		setTimeout(function(){
			var a = unsafeWindow.Waze.map.getLayersBy("uniqueName","orto1");
			if (a[0]) a[0].setZIndex(1);
			var b = unsafeWindow.Waze.map.getLayersBy("uniqueName","orto2");
			if (b[0]) b[0].setZIndex(2);            
   			var c = unsafeWindow.Waze.map.getLayersBy("uniqueName","topo1");
			if (c[0]) c[0].setZIndex(3);
			unsafeWindow.Waze.map.getLayersBy("uniqueName","satellite_imagery").first().setZIndex(1); // mapy Googla
			GEOPORTAL.OrtoTimer();
		},500);
}


GEOPORTAL.initBootstrap = function() {
	try {
		if (undefined != typeof unsafeWindow.Waze.map.getLayersByName) {
			this.init(unsafeWindow.Waze.map);
		} else {
		console.log("Geoportal: WME not initialized yet, trying again later.");
			setTimeout(function(){
				GEOPORTAL.initBootstrap();
			},700);				
		}
	} catch (err) {
		console.log("Geoportal: WME not initialized yet, trying again later.");
		setTimeout(function(){
			GEOPORTAL.initBootstrap();
		},700);			
	}
}

GEOPORTAL.initBootstrap();

}


GEOPORTAL_bootstrap()
Mam nadzieję, że Patryk Ściborek i Paweł Pyrczak wybaczą mi taką ingerencję w kod źródłowy - tak naprawdę niewiele się zmieniło, ot dodany nowy layer do openlayers'ów.

Włączone są następujące warstwy:
LasZadrz_A,Kolej_L,Zabudowa_A,NazUl_L,Bud_A,PktAdr_P,Autost_L,Tunel_L,DrEksp_L,DrGl_L,DrZb_L,DrLokUtw_L

Oczywiście, każdy może zmodyfikować ten kod i włączyć swoje, które woli. Do wyboru :
Capabilities servera WMS dla wizualzacji BDOT (schemat XML)
albo po polsku :

Code: Select all

Warstwy BDOT:

RoslKrzew_A - Roslinność krzewiasta
LasZadrz_A - Teren leśny i zadrzewiony
Zabudowa_A - Zabudowa
TerPodDr_A - Tereny pod drogami kołowymi, szynowymi i lotniskami
KomplKom_A - Kompleks komunikacyjny
Przem_gosp_A - Kompleks przemysłowo - gospodarczy
Pozost_ter_niezab_A - Pozostały teren niezabudowany
WyrobZwal_A - Wyrobisko i zwałowisko
Nieuzytk_A - Grunt nieużytkowany
UprTrw_A - Uprawa trwała
TrawaUprRolna_A - Roślinność trawiasta i uprawa rolna
Plac_A - Plac
IUrzTechn_A - inne urządzenia techniczne
ObOrient_A - Obiekty o znaczeniu orientacyjnym w terenie (powierzchnia)
ZbTech_A - Zbiorniki techniczne
Mokradlo_A - Mokradło
Szuwary_A - Szuwary
PrzewRur_L - Przewody rurowe
 CiekOkr_L - Ciek wodny okresowy
 RzekKanal_L - Odcinki rzek i kanałów
 RzekiEt - Odcinki rzek i kanałów - etykiety
Woda_A - Woda powierzchniowa

Rezer_A - Granice rezerwatu przyrody
PK_A - Park krajobrazowy
PN_A - Granice parku narodowego

 Gmina - Granica gminy lub miasta na prawach gminy
 DzielnicaDelMiasta - Granica dzielnicy lub delegatury miasta

BudHydro_A - Budowla hydrotechniczna
BudCment_A - Budowla cmentarna
BudSport_A - Budowla sportowa
Bud_A - Budynek
BudWys_A - Budynek wysoki
BudSport_L - Budowla sportowa (linia)
ObPrzy_L - Obiekt przyrodniczy (linia)
BudZiemn_L - Budowla ziemna
UmocnKolej_L - Umocnienie drogowe kolejowe i wodne
BudHydro_L - Budowla hydrotechniczna (linia)
Przeprawa_L - Przeprawa
PomMolo_L - pomost molo
MurHist_L - Mur historyczny

 PeronRampa_A - Peron lub rampa kolejowa
 Trybuna_A - Trybuna
 
UrzTrans_L - Urzadzenie transportowe (linia)

Tramw_L - Linia tramwajowa
KolejWBud_L - Linia kolejowa w budowie

koleiWask_L - Linia kolei wąskotorowej
kolej_L - linia kolejowa

 Sciez_L - Ścieżka
 Aleja_L - Alejka lub pasaż
 
DrDoj_L - Droga dojazdowa lub inna gruntowa
DrLokGr_L - Droga lokalna gruntowa
DrLokNieutw_L - Jezdnia drogi lokalnej dojazdowej lub innej o nawierzchni utwardzonej
DrLokUtw_L - Jezdnia drogi lokalnej dojazdowej lub innej o nawierzchni twardej
DrZb_L - Jezdnia drogi zbiorczej o nawierzchni twardej
DrGl_L - Jezdnia drogi głównej
DrEksp_L - Jezdnia drogi ekspresowej lub głównej ruchu przyśpieszonego
Autost_L - Jezdnia autostrady
Tunel_L - Tunel
MostWiaduk_L - Most, wiadukt lub estakada
NazUl_L - Nazwy_ulic
PktAdr_P - Punkt adresowy
To nie są wszystkie warstwy, ale większość najbardziej interesująca z tej wizualizacji.

PROBLEMY:
- jak zwykle - geoportal długo renderuje niektóre tile, co powoduje wypadanie ich z obrazu - jeszcze nie wiem jak to pogodzić.
- rozdzielczość renderowanych kwadratów pozostawia trochę/wiele do życzenia
- potrzeba stworzenia menu w którym każdy wybrałby warstwy które chce mieć nałożone na mapę
- przejście na OpenLayer 3 ??? (może to rozwiąże kilka problemów)
FranekKimonoSpeedy
Posts: 17
Has thanked: 1 time
Been thanked: 10 times

POSTER_ID:16980418

1

Send a message

Post by FranekKimonoSpeedy
Nowa wersja tutaj :
https://greasyfork.org/scripts/5105-geoportal-gov-pl-layers-for-wme-without-translating-proxy

Problemy rozwiązane:
- zapytanie do Geoportalu idzie w WMS-ie 1.3.0, z CRS-em EPSG:2180 (powinno nie zamulać serverów geoportalu)
- zmiana współrzędnych z EPSG:900913 na EPSG:2180 jest realizowana przez bibliotekę proj4js
- skorygowane współrzędne znacznie poprawiły jakość renderingu warstwy BDOT

Problemy do rozwiązania:
- geoportal chyba nie lubi się z OpenLayers2 (takiej biblioteki używa WME - nie zmienimy tego...)
- skoro się nie lubi, to niestety wciąż wypadają kafelki z warstwy - trzeba zoomować, przesuwać, aż wreszcie geoportal zwróci nam prawidłowo narysowaną mapkę...
FranekKimonoSpeedy
Posts: 17
Has thanked: 1 time
Been thanked: 10 times
Send a message

Post by Vooytek
Może tak przyjąłeś moje słowa i zmobilizowały Cię do pracy, ale nie chciałem zarzucić Ci lenistwa ;)

Każdy robi tutaj co chce. Nikt nikogo nie zmusza. Nie możemy w takim projekcie czegoś wymagać, ale możemy o to poprosić. Jeśli coś umiemy, to MOŻEMY pomóc sobie wzajemnie :)

Zaraz przetestuję ten skrypcik i zobaczę efekty.
Vooytek
Map Editor - level 3
Map Editor - level 3
Posts: 1673
Has thanked: 179 times
Been thanked: 169 times
Send a message


PROBLEM, PROPOZYCJA, MÓJ BŁĄD? PISZ ŚMIAŁO NA PW! Obiecuję się poprawić :)