diff --git a/src/core/layout/qgslayoutitemmap.cpp b/src/core/layout/qgslayoutitemmap.cpp index 397c6ad394b0..48c1aea17ee5 100644 --- a/src/core/layout/qgslayoutitemmap.cpp +++ b/src/core/layout/qgslayoutitemmap.cpp @@ -2127,17 +2127,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 c48b1931dc23..1a2dd493ecb1 100644 --- a/src/server/services/wms/qgswmsrenderer.cpp +++ b/src/server/services/wms/qgswmsrenderer.cpp @@ -646,14 +646,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 ) ) { @@ -689,11 +689,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 ); } @@ -2743,13 +2742,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 ef12eefbd75f..3c564a66e793 100644 --- a/tests/src/python/CMakeLists.txt +++ b/tests/src/python/CMakeLists.txt @@ -445,6 +445,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 000000000000..c1c25bbc0ce2 Binary files /dev/null and b/tests/testdata/qgis_server/test_project_mapthemes.gpkg differ 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 + + + + + + + + + +