Merge pull request #30071 from lbartoletti/wms_tile_buffer

[server]New parameter for WMS service: tile_buffer
This commit is contained in:
Blottiere Paul 2019-06-28 16:22:05 +02:00 committed by GitHub
commit ee6642477e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 857 additions and 17 deletions

View File

@ -74,6 +74,25 @@ Set coordinates of the rectangle which should be rendered.
The actual visible extent used for rendering could be slightly different
since the given extent may be expanded in order to fit the aspect ratio
of output size. Use visibleExtent() to get the resulting extent.
%End
double extentBuffer() const;
%Docstring
Returns the buffer in map units to use around the visible extent for rendering
symbols whose corresponding geometries are outside the visible extent.
.. seealso:: :py:func:`setExtentBuffer`
.. versionadded:: 3.10
%End
void setExtentBuffer( double buffer );
%Docstring
Sets the buffer in map units to use around the visible extent for rendering
symbols whose corresponding geometries are outside the visible extent. This
is useful when using tiles to avoid cut symbols at tile boundaries.
.. versionadded:: 3.10
%End
QSize outputSize() const;

View File

@ -152,6 +152,17 @@ Returns the quality for WMS images defined in a QGIS project.
:param project: the QGIS project
:return: quality if defined in project, -1 otherwise.
%End
int wmsTileBuffer( const QgsProject &project );
%Docstring
Returns the tile buffer in pixels for WMS images defined in a QGIS project.
:param project: the QGIS project
:return: tile buffer if defined in project, 0 otherwise.
.. versionadded:: 3.10
%End
int wmsMaxAtlasFeatures( const QgsProject &project );

View File

@ -644,6 +644,9 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas *mapCanvas, QWidget *pa
mWMSImageQualitySpinBox->setValue( imageQuality );
}
// WMS tileBuffer
mWMSTileBufferSpinBox->setValue( QgsProject::instance()->readNumEntry( QStringLiteral( "WMSTileBuffer" ), QStringLiteral( "/" ), 0 ) );
mWMSMaxAtlasFeaturesSpinBox->setValue( QgsProject::instance()->readNumEntry( QStringLiteral( "WMSMaxAtlasFeatures" ), QStringLiteral( "/" ), 1 ) );
QString defaultValueToolTip = tr( "In case of no other information to evaluate the map unit sized symbols, it uses default scale (on projected CRS) or default map units per mm (on geographic CRS)." );
@ -1323,6 +1326,9 @@ void QgsProjectProperties::apply()
QgsProject::instance()->writeEntry( QStringLiteral( "WMSImageQuality" ), QStringLiteral( "/" ), imageQualityValue );
}
// WMS TileBuffer
QgsProject::instance()->writeEntry( QStringLiteral( "WMSTileBuffer" ), QStringLiteral( "/" ), mWMSTileBufferSpinBox->value() );
int maxAtlasFeatures = mWMSMaxAtlasFeaturesSpinBox->value();
QgsProject::instance()->writeEntry( QStringLiteral( "WMSMaxAtlasFeatures" ), QStringLiteral( "/" ), maxAtlasFeatures );

View File

@ -254,6 +254,7 @@ LayerRenderJobs QgsMapRendererJob::prepareJobs( QPainter *painter, QgsLabelingEn
}
QgsRectangle r1 = mSettings.visibleExtent(), r2;
r1.grow( mSettings.extentBuffer() );
QgsCoordinateTransform ct;
ct = mSettings.layerTransform( ml );

View File

@ -87,6 +87,16 @@ void QgsMapSettings::setExtent( const QgsRectangle &extent, bool magnified )
updateDerived();
}
double QgsMapSettings::extentBuffer() const
{
return mExtentBuffer;
}
void QgsMapSettings::setExtentBuffer( const double buffer )
{
mExtentBuffer = buffer;
}
double QgsMapSettings::rotation() const
{
return mRotation;

View File

@ -102,6 +102,22 @@ class CORE_EXPORT QgsMapSettings
*/
void setExtent( const QgsRectangle &rect, bool magnified = true );
/**
* Returns the buffer in map units to use around the visible extent for rendering
* symbols whose corresponding geometries are outside the visible extent.
* \see setExtentBuffer()
* \since QGIS 3.10
*/
double extentBuffer() const;
/**
* Sets the buffer in map units to use around the visible extent for rendering
* symbols whose corresponding geometries are outside the visible extent. This
* is useful when using tiles to avoid cut symbols at tile boundaries.
* \since QGIS 3.10
*/
void setExtentBuffer( double buffer );
//! Returns the size of the resulting map image
QSize outputSize() const;
//! Sets the size of the resulting map image
@ -539,6 +555,7 @@ class CORE_EXPORT QgsMapSettings
float mDevicePixelRatio = 1.0;
QgsRectangle mExtent;
double mExtentBuffer = 0.0;
double mRotation = 0.0;
double mMagnificationFactor = 1.0;

View File

@ -157,8 +157,10 @@ bool QgsRenderContext::testFlag( QgsRenderContext::Flag flag ) const
QgsRenderContext QgsRenderContext::fromMapSettings( const QgsMapSettings &mapSettings )
{
QgsRenderContext ctx;
QgsRectangle extent = mapSettings.visibleExtent();
extent.grow( mapSettings.extentBuffer() );
ctx.setMapToPixel( mapSettings.mapToPixel() );
ctx.setExtent( mapSettings.visibleExtent() );
ctx.setExtent( extent );
ctx.setMapExtent( mapSettings.visibleExtent() );
ctx.setFlag( DrawEditingInfo, mapSettings.testFlag( QgsMapSettings::DrawEditingInfo ) );
ctx.setFlag( ForceVectorOutput, mapSettings.testFlag( QgsMapSettings::ForceVectorOutput ) );

View File

@ -111,6 +111,11 @@ int QgsServerProjectUtils::wmsImageQuality( const QgsProject &project )
return project.readNumEntry( QStringLiteral( "WMSImageQuality" ), QStringLiteral( "/" ), -1 );
}
int QgsServerProjectUtils::wmsTileBuffer( const QgsProject &project )
{
return project.readNumEntry( QStringLiteral( "WMSTileBuffer" ), QStringLiteral( "/" ), 0 );
}
int QgsServerProjectUtils::wmsMaxAtlasFeatures( const QgsProject &project )
{
return project.readNumEntry( QStringLiteral( "WMSMaxAtlasFeatures" ), QStringLiteral( "/" ), 1 );

View File

@ -147,6 +147,14 @@ namespace QgsServerProjectUtils
*/
SERVER_EXPORT int wmsImageQuality( const QgsProject &project );
/**
* Returns the tile buffer in pixels for WMS images defined in a QGIS project.
* \param project the QGIS project
* \returns tile buffer if defined in project, 0 otherwise.
* \since QGIS 3.10
*/
SERVER_EXPORT int wmsTileBuffer( const QgsProject &project );
/**
* Returns the maximum number of atlas features which can be printed in a request
* \param project the QGIS project

View File

@ -44,6 +44,7 @@ namespace QgsWms
context.setFlag( QgsWmsRenderContext::AddHighlightLayers );
context.setFlag( QgsWmsRenderContext::AddExternalLayers );
context.setFlag( QgsWmsRenderContext::SetAccessControl );
context.setFlag( QgsWmsRenderContext::UseTileBuffer );
context.setParameters( parameters );
// rendering

View File

@ -223,6 +223,11 @@ namespace QgsWms
QVariant( 0 ) );
save( pQuality );
const QgsWmsParameter pTiled( QgsWmsParameter::TILED,
QVariant::Bool,
QVariant( false ) );
save( pTiled );
const QgsWmsParameter pBoxSpace( QgsWmsParameter::BOXSPACE,
QVariant::Double,
QVariant( 2.0 ) );
@ -944,6 +949,16 @@ namespace QgsWms
return mWmsParameters[ QgsWmsParameter::IMAGE_QUALITY ].toInt();
}
QString QgsWmsParameters::tiled() const
{
return mWmsParameters[ QgsWmsParameter::TILED ].toString();
}
bool QgsWmsParameters::tiledAsBool() const
{
return mWmsParameters[ QgsWmsParameter::TILED ].toBool();
}
QString QgsWmsParameters::showFeatureCount() const
{
return mWmsParameters[ QgsWmsParameter::SHOWFEATURECOUNT ].toString();

View File

@ -177,7 +177,8 @@ namespace QgsWms
ATLAS_PK,
FORMAT_OPTIONS,
SRCWIDTH,
SRCHEIGHT
SRCHEIGHT,
TILED
};
Q_ENUM( Name )
@ -628,6 +629,20 @@ namespace QgsWms
*/
int imageQualityAsInt() const;
/**
* Returns TILED parameter or an empty string if not
* defined.
* \since QGIS 3.10
*/
QString tiled() const;
/**
* Returns TILED parameter as a boolean.
* \throws QgsBadRequestException
* \since QGIS 3.10
*/
bool tiledAsBool() const;
/**
* Returns infoFormat. If the INFO_FORMAT parameter is not used, then the
* default value is text/plain.

View File

@ -24,7 +24,6 @@
using namespace QgsWms;
const double OGC_PX_M = 0.00028; // OGC reference pixel size in meter
QgsWmsRenderContext::QgsWmsRenderContext( const QgsProject *project, QgsServerInterface *interface )
: mProject( project )
, mInterface( interface )
@ -132,6 +131,18 @@ int QgsWmsRenderContext::imageQuality() const
return imageQuality;
}
int QgsWmsRenderContext::tileBuffer() const
{
int tileBuffer = 0;
if ( mParameters.tiledAsBool() )
{
tileBuffer = QgsServerProjectUtils::wmsTileBuffer( *mProject );
}
return tileBuffer;
}
int QgsWmsRenderContext::precision() const
{
int precision = QgsServerProjectUtils::wmsFeatureInfoPrecision( *mProject );
@ -638,6 +649,26 @@ bool QgsWmsRenderContext::isValidWidthHeight() const
return true;
}
double QgsWmsRenderContext::mapTileBuffer( const int mapWidth ) const
{
double buffer;
if ( mFlags & UseTileBuffer )
{
const QgsRectangle extent = mParameters.bboxAsRectangle();
if ( !mParameters.bbox().isEmpty() && extent.isEmpty() )
{
throw QgsBadRequestException( QgsServiceException::QGIS_InvalidParameterValue,
mParameters[QgsWmsParameter::BBOX] );
}
buffer = tileBuffer() * ( extent.width() / mapWidth );
}
else
{
buffer = 0;
}
return buffer;
}
QSize QgsWmsRenderContext::mapSize( const bool aspectRatio ) const
{
int width = mapWidth();

View File

@ -47,7 +47,8 @@ namespace QgsWms
AddQueryLayers = 0x80,
UseWfsLayersOnly = 0x100,
AddExternalLayers = 0x200,
UseSrcWidthHeight = 0x400
UseSrcWidthHeight = 0x400,
UseTileBuffer = 0x800
};
Q_DECLARE_FLAGS( Flags, Flag )
@ -148,6 +149,13 @@ namespace QgsWms
*/
int imageQuality() const;
/**
* Returns the tile buffer value to use for rendering according to the
* current configuration.
* \since QGIS 3.10
*/
int tileBuffer() const;
/**
* Returns the precision to use according to the current configuration.
*/
@ -200,6 +208,12 @@ namespace QgsWms
*/
QMap<QString, QList<QgsMapLayer *> > layerGroups() const;
/**
* Returns the tile buffer in geographical units for the given map width in pixels.
* \since QGIS 3.10
*/
double mapTileBuffer( int mapWidth ) const;
/**
* Returns the size (in pixels) of the map to render, according to width
* and height WMS parameters as well as the \a aspectRatio option.

View File

@ -17,7 +17,6 @@
* *
***************************************************************************/
#include "qgswmsutils.h"
#include "qgsjsonutils.h"
#include "qgswmsrenderer.h"
@ -1028,6 +1027,9 @@ namespace QgsWms
mapSettings.setExtent( mapExtent );
// set the extent buffer
mapSettings.setExtentBuffer( mContext.mapTileBuffer( paintDevice->width() ) );
/* Define the background color
* Transparent or colored
*/

View File

@ -236,7 +236,7 @@
</sizepolicy>
</property>
<property name="currentIndex">
<number>4</number>
<number>8</number>
</property>
<widget class="QWidget" name="mProjOptsGeneral">
<layout class="QVBoxLayout" name="verticalLayout_6">
@ -265,8 +265,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>537</width>
<height>795</height>
<width>535</width>
<height>740</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_8">
@ -863,8 +863,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>546</width>
<height>164</height>
<width>544</width>
<height>155</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_7">
@ -938,8 +938,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>269</width>
<height>553</height>
<width>266</width>
<height>524</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_12">
@ -1514,8 +1514,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>167</width>
<height>55</height>
<width>165</width>
<height>52</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_17">
@ -1575,9 +1575,9 @@
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>598</width>
<height>2732</height>
<y>-793</y>
<width>671</width>
<height>2614</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_13">
@ -2437,6 +2437,23 @@
</item>
</layout>
</item>
<item row="11" column="0" colspan="3">
<layout class="QHBoxLayout" name="horizontalLayout_18">
<item>
<widget class="QLabel" name="label_33">
<property name="toolTip">
<string>When using tiles set this to the size of the larger symbols to avoid cut symbols at tile boundaries. This works by drawing features that are outside the tile extent.</string>
</property>
<property name="text">
<string>Tile buffer in pixels</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="mWMSTileBufferSpinBox"/>
</item>
</layout>
</item>
</layout>
</widget>
</item>

View File

@ -40,6 +40,7 @@ class TestQgsMapSettings: public QObject
void testGettersSetters();
void testLabelingEngineSettings();
void visibleExtent();
void extentBuffer();
void mapUnitsPerPixel();
void testDevicePixelRatio();
void visiblePolygon();
@ -160,6 +161,17 @@ void TestQgsMapSettings::visibleExtent()
QCOMPARE( ms.visibleExtent().toString( 0 ), QString( "-56,-81 : 156,131" ) );
}
void TestQgsMapSettings::extentBuffer()
{
QgsMapSettings ms;
ms.setExtent( QgsRectangle( 50, 50, 100, 100 ) );
ms.setOutputSize( QSize( 50, 50 ) );
ms.setExtentBuffer( 10 );
QgsRectangle visibleExtent = ms.visibleExtent();
visibleExtent.grow( ms.extentBuffer() );
QCOMPARE( visibleExtent.toString( 0 ), QString( "40,40 : 110,110" ) );
}
void TestQgsMapSettings::mapUnitsPerPixel()
{
QgsMapSettings ms;

View File

@ -1578,6 +1578,62 @@ class TestQgsServerWMSGetMap(QgsServerTestBase):
r, h = self._result(self._execute_request(qs))
self._img_diff_error(r, h, "WMS_GetMap_Group_Layer_Order")
def test_wms_getmap_tile_buffer(self):
"""Test the implementation of tile_map_edge_buffer from mapserver."""
# Check without tiled parameters (default is false)
qs = "?" + "&".join(["%s=%s" % i for i in list({
"MAP": urllib.parse.quote(os.path.join(self.testdata_path, 'wms_tile_buffer.qgs')),
"SERVICE": "WMS",
"VERSION": "1.3.0",
"REQUEST": "GetMap",
"BBOX": "310187,6163153,324347,6177313",
"CRS": "EPSG:3857",
"WIDTH": "512",
"HEIGHT": "512",
"LAYERS": "wms_tile_buffer_data",
"FORMAT": "image/png"
}.items())])
r, h = self._result(self._execute_request(qs))
self._img_diff_error(r, h, "WMS_GetMap_Tiled_False")
# Check with tiled=false
qs = "?" + "&".join(["%s=%s" % i for i in list({
"MAP": urllib.parse.quote(os.path.join(self.testdata_path, 'wms_tile_buffer.qgs')),
"SERVICE": "WMS",
"VERSION": "1.3.0",
"REQUEST": "GetMap",
"BBOX": "310187,6163153,324347,6177313",
"CRS": "EPSG:3857",
"WIDTH": "512",
"HEIGHT": "512",
"LAYERS": "wms_tile_buffer_data",
"FORMAT": "image/png",
"TILED": "false"
}.items())])
r, h = self._result(self._execute_request(qs))
self._img_diff_error(r, h, "WMS_GetMap_Tiled_False")
# Check with tiled=true
qs = "?" + "&".join(["%s=%s" % i for i in list({
"MAP": urllib.parse.quote(os.path.join(self.testdata_path, 'wms_tile_buffer.qgs')),
"SERVICE": "WMS",
"VERSION": "1.3.0",
"REQUEST": "GetMap",
"BBOX": "310187,6163153,324347,6177313",
"CRS": "EPSG:3857",
"WIDTH": "512",
"HEIGHT": "512",
"LAYERS": "wms_tile_buffer_data",
"FORMAT": "image/png",
"TILED": "true"
}.items())])
r, h = self._result(self._execute_request(qs))
self._img_diff_error(r, h, "WMS_GetMap_Tiled_True")
if __name__ == '__main__':
unittest.main()

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,598 @@
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
<qgis projectname="" version="3.7.0-Master">
<homePath path=""/>
<title></title>
<autotransaction active="0"/>
<evaluateDefaultValues active="0"/>
<trust active="1"/>
<projectCrs>
<spatialrefsys>
<proj4>+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</proj4>
<srsid>3857</srsid>
<srid>3857</srid>
<authid>EPSG:3857</authid>
<description>WGS 84 / Pseudo-Mercator</description>
<projectionacronym>merc</projectionacronym>
<ellipsoidacronym>WGS84</ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</projectCrs>
<layer-tree-group>
<customproperties/>
<layer-tree-layer name="wms_tile_buffer_data" id="wms_tile_buffer_data_fcfdbf36_dd5a_45d6_b770_bdbb3794cf98" providerKey="ogr" checked="Qt::Checked" source="/home/lbartoletti/eleonore-test/wms_tile_buffer_data.gpkg|layername=wms_tile_buffer_data" expanded="1">
<customproperties/>
</layer-tree-layer>
<custom-order enabled="0">
<item>wms_tile_buffer_data_fcfdbf36_dd5a_45d6_b770_bdbb3794cf98</item>
</custom-order>
</layer-tree-group>
<snapping-settings unit="1" type="1" enabled="0" tolerance="12" intersection-snapping="0" mode="2">
<individual-layer-settings>
<layer-setting type="1" enabled="0" tolerance="12" id="wms_tile_buffer_data_fcfdbf36_dd5a_45d6_b770_bdbb3794cf98" units="1"/>
</individual-layer-settings>
</snapping-settings>
<relations/>
<mapcanvas annotationsVisible="1" name="theMapCanvas">
<units>meters</units>
<extent>
<xmin>304918.47943539364496246</xmin>
<ymin>6160178.90903625823557377</ymin>
<xmax>329687.225462922884617</xmax>
<ymax>6174497.13128242827951908</ymax>
</extent>
<rotation>0</rotation>
<destinationsrs>
<spatialrefsys>
<proj4>+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</proj4>
<srsid>3857</srsid>
<srid>3857</srid>
<authid>EPSG:3857</authid>
<description>WGS 84 / Pseudo-Mercator</description>
<projectionacronym>merc</projectionacronym>
<ellipsoidacronym>WGS84</ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</destinationsrs>
<rendermaptile>0</rendermaptile>
<expressionContextScope/>
</mapcanvas>
<legend updateDrawingOrder="true">
<legendlayer name="wms_tile_buffer_data" drawingOrder="-1" showFeatureCount="0" checked="Qt::Checked" open="true">
<filegroup open="true" hidden="false">
<legendlayerfile isInOverview="0" layerid="wms_tile_buffer_data_fcfdbf36_dd5a_45d6_b770_bdbb3794cf98" visible="1"/>
</filegroup>
</legendlayer>
</legend>
<mapViewDocks/>
<mapViewDocks3D/>
<projectlayers>
<maplayer hasScaleBasedVisibilityFlag="0" simplifyMaxScale="1" refreshOnNotifyMessage="" simplifyLocal="1" autoRefreshTime="0" simplifyDrawingHints="0" wkbType="Point" minScale="150001" simplifyDrawingTol="1" simplifyAlgorithm="0" geometry="Point" autoRefreshEnabled="0" maxScale="1" refreshOnNotifyEnabled="0" readOnly="0" type="vector" labelsEnabled="0" styleCategories="AllStyleCategories">
<extent>
<xmin>289998</xmin>
<ymin>6156740</ymin>
<xmax>344497</xmax>
<ymax>6188080</ymax>
</extent>
<id>wms_tile_buffer_data_fcfdbf36_dd5a_45d6_b770_bdbb3794cf98</id>
<datasource>./wms_tile_buffer_data.gpkg|layername=wms_tile_buffer_data</datasource>
<keywordList>
<value></value>
</keywordList>
<layername>wms_tile_buffer_data</layername>
<srs>
<spatialrefsys>
<proj4>+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</proj4>
<srsid>3857</srsid>
<srid>3857</srid>
<authid>EPSG:3857</authid>
<description>WGS 84 / Pseudo-Mercator</description>
<projectionacronym>merc</projectionacronym>
<ellipsoidacronym>WGS84</ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</srs>
<resourceMetadata>
<identifier></identifier>
<parentidentifier></parentidentifier>
<language></language>
<type></type>
<title></title>
<abstract></abstract>
<links/>
<fees></fees>
<encoding></encoding>
<crs>
<spatialrefsys>
<proj4></proj4>
<srsid>0</srsid>
<srid>0</srid>
<authid></authid>
<description></description>
<projectionacronym></projectionacronym>
<ellipsoidacronym></ellipsoidacronym>
<geographicflag>true</geographicflag>
</spatialrefsys>
</crs>
<extent/>
</resourceMetadata>
<provider encoding="UTF-8">ogr</provider>
<vectorjoins/>
<layerDependencies/>
<dataDependencies/>
<legend type="default-vector"/>
<expressionfields/>
<map-layer-style-manager current="défaut">
<map-layer-style name="défaut"/>
</map-layer-style-manager>
<auxiliaryLayer/>
<flags>
<Identifiable>1</Identifiable>
<Removable>1</Removable>
<Searchable>1</Searchable>
</flags>
<renderer-v2 enableorderby="0" type="singleSymbol" forceraster="0" symbollevels="0">
<symbols>
<symbol name="0" type="marker" clip_to_extent="1" alpha="1" force_rhr="0">
<layer locked="0" enabled="1" class="SvgMarker" pass="0">
<prop v="0" k="angle"/>
<prop v="190,178,151,255" k="color"/>
<prop v="0" k="fixedAspectRatio"/>
<prop v="1" k="horizontal_anchor_point"/>
<prop v="accommodation/accommodation_bed_and_breakfast.svg" k="name"/>
<prop v="0,-30" k="offset"/>
<prop v="3x:0,0,0,0,0,0" k="offset_map_unit_scale"/>
<prop v="Pixel" k="offset_unit"/>
<prop v="35,35,35,255" k="outline_color"/>
<prop v="0" k="outline_width"/>
<prop v="3x:0,0,0,0,0,0" k="outline_width_map_unit_scale"/>
<prop v="Pixel" k="outline_width_unit"/>
<prop v="diameter" k="scale_method"/>
<prop v="60" k="size"/>
<prop v="3x:0,0,0,0,0,0" k="size_map_unit_scale"/>
<prop v="Pixel" k="size_unit"/>
<prop v="1" k="vertical_anchor_point"/>
<data_defined_properties>
<Option type="Map">
<Option name="name" type="QString" value=""/>
<Option name="properties"/>
<Option name="type" type="QString" value="collection"/>
</Option>
</data_defined_properties>
</layer>
</symbol>
</symbols>
<rotation/>
<sizescale/>
</renderer-v2>
<customproperties>
<property value="id" key="dualview/previewExpressions"/>
<property value="0" key="embeddedWidgets/count"/>
<property key="variableNames"/>
<property key="variableValues"/>
</customproperties>
<blendMode>0</blendMode>
<featureBlendMode>0</featureBlendMode>
<layerOpacity>1</layerOpacity>
<SingleCategoryDiagramRenderer attributeLegend="1" diagramType="Histogram">
<DiagramCategory rotationOffset="270" penAlpha="255" backgroundColor="#ffffff" labelPlacementMethod="XHeight" scaleDependency="Area" height="15" width="15" enabled="0" sizeType="MM" lineSizeType="MM" diagramOrientation="Up" penWidth="0" penColor="#000000" sizeScale="3x:0,0,0,0,0,0" backgroundAlpha="255" opacity="1" scaleBasedVisibility="0" barWidth="5" lineSizeScale="3x:0,0,0,0,0,0" maxScaleDenominator="1e+08" minimumSize="0" minScaleDenominator="1">
<fontProperties style="" description=".SF NS Text,13,-1,5,50,0,0,0,0,0"/>
<attribute color="#000000" label="" field=""/>
</DiagramCategory>
</SingleCategoryDiagramRenderer>
<DiagramLayerSettings placement="0" dist="0" showAll="1" obstacle="0" priority="0" linePlacementFlags="18" zIndex="0">
<properties>
<Option type="Map">
<Option name="name" type="QString" value=""/>
<Option name="properties"/>
<Option name="type" type="QString" value="collection"/>
</Option>
</properties>
</DiagramLayerSettings>
<geometryOptions geometryPrecision="0" removeDuplicateNodes="0">
<activeChecks/>
<checkConfiguration/>
</geometryOptions>
<fieldConfiguration>
<field name="fid">
<editWidget type="">
<config>
<Option/>
</config>
</editWidget>
</field>
<field name="id">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
</fieldConfiguration>
<aliases>
<alias name="" field="fid" index="0"/>
<alias name="" field="id" index="1"/>
</aliases>
<excludeAttributesWMS/>
<excludeAttributesWFS/>
<defaults>
<default field="fid" applyOnUpdate="0" expression=""/>
<default field="id" applyOnUpdate="0" expression=""/>
</defaults>
<constraints>
<constraint unique_strength="1" field="fid" constraints="3" exp_strength="0" notnull_strength="1"/>
<constraint unique_strength="1" field="id" constraints="3" exp_strength="0" notnull_strength="1"/>
</constraints>
<constraintExpressions>
<constraint exp="" field="fid" desc=""/>
<constraint exp="" field="id" desc=""/>
</constraintExpressions>
<expressionfields/>
<attributeactions>
<defaultAction value="{00000000-0000-0000-0000-000000000000}" key="Canvas"/>
</attributeactions>
<attributetableconfig actionWidgetStyle="dropDown" sortExpression="" sortOrder="0">
<columns>
<column name="id" type="field" width="-1" hidden="0"/>
<column name="contract_code" type="field" width="-1" hidden="0"/>
<column name="contract_name" type="field" width="-1" hidden="0"/>
<column type="actions" width="-1" hidden="1"/>
<column name="asset_uid" type="field" width="-1" hidden="0"/>
<column name="bu_id" type="field" width="-1" hidden="0"/>
<column name="bu_name" type="field" width="-1" hidden="0"/>
<column name="country_name" type="field" width="-1" hidden="0"/>
<column name="community_id" type="field" width="-1" hidden="0"/>
<column name="community_name" type="field" width="-1" hidden="0"/>
<column name="time_zone" type="field" width="-1" hidden="0"/>
<column name="insertion_time" type="field" width="-1" hidden="0"/>
<column name="reception_time" type="field" width="-1" hidden="0"/>
<column name="asset_id" type="field" width="-1" hidden="0"/>
<column name="gis_asset_id" type="field" width="-1" hidden="0"/>
<column name="gis_asset_uuid" type="field" width="-1" hidden="0"/>
<column name="local_activity_level1" type="field" width="-1" hidden="0"/>
<column name="asset_post_code_local" type="field" width="-1" hidden="0"/>
<column name="asset_town" type="field" width="-1" hidden="0"/>
<column name="asset_street_name" type="field" width="-1" hidden="0"/>
<column name="asset_data_source" type="field" width="-1" hidden="0"/>
<column name="asset_domain" type="field" width="-1" hidden="0"/>
<column name="asset_operator" type="field" width="-1" hidden="0"/>
<column name="asset_owner" type="field" width="-1" hidden="0"/>
<column name="asset_precision_class" type="field" width="-1" hidden="0"/>
<column name="asset_status" type="field" width="-1" hidden="0"/>
<column name="asset_type_text" type="field" width="-1" hidden="0"/>
<column name="asset_subtype" type="field" width="-1" hidden="0"/>
<column name="asset_function" type="field" width="-1" hidden="0"/>
<column name="cmms_asset_id" type="field" width="-1" hidden="0"/>
<column name="asset_name" type="field" width="-1" hidden="0"/>
<column name="asset_street_name_added_information" type="field" width="-1" hidden="0"/>
<column name="asset_commissioning_date" type="field" width="-1" hidden="0"/>
<column name="asset_closure_date" type="field" width="-1" hidden="0"/>
<column name="tank_vessels_number" type="field" width="-1" hidden="0"/>
<column name="tank_vessels_volume_capacity" type="field" width="-1" hidden="0"/>
<column name="installation_invert_altitude" type="field" width="-1" hidden="0"/>
<column name="installation_overflow_altitude" type="field" width="-1" hidden="0"/>
<column name="installation_land_altitude" type="field" width="-1" hidden="0"/>
<column name="asset_longitude" type="field" width="-1" hidden="0"/>
<column name="asset_latitude" type="field" width="-1" hidden="0"/>
<column name="angle" type="field" width="-1" hidden="0"/>
</columns>
</attributetableconfig>
<conditionalstyles>
<rowstyles/>
<fieldstyles/>
</conditionalstyles>
<editform tolerant="1">.</editform>
<editforminit/>
<editforminitcodesource>0</editforminitcodesource>
<editforminitfilepath></editforminitfilepath>
<editforminitcode></editforminitcode>
<featformsuppress>0</featformsuppress>
<editorlayout>generatedlayout</editorlayout>
<editable>
<field name="activity_code" editable="1"/>
<field name="activity_name" editable="1"/>
<field name="activity_type" editable="1"/>
<field name="address" editable="1"/>
<field name="angle" editable="1"/>
<field name="asset_closure_date" editable="1"/>
<field name="asset_commissioning_date" editable="1"/>
<field name="asset_data_source" editable="1"/>
<field name="asset_domain" editable="1"/>
<field name="asset_function" editable="1"/>
<field name="asset_id" editable="1"/>
<field name="asset_latitude" editable="1"/>
<field name="asset_longitude" editable="1"/>
<field name="asset_name" editable="1"/>
<field name="asset_operator" editable="1"/>
<field name="asset_owner" editable="1"/>
<field name="asset_post_code_local" editable="1"/>
<field name="asset_precision_class" editable="1"/>
<field name="asset_status" editable="1"/>
<field name="asset_street_name" editable="1"/>
<field name="asset_street_name_added_information" editable="1"/>
<field name="asset_subtype" editable="1"/>
<field name="asset_town" editable="1"/>
<field name="asset_type_text" editable="1"/>
<field name="asset_uid" editable="1"/>
<field name="bottom_slab_level" editable="1"/>
<field name="bu_id" editable="1"/>
<field name="bu_name" editable="1"/>
<field name="capacity" editable="1"/>
<field name="city_code" editable="1"/>
<field name="city_name" editable="1"/>
<field name="cmms_asset_id" editable="1"/>
<field name="code" editable="1"/>
<field name="community_id" editable="1"/>
<field name="community_name" editable="1"/>
<field name="contract_code" editable="1"/>
<field name="contract_name" editable="1"/>
<field name="country_name" editable="1"/>
<field name="data_source" editable="1"/>
<field name="date_insert" editable="1"/>
<field name="date_maj_ddesk" editable="1"/>
<field name="date_update" editable="1"/>
<field name="default" editable="1"/>
<field name="district_name" editable="1"/>
<field name="ditrict_code" editable="1"/>
<field name="ditrict_name" editable="1"/>
<field name="end_of_operation_date" editable="1"/>
<field name="flow_daily" editable="1"/>
<field name="flow_peak" editable="1"/>
<field name="gis_asset_id" editable="1"/>
<field name="gis_asset_uuid" editable="1"/>
<field name="ground_level" editable="1"/>
<field name="id" editable="1"/>
<field name="insertion_time" editable="1"/>
<field name="installation_invert_altitude" editable="1"/>
<field name="installation_land_altitude" editable="1"/>
<field name="installation_overflow_altitude" editable="1"/>
<field name="local_activity_level1" editable="1"/>
<field name="name" editable="1"/>
<field name="num_tanks" editable="1"/>
<field name="operator" editable="1"/>
<field name="overflow_level" editable="1"/>
<field name="owner" editable="1"/>
<field name="power" editable="1"/>
<field name="precision_class" editable="1"/>
<field name="pressure_zone_name" editable="1"/>
<field name="pressure_zone_type" editable="1"/>
<field name="pump_nb" editable="1"/>
<field name="reception_time" editable="1"/>
<field name="service_date" editable="1"/>
<field name="service_year" editable="1"/>
<field name="source_id" editable="1"/>
<field name="status" editable="1"/>
<field name="street_name" editable="1"/>
<field name="tank_vessels_number" editable="1"/>
<field name="tank_vessels_volume_capacity" editable="1"/>
<field name="time_zone" editable="1"/>
<field name="type" editable="1"/>
</editable>
<labelOnTop>
<field name="activity_code" labelOnTop="0"/>
<field name="activity_name" labelOnTop="0"/>
<field name="activity_type" labelOnTop="0"/>
<field name="address" labelOnTop="0"/>
<field name="angle" labelOnTop="0"/>
<field name="asset_closure_date" labelOnTop="0"/>
<field name="asset_commissioning_date" labelOnTop="0"/>
<field name="asset_data_source" labelOnTop="0"/>
<field name="asset_domain" labelOnTop="0"/>
<field name="asset_function" labelOnTop="0"/>
<field name="asset_id" labelOnTop="0"/>
<field name="asset_latitude" labelOnTop="0"/>
<field name="asset_longitude" labelOnTop="0"/>
<field name="asset_name" labelOnTop="0"/>
<field name="asset_operator" labelOnTop="0"/>
<field name="asset_owner" labelOnTop="0"/>
<field name="asset_post_code_local" labelOnTop="0"/>
<field name="asset_precision_class" labelOnTop="0"/>
<field name="asset_status" labelOnTop="0"/>
<field name="asset_street_name" labelOnTop="0"/>
<field name="asset_street_name_added_information" labelOnTop="0"/>
<field name="asset_subtype" labelOnTop="0"/>
<field name="asset_town" labelOnTop="0"/>
<field name="asset_type_text" labelOnTop="0"/>
<field name="asset_uid" labelOnTop="0"/>
<field name="bottom_slab_level" labelOnTop="0"/>
<field name="bu_id" labelOnTop="0"/>
<field name="bu_name" labelOnTop="0"/>
<field name="capacity" labelOnTop="0"/>
<field name="city_code" labelOnTop="0"/>
<field name="city_name" labelOnTop="0"/>
<field name="cmms_asset_id" labelOnTop="0"/>
<field name="code" labelOnTop="0"/>
<field name="community_id" labelOnTop="0"/>
<field name="community_name" labelOnTop="0"/>
<field name="contract_code" labelOnTop="0"/>
<field name="contract_name" labelOnTop="0"/>
<field name="country_name" labelOnTop="0"/>
<field name="data_source" labelOnTop="0"/>
<field name="date_insert" labelOnTop="0"/>
<field name="date_maj_ddesk" labelOnTop="0"/>
<field name="date_update" labelOnTop="0"/>
<field name="default" labelOnTop="0"/>
<field name="district_name" labelOnTop="0"/>
<field name="ditrict_code" labelOnTop="0"/>
<field name="ditrict_name" labelOnTop="0"/>
<field name="end_of_operation_date" labelOnTop="0"/>
<field name="flow_daily" labelOnTop="0"/>
<field name="flow_peak" labelOnTop="0"/>
<field name="gis_asset_id" labelOnTop="0"/>
<field name="gis_asset_uuid" labelOnTop="0"/>
<field name="ground_level" labelOnTop="0"/>
<field name="id" labelOnTop="0"/>
<field name="insertion_time" labelOnTop="0"/>
<field name="installation_invert_altitude" labelOnTop="0"/>
<field name="installation_land_altitude" labelOnTop="0"/>
<field name="installation_overflow_altitude" labelOnTop="0"/>
<field name="local_activity_level1" labelOnTop="0"/>
<field name="name" labelOnTop="0"/>
<field name="num_tanks" labelOnTop="0"/>
<field name="operator" labelOnTop="0"/>
<field name="overflow_level" labelOnTop="0"/>
<field name="owner" labelOnTop="0"/>
<field name="power" labelOnTop="0"/>
<field name="precision_class" labelOnTop="0"/>
<field name="pressure_zone_name" labelOnTop="0"/>
<field name="pressure_zone_type" labelOnTop="0"/>
<field name="pump_nb" labelOnTop="0"/>
<field name="reception_time" labelOnTop="0"/>
<field name="service_date" labelOnTop="0"/>
<field name="service_year" labelOnTop="0"/>
<field name="source_id" labelOnTop="0"/>
<field name="status" labelOnTop="0"/>
<field name="street_name" labelOnTop="0"/>
<field name="tank_vessels_number" labelOnTop="0"/>
<field name="tank_vessels_volume_capacity" labelOnTop="0"/>
<field name="time_zone" labelOnTop="0"/>
<field name="type" labelOnTop="0"/>
</labelOnTop>
<widgets/>
<previewExpression>id</previewExpression>
<mapTip></mapTip>
</maplayer>
</projectlayers>
<layerorder>
<layer id="wms_tile_buffer_data_fcfdbf36_dd5a_45d6_b770_bdbb3794cf98"/>
</layerorder>
<properties>
<DefaultStyles>
<ColorRamp type="QString"></ColorRamp>
<Fill type="QString"></Fill>
<Line type="QString"></Line>
<Marker type="QString"></Marker>
<Opacity type="double">1</Opacity>
<RandomColors type="bool">true</RandomColors>
</DefaultStyles>
<Gui>
<CanvasColorBluePart type="int">255</CanvasColorBluePart>
<CanvasColorGreenPart type="int">255</CanvasColorGreenPart>
<CanvasColorRedPart type="int">255</CanvasColorRedPart>
<SelectionColorAlphaPart type="int">255</SelectionColorAlphaPart>
<SelectionColorBluePart type="int">0</SelectionColorBluePart>
<SelectionColorGreenPart type="int">255</SelectionColorGreenPart>
<SelectionColorRedPart type="int">255</SelectionColorRedPart>
</Gui>
<Legend>
<filterByMap type="bool">false</filterByMap>
</Legend>
<Macros>
<pythonCode type="QString"></pythonCode>
</Macros>
<Measure>
<Ellipsoid type="QString">WGS84</Ellipsoid>
</Measure>
<Measurement>
<AreaUnits type="QString">&lt;unknown></AreaUnits>
<DistanceUnits type="QString">meters</DistanceUnits>
</Measurement>
<PAL>
<CandidatesLine type="int">50</CandidatesLine>
<CandidatesPoint type="int">16</CandidatesPoint>
<CandidatesPolygon type="int">30</CandidatesPolygon>
<DrawOutlineLabels type="bool">true</DrawOutlineLabels>
<DrawRectOnly type="bool">false</DrawRectOnly>
<SearchMethod type="int">0</SearchMethod>
<ShowingAllLabels type="bool">false</ShowingAllLabels>
<ShowingCandidates type="bool">false</ShowingCandidates>
<ShowingPartialsLabels type="bool">true</ShowingPartialsLabels>
<TextFormat type="int">0</TextFormat>
</PAL>
<Paths>
<Absolute type="bool">false</Absolute>
</Paths>
<PositionPrecision>
<Automatic type="bool">true</Automatic>
<DecimalPlaces type="int">2</DecimalPlaces>
<DegreeFormat type="QString">MU</DegreeFormat>
</PositionPrecision>
<SpatialRefSys>
<ProjectionsEnabled type="int">1</ProjectionsEnabled>
</SpatialRefSys>
<WCSLayers type="QStringList"/>
<WCSUrl type="QString"></WCSUrl>
<WFSLayers type="QStringList"/>
<WFSTLayers>
<Delete type="QStringList"/>
<Insert type="QStringList"/>
<Update type="QStringList"/>
</WFSTLayers>
<WFSUrl type="QString"></WFSUrl>
<WMSAccessConstraints type="QString">None</WMSAccessConstraints>
<WMSAddWktGeometry type="bool">true</WMSAddWktGeometry>
<WMSContactMail type="QString"></WMSContactMail>
<WMSContactOrganization type="QString"></WMSContactOrganization>
<WMSContactPerson type="QString"></WMSContactPerson>
<WMSContactPhone type="QString"></WMSContactPhone>
<WMSContactPosition type="QString"></WMSContactPosition>
<WMSDefaultMapUnitsPerMm type="double">1</WMSDefaultMapUnitsPerMm>
<WMSFees type="QString">conditions unknown</WMSFees>
<WMSImageQuality type="int">90</WMSImageQuality>
<WMSKeywordList type="QStringList">
<value></value>
</WMSKeywordList>
<WMSMaxAtlasFeatures type="int">1</WMSMaxAtlasFeatures>
<WMSOnlineResource type="QString"></WMSOnlineResource>
<WMSPrecision type="QString">8</WMSPrecision>
<WMSRequestDefinedDataSources type="bool">false</WMSRequestDefinedDataSources>
<WMSRootName type="QString"></WMSRootName>
<WMSSegmentizeFeatureInfoGeometry type="bool">false</WMSSegmentizeFeatureInfoGeometry>
<WMSServiceAbstract type="QString"></WMSServiceAbstract>
<WMSServiceCapabilities type="bool">false</WMSServiceCapabilities>
<WMSServiceTitle type="QString"></WMSServiceTitle>
<WMSTileBuffer type="int">60</WMSTileBuffer>
<WMSUrl type="QString"></WMSUrl>
<WMSUseLayerIDs type="bool">false</WMSUseLayerIDs>
<WMTSGrids>
<CRS type="QStringList"/>
<Config type="QStringList"/>
</WMTSGrids>
<WMTSJpegLayers>
<Group type="QStringList"/>
<Layer type="QStringList">
<value>wms_tile_buffer_data_fcfdbf36_dd5a_45d6_b770_bdbb3794cf98</value>
</Layer>
<Project type="bool">true</Project>
</WMTSJpegLayers>
<WMTSLayers>
<Group type="QStringList"/>
<Layer type="QStringList">
<value>wms_tile_buffer_data_fcfdbf36_dd5a_45d6_b770_bdbb3794cf98</value>
</Layer>
<Project type="bool">true</Project>
</WMTSLayers>
<WMTSMinScale type="int">5000</WMTSMinScale>
<WMTSPngLayers>
<Group type="QStringList"/>
<Layer type="QStringList">
<value>wms_tile_buffer_data_fcfdbf36_dd5a_45d6_b770_bdbb3794cf98</value>
</Layer>
<Project type="bool">true</Project>
</WMTSPngLayers>
<WMTSUrl type="QString"></WMTSUrl>
</properties>
<visibility-presets/>
<transformContext/>
<projectMetadata>
<identifier></identifier>
<parentidentifier></parentidentifier>
<language></language>
<type></type>
<title></title>
<abstract></abstract>
<contact>
<name></name>
<organization></organization>
<position></position>
<voice></voice>
<fax></fax>
<email></email>
<role></role>
</contact>
<links/>
<author>SALSE Alice</author>
<creation>2019-02-13T15:29:32</creation>
</projectMetadata>
<Annotations/>
<Layouts/>
</qgis>

Binary file not shown.