From ac27347a9ea7dc176cd47231be119648c1b11ce7 Mon Sep 17 00:00:00 2001 From: pierre-eric Date: Mon, 18 Dec 2017 10:41:54 +0100 Subject: [PATCH] [server] Fix layers group handling Load layers groups from project file to be able to use them in queries. Fixes #17668 --- src/server/services/wms/qgswmsrenderer.cpp | 79 +- src/server/services/wms/qgswmsrenderer.h | 4 + tests/src/python/test_qgsserver.py | 1 + tests/src/python/test_qgsserver_wms_getmap.py | 51 + .../project_groups.qgs | 4396 +++++++++++++++++ 5 files changed, 4507 insertions(+), 24 deletions(-) create mode 100644 tests/testdata/qgis_server_accesscontrol/project_groups.qgs diff --git a/src/server/services/wms/qgswmsrenderer.cpp b/src/server/services/wms/qgswmsrenderer.cpp index de576badfa4e..5eda19994195 100644 --- a/src/server/services/wms/qgswmsrenderer.cpp +++ b/src/server/services/wms/qgswmsrenderer.cpp @@ -504,30 +504,7 @@ namespace QgsWms } else { - QList layerSet; - const QList layers = cMapParams.mLayers; - for ( const auto &layer : layers ) - { - QString nickname = layer.mNickname; - QString style = layer.mStyle; - if ( mNicknameLayers.contains( nickname ) && !mRestrictedLayers.contains( nickname ) ) - { - if ( !style.isEmpty() ) - { - bool rc = mNicknameLayers[nickname]->styleManager()->setCurrentStyle( style ); - if ( ! rc ) - { - throw QgsMapServiceException( QStringLiteral( "StyleNotDefined" ), QStringLiteral( "Style \"%1\" does not exist for layer \"%2\"" ).arg( style, nickname ) ); - } - } - layerSet << mNicknameLayers[nickname]; - } - else - { - throw QgsBadRequestException( QStringLiteral( "LayerNotDefined" ), - QStringLiteral( "Layer \"%1\" does not exist" ).arg( nickname ) ); - } - } + QList layerSet = stylizedLayers( cMapParams.mLayers ); layerSet << highlightLayers( cMapParams.mHighlightLayers ); std::reverse( layerSet.begin(), layerSet.end() ); map->setLayers( layerSet ); @@ -2358,6 +2335,30 @@ namespace QgsWms { mNicknameLayers[ layerNickname( *ml ) ] = ml; } + + // init groups + const QgsLayerTreeGroup *root = mProject->layerTreeRoot(); + initLayerGroupsRecursive( root, mProject->title() ); + } + + void QgsRenderer::initLayerGroupsRecursive( const QgsLayerTreeGroup *group, const QString &groupName ) + { + if ( !groupName.isEmpty() ) + { + mLayerGroups[groupName] = QList(); + for ( QgsLayerTreeLayer *layer : group->findLayers() ) + { + mLayerGroups[groupName].append( layer->layer() ); + } + } + + for ( const QgsLayerTreeNode *child : group->children() ) + { + if ( child->nodeType() == QgsLayerTreeNode::NodeGroup ) + { + initLayerGroupsRecursive( static_cast( child ), child->name() ); + } + } } QString QgsRenderer::layerNickname( const QgsMapLayer &layer ) const @@ -2571,6 +2572,18 @@ namespace QgsWms mNicknameLayers[lname]->setCustomProperty( "readSLD", true ); layers.append( mNicknameLayers[lname] ); } + else if ( mLayerGroups.contains( lname ) ) + { + for ( QgsMapLayer *layer : mLayerGroups[lname] ) + { + if ( !mRestrictedLayers.contains( layerNickname( *layer ) ) ) + { + layer->readSld( namedElem, err ); + layer->setCustomProperty( "readSLD", true ); + layers.append( layer ); + } + } + } else { throw QgsBadRequestException( QStringLiteral( "LayerNotDefined" ), @@ -2617,6 +2630,24 @@ namespace QgsWms layers.append( mNicknameLayers[nickname] ); } + else if ( mLayerGroups.contains( nickname ) ) + { + for ( QgsMapLayer *layer : mLayerGroups[nickname] ) + { + if ( !mRestrictedLayers.contains( layerNickname( *layer ) ) ) + { + if ( !style.isEmpty() ) + { + bool rc = layer->styleManager()->setCurrentStyle( style ); + if ( ! rc ) + { + throw QgsMapServiceException( QStringLiteral( "StyleNotDefined" ), QStringLiteral( "Style \"%1\" does not exist for layer \"%2\"" ).arg( style, layerNickname( *layer ) ) ); + } + } + layers.append( layer ); + } + } + } else { throw QgsBadRequestException( QStringLiteral( "LayerNotDefined" ), diff --git a/src/server/services/wms/qgswmsrenderer.h b/src/server/services/wms/qgswmsrenderer.h index 092965793d4d..a587356db2c4 100644 --- a/src/server/services/wms/qgswmsrenderer.h +++ b/src/server/services/wms/qgswmsrenderer.h @@ -57,6 +57,7 @@ class QImage; class QPaintDevice; class QPainter; class QStandardItem; +class QgsLayerTreeGroup; /** * This class handles requestsi that share rendering: @@ -136,6 +137,8 @@ namespace QgsWms // Init a map with nickname for layers' project void initNicknameLayers(); + void initLayerGroupsRecursive( const QgsLayerTreeGroup *group, const QString &groupName ); + // Return the nickname of the layer (short name, id or name according to // the project configuration) QString layerNickname( const QgsMapLayer &layer ) const; @@ -297,6 +300,7 @@ namespace QgsWms QgsWmsParameters mWmsParameters; QStringList mRestrictedLayers; QMap mNicknameLayers; + QMap > mLayerGroups; QList mTemporaryLayers; public: diff --git a/tests/src/python/test_qgsserver.py b/tests/src/python/test_qgsserver.py index 372005c7348b..887019e02aca 100644 --- a/tests/src/python/test_qgsserver.py +++ b/tests/src/python/test_qgsserver.py @@ -122,6 +122,7 @@ def setUp(self): self.projectAnnotationPath = os.path.join(d, "project_with_annotations.qgs") self.projectStatePath = os.path.join(d, "project_state.qgs") self.projectUseLayerIdsPath = os.path.join(d, "project_use_layerids.qgs") + self.projectGroupsPath = os.path.join(d, "project_groups.qgs") # Clean env just to be sure env_vars = ['QUERY_STRING', 'QGIS_PROJECT_FILE'] diff --git a/tests/src/python/test_qgsserver_wms_getmap.py b/tests/src/python/test_qgsserver_wms_getmap.py index 7779fe814eec..80671e23e5f4 100644 --- a/tests/src/python/test_qgsserver_wms_getmap.py +++ b/tests/src/python/test_qgsserver_wms_getmap.py @@ -889,6 +889,57 @@ def test_wms_getmap_sld(self): r, h = self._result(self._execute_request(qs)) self._img_diff_error(r, h, "WMS_GetMap_SLDRestored") + def test_wms_getmap_group(self): + qs = "?" + "&".join(["%s=%s" % i for i in list({ + "MAP": urllib.parse.quote(self.projectGroupsPath), + "SERVICE": "WMS", + "VERSION": "1.1.1", + "REQUEST": "GetMap", + "LAYERS": "Country,Country_Labels,Country_Diagrams", + "STYLES": "", + "FORMAT": "image/png", + "BBOX": "-16817707,-4710778,5696513,14587125", + "HEIGHT": "500", + "WIDTH": "500", + "CRS": "EPSG:3857" + }.items())]) + + r_individual, _ = self._result(self._execute_request(qs)) + + qs = "?" + "&".join(["%s=%s" % i for i in list({ + "MAP": urllib.parse.quote(self.projectGroupsPath), + "SERVICE": "WMS", + "VERSION": "1.1.1", + "REQUEST": "GetMap", + "LAYERS": "CountryGroup", + "STYLES": "", + "FORMAT": "image/png", + "BBOX": "-16817707,-4710778,5696513,14587125", + "HEIGHT": "500", + "WIDTH": "500", + "CRS": "EPSG:3857" + }.items())]) + + r_group, _ = self._result(self._execute_request(qs)) + self.assertEqual(r_individual, r_group, 'Individual layers query and group layers query results should be identical') + + qs = "?" + "&".join(["%s=%s" % i for i in list({ + "MAP": urllib.parse.quote(self.projectGroupsPath), + "SERVICE": "WMS", + "VERSION": "1.1.1", + "REQUEST": "GetMap", + "SLD": " CountryGroup ", + "STYLES": "", + "FORMAT": "image/png", + "BBOX": "-16817707,-4710778,5696513,14587125", + "HEIGHT": "500", + "WIDTH": "500", + "CRS": "EPSG:3857" + }.items())]) + + r_group_sld, _ = self._result(self._execute_request(qs)) + self.assertEqual(r_individual, r_group_sld, 'Individual layers query and SLD group layers query results should be identical') + if __name__ == '__main__': unittest.main() diff --git a/tests/testdata/qgis_server_accesscontrol/project_groups.qgs b/tests/testdata/qgis_server_accesscontrol/project_groups.qgs new file mode 100644 index 000000000000..fe35e18923b4 --- /dev/null +++ b/tests/testdata/qgis_server_accesscontrol/project_groups.qgs @@ -0,0 +1,4396 @@ + + + QGIS Server Hello World + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + meters + + -30425236.72921397164463997 + -10846058.0813884325325489 + 29667752.81264735385775566 + 14979028.33329574391245842 + + 0 + + + +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs + 3857 + 3857 + EPSG:3857 + WGS 84 / Pseudo Mercator + merc + WGS84 + false + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -19619892.68012013286352158 + -10327100.34232237376272678 + 19972134.91854240000247955 + 18415866.31293442100286484 + + Country_copy20161127151800736 + dbname='./helloworld.db' table="country" (geom) sql= + + + + Country_Labels + + + +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs + 3857 + 3857 + EPSG:3857 + WGS 84 / Pseudo Mercator + merc + WGS84 + false + + + spatialite + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + + + + + + + + + + + + + . + + 0 + + + 0 + generatedlayout + + + + + + + + + + name + + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../../.. + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../../.. + + 0 + + + 0 + generatedlayout + + + + + + + + + + name + + + + + -14746250.07513097859919071 + -112075.42807669920148328 + 11342200.07719692215323448 + 10914413.7141284141689539 + + Hello_Project_SubsetString_copy20160223113949592 + dbname='./helloworld.db' table="hello" (geom) sql= + + + + Hello_Filter_SubsetString + + + +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs + 3857 + 3857 + EPSG:3857 + WGS 84 / Pseudo Mercator + merc + WGS84 + false + + + spatialite + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../../.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../../.. + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + + + + "pkuid" + + + + + -14746250.07513097859919071 + -112075.42807669920148328 + 11342200.07719692215323448 + 10914413.7141284141689539 + + Hello_SubsetString_copy20160222085231770 + dbname='./helloworld.db' table="hello" (geom) sql="pkuid" in ( 7, 8 ) + + + + Hello_Project_SubsetString + + + +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs + 3857 + 3857 + EPSG:3857 + WGS 84 / Pseudo Mercator + merc + WGS84 + false + + + spatialite + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../../.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../../.. + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + + + + "pkuid" + + + + + -14746250.07513097859919071 + -112075.42807669920148328 + 11342200.07719692215323448 + 10914413.7141284141689539 + + Hello_copy20150804164427541 + dbname='./helloworld.db' table="hello" (geom) sql= + + + + Hello_SubsetString + + + +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs + 3857 + 3857 + EPSG:3857 + WGS 84 / Pseudo Mercator + merc + WGS84 + false + + + spatialite + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../../.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../../.. + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + + + + "pkuid" + + + + + -19619892.68012013286352158 + -10327100.34232237376272678 + 19972134.91854240000247955 + 18415866.31293442100286484 + + country20131022151106556 + dbname='./helloworld.db' table="country" (geom) sql= + + + + Country + + + +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs + 3857 + 3857 + EPSG:3857 + WGS 84 / Pseudo Mercator + merc + WGS84 + false + + + spatialite + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + name + + + + + + + + + + + 0 + tablayout + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + name + + + + + + + + + + + 0 + tablayout + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../../.. + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../../.. + + 0 + + + 0 + generatedlayout + + + + + + + + + + "name" + + + + + -19619892.68012013286352158 + -10327100.34232237376272678 + 19972134.91854240000247955 + 18415866.31293442100286484 + + country20170328164317226 + dbname='./helloworld.db' table="country" (geom) sql= + + + + Country_Diagrams + + + +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs + 3857 + 3857 + EPSG:3857 + WGS 84 / Pseudo Mercator + merc + WGS84 + false + + + spatialite + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + name + + + + + -29.99999999999666755 + 29.99999999999666755 + 0.00000000000333245 + 59.99999999999666755 + + dem20150730091219559 + ./dem.tif + + + + dem + + + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + WGS84 + true + + + + + + gdal + + + + + + + + + + + None + WholeRaster + Estimated + 0.02 + 0.98 + 2 + + + 6 + 1912 + StretchToMinimumMaximum + + + + + + + 0 + + + + -14746250.07513097859919071 + -112075.42807669920148328 + 11342200.07719692215323448 + 10914413.7141284141689539 + + hello20131022151106574 + dbname='./helloworld.db' table="hello" (geom) sql= + + + + Hello + + + +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs + 3857 + 3857 + EPSG:3857 + WGS 84 / Pseudo Mercator + merc + WGS84 + false + + + spatialite + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../../.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../../.. + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + + + + COALESCE( "pkuid", '<NULL>' ) + + + + + 1000 + 2000 + 1000 + 2000 + + points20150803121107046 + dbname='./helloworld.db' table="points" (geom) sql= + + + + db_point + + + +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs + 3857 + 3857 + EPSG:3857 + WGS 84 / Pseudo Mercator + merc + WGS84 + false + + + spatialite + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../../.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../../.. + + 0 + + + 0 + generatedlayout + + + + + + + "name" + + + + + + false + + -20609693.37008669599890709 + -11055006.82298868149518967 + 20961935.60850896313786507 + 19143772.79360072687268257 + + + + false + + + 2000 + 1 + 0 + + + days + 1 + 0 + 1 + 0 + + + meters + m2 + + false + + WGS84 + + + + + true + + false + + + + points20150803121107046 + + + points20150803121107046 + + + points20150803121107046 + + + conditions unknown + Simple test app. + QGIS Server test + 90 + false + + + + + + true + D + 2 + + + + + + + EPSG:3857 + EPSG:4326 + + + dem20150730091219559 + + + 1 + 1 + 0 + 1 + 1 + + Stéphane Brunner + + + + None + + + + + true + + 255 + 255 + 255 + 246 + 108 + 255 + 128 + + + 5000 + QGIS + + Hello_SubsetString_copy20160222085231770 + Hello_copy20150804164427541 + country20131022151106556 + hello20131022151106574 + points20150803121107046 + + + 1 + + enabled + enabled + + to vertex + advanced + + 1 + 1 + + + to_vertex + to_vertex + + + 40.000000 + 40.000000 + + + 40 + + country20131022151106556 + hello20131022151106574 + + + 5 + 5000 + + + 255 + + + true + + + + +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs + 1 + 3857 + EPSG:3857 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + points20150803121107046 + hello20131022151106574 + Hello_copy20150804164427541 + Hello_SubsetString_copy20160222085231770 + Hello_Project_SubsetString_copy20160223113949592 + dem20150730091219559 + country20131022151106556 + Country_copy20161127151800736 + country20170328164317226 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + points20150803121107046 + hello20131022151106574 + Hello_copy20150804164427541 + Hello_SubsetString_copy20160222085231770 + Hello_Project_SubsetString_copy20160223113949592 + dem20150730091219559 + country20131022151106556 + Country_copy20161127151800736 + country20170328164317226 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +