From fad88ef7c5e29fc9a0a824d1dfb43e6819eba188 Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Tue, 25 May 2021 17:10:02 +0200 Subject: [PATCH] Server WMS getPrint: fix HIGHLIGHT with follow map themes Fixes #34178 --- src/core/layout/qgslayoutitemmap.cpp | 10 +- src/server/services/wms/qgswmsrenderer.cpp | 27 +- tests/src/python/CMakeLists.txt | 1 + .../test_qgsserver_wms_getprint_maptheme.py | 189 +++ .../qgis_server/test_project_mapthemes.gpkg | Bin 0 -> 98304 bytes .../qgis_server/test_project_mapthemes.qgs | 1510 +++++++++++++++++ 6 files changed, 1722 insertions(+), 15 deletions(-) create mode 100644 tests/src/python/test_qgsserver_wms_getprint_maptheme.py create mode 100644 tests/testdata/qgis_server/test_project_mapthemes.gpkg create mode 100644 tests/testdata/qgis_server/test_project_mapthemes.qgs diff --git a/src/core/layout/qgslayoutitemmap.cpp b/src/core/layout/qgslayoutitemmap.cpp index e3cf26026d14..b56f7b08fa31 100644 --- a/src/core/layout/qgslayoutitemmap.cpp +++ b/src/core/layout/qgslayoutitemmap.cpp @@ -2110,17 +2110,17 @@ QList QgsLayoutItemMap::layersToRender( const QgsExpressionContex QList renderLayers; QString presetName = themeToRender( *evalContext ); - if ( !presetName.isEmpty() ) + if ( !layers().isEmpty() ) + { + renderLayers = layers(); + } + else if ( !presetName.isEmpty() ) { if ( mLayout->project()->mapThemeCollection()->hasMapTheme( presetName ) ) renderLayers = mLayout->project()->mapThemeCollection()->mapThemeVisibleLayers( presetName ); else // fallback to using map canvas layers renderLayers = mLayout->project()->mapThemeCollection()->masterVisibleLayers(); } - else if ( !layers().isEmpty() ) - { - renderLayers = layers(); - } else { renderLayers = mLayout->project()->mapThemeCollection()->masterVisibleLayers(); diff --git a/src/server/services/wms/qgswmsrenderer.cpp b/src/server/services/wms/qgswmsrenderer.cpp index 081ae9ceeb40..4c89b99bfa7c 100644 --- a/src/server/services/wms/qgswmsrenderer.cpp +++ b/src/server/services/wms/qgswmsrenderer.cpp @@ -617,14 +617,14 @@ namespace QgsWms if ( !map->keepLayerSet() ) { + QList layerSet; if ( cMapParams.mLayers.isEmpty() ) { - map->setLayers( mapSettings.layers() ); + layerSet = mapSettings.layers(); } else { - QList layerSet; - for ( auto layer : cMapParams.mLayers ) + for ( const auto &layer : std::as_const( cMapParams.mLayers ) ) { if ( mContext.isValidGroup( layer.mNickname ) ) { @@ -660,11 +660,10 @@ namespace QgsWms layerSet << mlayer; } } - - layerSet << highlightLayers( cMapParams.mHighlightLayers ); - std::reverse( layerSet.begin(), layerSet.end() ); - map->setLayers( layerSet ); } + layerSet << highlightLayers( cMapParams.mHighlightLayers ); + std::reverse( layerSet.begin(), layerSet.end() ); + map->setLayers( layerSet ); map->setKeepLayerSet( true ); } @@ -2639,13 +2638,21 @@ namespace QgsWms { // create sld document from symbology QDomDocument sldDoc; - if ( !sldDoc.setContent( param.mSld, true ) ) - { + QString errorMsg; + int errorLine; + int errorColumn; + if ( !sldDoc.setContent( param.mSld, true, &errorMsg, &errorLine, &errorColumn ) ) + { + QgsMessageLog::logMessage( QStringLiteral( "Error parsing SLD for layer %1 at line %2, column %3:\n%4" ) + .arg( param.mName ) + .arg( errorLine ) + .arg( errorColumn ) + .arg( errorMsg ), + QStringLiteral( "Server" ), Qgis::MessageLevel::Warning ); continue; } // create renderer from sld document - QString errorMsg; std::unique_ptr renderer; QDomElement el = sldDoc.documentElement(); renderer.reset( QgsFeatureRenderer::loadSld( el, param.mGeom.type(), errorMsg ) ); diff --git a/tests/src/python/CMakeLists.txt b/tests/src/python/CMakeLists.txt index c3d91ee901b5..4bfa340b681a 100644 --- a/tests/src/python/CMakeLists.txt +++ b/tests/src/python/CMakeLists.txt @@ -394,6 +394,7 @@ if (WITH_SERVER) ADD_PYTHON_TEST(PyQgsServerWMSGetPrintExtra test_qgsserver_wms_getprint_extra.py) ADD_PYTHON_TEST(PyQgsServerWMSGetPrintOutputs test_qgsserver_wms_getprint_outputs.py) ADD_PYTHON_TEST(PyQgsServerWMSGetPrintAtlas test_qgsserver_wms_getprint_atlas.py) + ADD_PYTHON_TEST(PyQgsServerWMSGetPrintMapTheme, test_qgsserver_wms_getprint_maptheme.py) ADD_PYTHON_TEST(PyQgsServerWMSDimension test_qgsserver_wms_dimension.py) ADD_PYTHON_TEST(PyQgsServerSettings test_qgsserver_settings.py) ADD_PYTHON_TEST(PyQgsServerProjectUtils test_qgsserver_projectutils.py) diff --git a/tests/src/python/test_qgsserver_wms_getprint_maptheme.py b/tests/src/python/test_qgsserver_wms_getprint_maptheme.py new file mode 100644 index 000000000000..c69b12867b80 --- /dev/null +++ b/tests/src/python/test_qgsserver_wms_getprint_maptheme.py @@ -0,0 +1,189 @@ +# -*- coding: utf-8 -*- +"""QGIS Unit tests for QgsServer WMS GetPrint map theme. + +From build dir, run: ctest -R PyQgsServerWMSGetPrintMapTheme -V + + +.. note:: This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +""" +__author__ = 'Alessandro Pasotti' +__date__ = '24/05/2021' +__copyright__ = 'Copyright 2021, The QGIS Project' + +import os +import shutil + +# Needed on Qt 5 so that the serialization of XML is consistent among all executions +os.environ['QT_HASH_SEED'] = '1' + +from qgis.testing import unittest +from qgis.server import QgsBufferServerRequest, QgsBufferServerResponse +from qgis.core import QgsProject +from qgis.PyQt.QtCore import QTemporaryDir +from qgis.PyQt.QtGui import QImage + + +from test_qgsserver import QgsServerTestBase +from utilities import unitTestDataPath + + +class PyQgsServerWMSGetPrintMapTheme(QgsServerTestBase): + """Tests for issue GH #34178 QGIS Server GetPrint: + HIGHLIGHT_GEOM is not printed if map layers are configured to follow a map theme""" + + def test_wms_getprint_maptheme(self): + """Test project has 2 layer: red and green and three templates: + red: map theme red + green: map theme green + blank: non map theme + """ + + tmp_dir = QTemporaryDir() + shutil.copyfile(os.path.join(unitTestDataPath('qgis_server'), 'test_project_mapthemes.qgs'), os.path.join(tmp_dir.path(), 'test_project_mapthemes.qgs')) + shutil.copyfile(os.path.join(unitTestDataPath('qgis_server'), 'test_project_mapthemes.gpkg'), os.path.join(tmp_dir.path(), 'test_project_mapthemes.gpkg')) + + project = QgsProject() + self.assertTrue(project.read(os.path.join(tmp_dir.path(), 'test_project_mapthemes.qgs'))) + + params = { + "SERVICE": "WMS", + "VERSION": "1.3", + "REQUEST": "GetPrint", + "TEMPLATE": "blank", + "FORMAT": "png", + "LAYERS": "", + "map0:EXTENT": "44.92867722467413216,7.097696894150993252,45.0714498943264914,7.378188333645007368", + "map0:LAYERS": "red", + "CRS": "EPSG:4326", + "DPI": '72' + } + + polygon = 'POLYGON((7.09769689415099325 44.92867722467413216, 7.37818833364500737 44.92867722467413216, 7.37818833364500737 45.0714498943264914, 7.09769689415099325 45.0714498943264914, 7.09769689415099325 44.92867722467413216))' + + ###################################################### + # Template map theme tests, no HIGHLIGHT + + response = QgsBufferServerResponse() + request = QgsBufferServerRequest('?' + '&'.join(["%s=%s" % i for i in params.items()])) + self.server.handleRequest(request, response, project) + + image = QImage.fromData(response.body(), "PNG") + color = image.pixelColor(100, 100) + self.assertEqual(color.red(), 255) + self.assertEqual(color.green(), 0) + self.assertEqual(color.blue(), 0) + + params["map0:LAYERS"] = "green" + response = QgsBufferServerResponse() + request = QgsBufferServerRequest('?' + '&'.join(["%s=%s" % i for i in params.items()])) + self.server.handleRequest(request, response, project) + + image = QImage.fromData(response.body(), "PNG") + color = image.pixelColor(100, 100) + self.assertEqual(color.red(), 0) + self.assertEqual(color.green(), 255) + self.assertEqual(color.blue(), 0) + + params["map0:LAYERS"] = "" + params["TEMPLATE"] = "red" + response = QgsBufferServerResponse() + request = QgsBufferServerRequest('?' + '&'.join(["%s=%s" % i for i in params.items()])) + self.server.handleRequest(request, response, project) + + image = QImage.fromData(response.body(), "PNG") + color = image.pixelColor(100, 100) + self.assertEqual(color.red(), 255) + self.assertEqual(color.green(), 0) + self.assertEqual(color.blue(), 0) + + params["map0:LAYERS"] = "" + params["TEMPLATE"] = "green" + response = QgsBufferServerResponse() + request = QgsBufferServerRequest('?' + '&'.join(["%s=%s" % i for i in params.items()])) + self.server.handleRequest(request, response, project) + + image = QImage.fromData(response.body(), "PNG") + color = image.pixelColor(100, 100) + self.assertEqual(color.red(), 0) + self.assertEqual(color.green(), 255) + self.assertEqual(color.blue(), 0) + + ###################################################### + # Start HIGHLIGHT tests + + params["TEMPLATE"] = "blank" + params["map0:LAYERS"] = "red" + params["map0:HIGHLIGHT_GEOM"] = polygon + params["map0:HIGHLIGHT_SYMBOL"] = r'%230000FF' + + response = QgsBufferServerResponse() + request = QgsBufferServerRequest('?' + '&'.join(["%s=%s" % i for i in params.items()])) + self.server.handleRequest(request, response, project) + + image = QImage.fromData(response.body(), "PNG") + color = image.pixelColor(100, 100) + self.assertEqual(color.red(), 0) + self.assertEqual(color.green(), 0) + self.assertEqual(color.blue(), 255) + + # Test highlight without layers + params["TEMPLATE"] = "blank" + params["map0:LAYERS"] = "" + + response = QgsBufferServerResponse() + request = QgsBufferServerRequest('?' + '&'.join(["%s=%s" % i for i in params.items()])) + self.server.handleRequest(request, response, project) + + image = QImage.fromData(response.body(), "PNG") + color = image.pixelColor(100, 100) + self.assertEqual(color.red(), 0) + self.assertEqual(color.green(), 0) + self.assertEqual(color.blue(), 255) + + # Test highlight on follow theme (issue GH #34178) + params["TEMPLATE"] = "red" + + response = QgsBufferServerResponse() + request = QgsBufferServerRequest('?' + '&'.join(["%s=%s" % i for i in params.items()])) + self.server.handleRequest(request, response, project) + + image = QImage.fromData(response.body(), "PNG") + color = image.pixelColor(100, 100) + self.assertEqual(color.red(), 0) + self.assertEqual(color.green(), 0) + self.assertEqual(color.blue(), 255) + + # Test highlight on follow theme (issue GH #34178) + params["TEMPLATE"] = "green" + + response = QgsBufferServerResponse() + request = QgsBufferServerRequest('?' + '&'.join(["%s=%s" % i for i in params.items()])) + self.server.handleRequest(request, response, project) + + image = QImage.fromData(response.body(), "PNG") + color = image.pixelColor(100, 100) + self.assertEqual(color.red(), 0) + self.assertEqual(color.green(), 0) + self.assertEqual(color.blue(), 255) + + # Test highlight on follow theme, but add LAYERS (issue GH #34178) + params["TEMPLATE"] = "green" + params["LAYERS"] = "red" + + response = QgsBufferServerResponse() + request = QgsBufferServerRequest('?' + '&'.join(["%s=%s" % i for i in params.items()])) + self.server.handleRequest(request, response, project) + + image = QImage.fromData(response.body(), "PNG") + color = image.pixelColor(100, 100) + self.assertEqual(color.red(), 0) + self.assertEqual(color.green(), 0) + self.assertEqual(color.blue(), 255) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/testdata/qgis_server/test_project_mapthemes.gpkg b/tests/testdata/qgis_server/test_project_mapthemes.gpkg new file mode 100644 index 0000000000000000000000000000000000000000..c1c25bbc0ce22722bf4c7ab96ac1a1982f9231ab GIT binary patch literal 98304 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 TYS!PJtgQ!v6W9OB(d+*^yz`-n literal 0 HcmV?d00001 diff --git a/tests/testdata/qgis_server/test_project_mapthemes.qgs b/tests/testdata/qgis_server/test_project_mapthemes.qgs new file mode 100644 index 000000000000..4c1ca8ccbac8 --- /dev/null +++ b/tests/testdata/qgis_server/test_project_mapthemes.qgs @@ -0,0 +1,1510 @@ + + + + + + + + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + + + + + + + + + + + + polygon_01ef59a7_1b15_4ceb_90a4_c747e536b9bf + polygon_8d1e6ddb_2dd6_4369_8363_e5e1872cd617 + + + + + + + + + + + + degrees + + 7.09769689415099325 + 44.94957400554809368 + 7.37818833364500737 + 45.05055311345252989 + + 0 + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + 0 + + + + + + + + + + + + + + + meters + + 796667.53532065730541945 + 5615440.89528808370232582 + 801503.33475810033269227 + 5623387.5857305321842432 + + 0 + + + PROJCRS["WGS 84 / Pseudo-Mercator",BASEGEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["Popular Visualisation Pseudo-Mercator",METHOD["Popular Visualisation Pseudo Mercator",ID["EPSG",1024]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["False easting",0,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["northing (Y)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["unknown"],AREA["World - 85°S to 85°N"],BBOX[-85.06,-180,85.06,180]],ID["EPSG",3857]] + +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs + 3857 + 3857 + EPSG:3857 + WGS 84 / Pseudo-Mercator + merc + EPSG:7030 + false + + + 0 + + + + Annotations_50979f9e_3931_47a0_8fe6_02eb3c518de9 + + + + + + + + + + 0 + 0 + + + + + false + + + + + + + + + + + + + + + + + 0 + 0 + + + + + false + + + + + + 1 + 0 + + + + + 6.99864045786122979 + 44.86445936400060219 + 7.50807355878006 + 45.1332023500711017 + + polygon_01ef59a7_1b15_4ceb_90a4_c747e536b9bf + ./test_project_mapthemes.gpkg|layername=polygon + + + + red + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + + + dataset + + + + + + + + + + + + + + + + + + + 0 + 0 + + + + + false + + + + + + + + + + + + + ogr + + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + + + "fid" + + + + + 6.99864045786122979 + 44.86445936400060219 + 7.50807355878006 + 45.1332023500711017 + + polygon_8d1e6ddb_2dd6_4369_8363_e5e1872cd617 + ./test_project_mapthemes.gpkg|layername=polygon + + + + green + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + + + dataset + + + + + + + + + + + + + + + + + + + 0 + 0 + + + + + false + + + + + + + + + + + + + ogr + + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + + + "fid" + + + + + + + + + + + + + + 1 + true + + + 0 + + + 255 + 255 + 255 + 255 + 0 + 255 + 255 + + + false + + + + + + EPSG:7030 + + + m2 + meters + + + 5 + 2.5 + false + false + 1 + 0 + false + false + true + 0 + 255,0,0,255 + + + false + + + true + 2 + MU + + false + + 1 + + + + + + + + + + + None + false + + + + + + 8.983152841195214e-06 + + 787481.86049952043686062 + 5615440.89528808370232582 + 810689.00957923720125109 + 5623387.5857305321842432 + + false + conditions unknown + 90 + + + + 1 + + 8 + + false + + false + + 0 + + false + + + + + + + + false + + + + + false + + 5000 + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + PROJCRS["NAD27 / UTM zone 11N",BASEGEOGCRS["NAD27",DATUM["North American Datum 1927",ELLIPSOID["Clarke 1866",6378206.4,294.978698213898,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4267]],CONVERSION["UTM zone 11N",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-117,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["unknown"],AREA["North America - 120°W to 114°W and NAD27 by country - onshore"],BBOX[26.93,-120,78.13,-114]],ID["EPSG",26711]] + +proj=utm +zone=11 +datum=NAD27 +units=m +no_defs + 2140 + 26711 + EPSG:26711 + NAD27 / UTM zone 11N + utm + EPSG:7008 + false + + + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + + + PROJCRS["Amersfoort / RD New",BASEGEOGCRS["Amersfoort",DATUM["Amersfoort",ELLIPSOID["Bessel 1841",6377397.155,299.1528128,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4289]],CONVERSION["RD New",METHOD["Oblique Stereographic",ID["EPSG",9809]],PARAMETER["Latitude of natural origin",52.1561605555556,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",5.38763888888889,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9999079,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",155000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",463000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["northing (Y)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["unknown"],AREA["Netherlands - onshore"],BBOX[50.75,3.2,53.7,7.22]],ID["EPSG",28992]] + +proj=sterea +lat_0=52.1561605555556 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.2369,50.0087,465.658,-0.406857330322398,0.350732676542563,-1.8703473836068,4.0812 +units=m +no_defs + 2517 + 28992 + EPSG:28992 + Amersfoort / RD New + sterea + EPSG:7004 + false + + + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + + + PROJCRS["WGS 84 / UTM zone 48N",BASEGEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 48N",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",105,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["unknown"],AREA["World - N hemisphere - 102°E to 108°E - by country"],BBOX[0,102,84,108]],ID["EPSG",32648]] + +proj=utm +zone=48 +datum=WGS84 +units=m +no_defs + 3132 + 32648 + EPSG:32648 + WGS 84 / UTM zone 48N + utm + EPSG:7030 + false + + + + + PROJCRS["Indian 1960 / UTM zone 48N",BASEGEOGCRS["Indian 1960",DATUM["Indian 1960",ELLIPSOID["Everest 1830 (1937 Adjustment)",6377276.345,300.8017,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4131]],CONVERSION["UTM zone 48N",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",105,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["unknown"],AREA["Asia - Cambodia and Vietnam - west of 108°E"],BBOX[8.33,102.14,23.4,108]],ID["EPSG",3148]] + +proj=utm +zone=48 +ellps=evrst30 +units=m +no_defs + 1108 + 3148 + EPSG:3148 + Indian 1960 / UTM zone 48N + utm + EPSG:7015 + false + + + + + + + PROJCRS["WGS 84 / Pseudo-Mercator",BASEGEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["Popular Visualisation Pseudo-Mercator",METHOD["Popular Visualisation Pseudo Mercator",ID["EPSG",1024]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["False easting",0,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["northing (Y)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["unknown"],AREA["World - 85°S to 85°N"],BBOX[-85.06,-180,85.06,180]],ID["EPSG",3857]] + +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs + 3857 + 3857 + EPSG:3857 + WGS 84 / Pseudo-Mercator + merc + EPSG:7030 + false + + + + + PROJCRS["Indian 1960 / UTM zone 48N",BASEGEOGCRS["Indian 1960",DATUM["Indian 1960",ELLIPSOID["Everest 1830 (1937 Adjustment)",6377276.345,300.8017,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4131]],CONVERSION["UTM zone 48N",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",105,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["unknown"],AREA["Asia - Cambodia and Vietnam - west of 108°E"],BBOX[8.33,102.14,23.4,108]],ID["EPSG",3148]] + +proj=utm +zone=48 +ellps=evrst30 +units=m +no_defs + 1108 + 3148 + EPSG:3148 + Indian 1960 / UTM zone 48N + utm + EPSG:7015 + false + + + + + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + PROJCRS["Indian 1960 / UTM zone 48N",BASEGEOGCRS["Indian 1960",DATUM["Indian 1960",ELLIPSOID["Everest 1830 (1937 Adjustment)",6377276.345,300.8017,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4131]],CONVERSION["UTM zone 48N",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",105,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["unknown"],AREA["Asia - Cambodia and Vietnam - west of 108°E"],BBOX[8.33,102.14,23.4,108]],ID["EPSG",3148]] + +proj=utm +zone=48 +ellps=evrst30 +units=m +no_defs + 1108 + 3148 + EPSG:3148 + Indian 1960 / UTM zone 48N + utm + EPSG:7015 + false + + + + + + + + + + + + + + + + + + + + + + Alessandro Pasotti + 2021-05-25T14:31:14 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + + + + + +