| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,169 @@ | ||
| /*************************************************************************** | ||
| qgsaccesscontrol.cpp | ||
| -------------------- | ||
| begin : 22-05-2015 | ||
| copyright : (C) 2008 by Stéphane Brunner | ||
| email : stephane dot brunner at camptocamp dot com | ||
| ***************************************************************************/ | ||
|
|
||
| /*************************************************************************** | ||
| * * | ||
| * 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. * | ||
| * * | ||
| ***************************************************************************/ | ||
|
|
||
| #include "qgsaccesscontrol.h" | ||
| #include "qgsfeaturerequest.h" | ||
| #include "qgsmaplayer.h" | ||
| #include "qgsvectorlayer.h" | ||
|
|
||
| #include <QStringList> | ||
|
|
||
|
|
||
| /** Filter the features of the layer */ | ||
| void QgsAccessControl::filterFeatures( const QgsVectorLayer* layer, QgsFeatureRequest& featureRequest ) const | ||
| { | ||
| QStringList expressions = QStringList(); | ||
| QgsAccessControlFilterMap::const_iterator acIterator; | ||
| for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator ) | ||
| { | ||
| const QString expression = acIterator.value()->layerFilterExpression( layer ); | ||
| if ( expression != NULL ) { | ||
| expressions.append( expression ); | ||
| } | ||
| } | ||
| if ( !expressions.isEmpty() ) { | ||
| featureRequest.setFilterExpression( expressions.join(" AND ") ); | ||
| } | ||
| } | ||
|
|
||
| /** Clone the object */ | ||
| QgsFeatureFilterProvider* QgsAccessControl::clone() const | ||
| { | ||
| return new QgsAccessControl(*this); | ||
| } | ||
|
|
||
| /** Return an additional subset string (typically SQL) filter */ | ||
| const QString QgsAccessControl::extraSubsetString( const QgsVectorLayer* layer ) const | ||
| { | ||
| QStringList sqls = QStringList(); | ||
| QgsAccessControlFilterMap::const_iterator acIterator; | ||
| for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator ) | ||
| { | ||
| const QString sql = acIterator.value()->layerFilterSubsetString( layer ); | ||
| if ( sql != NULL ) { | ||
| sqls.append( sql ); | ||
| } | ||
| } | ||
| return sqls.isEmpty() ? NULL : sqls.join(" AND "); | ||
| } | ||
|
|
||
| /** Return the layer read right */ | ||
| bool QgsAccessControl::layerReadPermission( const QgsMapLayer* layer ) const | ||
| { | ||
| QgsAccessControlFilterMap::const_iterator acIterator; | ||
| for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator ) | ||
| { | ||
| if ( !acIterator.value()->layerPermissions( layer ).canRead) | ||
| { | ||
| return false; | ||
| } | ||
| } | ||
| return true; | ||
| } | ||
|
|
||
| /** Return the layer insert right */ | ||
| bool QgsAccessControl::layerInsertPermission( const QgsVectorLayer* layer ) const | ||
| { | ||
| QgsAccessControlFilterMap::const_iterator acIterator; | ||
| for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator ) | ||
| { | ||
| if ( !acIterator.value()->layerPermissions( layer ).canInsert) | ||
| { | ||
| return false; | ||
| } | ||
| } | ||
| return true; | ||
| } | ||
|
|
||
| /** Return the layer update right */ | ||
| bool QgsAccessControl::layerUpdatePermission( const QgsVectorLayer* layer ) const | ||
| { | ||
| QgsAccessControlFilterMap::const_iterator acIterator; | ||
| for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator ) | ||
| { | ||
| if ( !acIterator.value()->layerPermissions( layer ).canUpdate) | ||
| { | ||
| return false; | ||
| } | ||
| } | ||
| return true; | ||
| } | ||
|
|
||
| /** Return the layer delete right */ | ||
| bool QgsAccessControl::layerDeletePermission( const QgsVectorLayer* layer ) const | ||
| { | ||
| QgsAccessControlFilterMap::const_iterator acIterator; | ||
| for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator ) | ||
| { | ||
| if ( !acIterator.value()->layerPermissions( layer ).canDelete) | ||
| { | ||
| return false; | ||
| } | ||
| } | ||
| return true; | ||
| } | ||
|
|
||
| /** Return the authorized layer attributes */ | ||
| const QStringList QgsAccessControl::layerAttributes( const QgsVectorLayer* layer, const QStringList attributes ) const | ||
| { | ||
| QStringList currentAttributes( attributes ); | ||
| QgsAccessControlFilterMap::const_iterator acIterator; | ||
| for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator ) | ||
| { | ||
| const QStringList* newAttributes = acIterator.value()->authorizedLayerAttributes( layer, currentAttributes ); | ||
| if (newAttributes != NULL) { | ||
| currentAttributes = *newAttributes; | ||
| } | ||
| } | ||
| return currentAttributes; | ||
| } | ||
|
|
||
| /** Are we authorized to modify the following geometry */ | ||
| bool QgsAccessControl::allowToEdit( const QgsVectorLayer* layer, const QgsFeature& feature ) const | ||
| { | ||
| QgsAccessControlFilterMap::const_iterator acIterator; | ||
| for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator ) | ||
| { | ||
| if ( !acIterator.value()->allowToEdit( layer, feature ) ) | ||
| { | ||
| return false; | ||
| } | ||
| } | ||
| return true; | ||
| } | ||
|
|
||
| /** Fill the capabilities caching key */ | ||
| bool QgsAccessControl::fillCacheKey( QStringList& cacheKey ) const | ||
| { | ||
| QgsAccessControlFilterMap::const_iterator acIterator; | ||
| for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator ) | ||
| { | ||
| QString newKey = acIterator.value()->cacheKey(); | ||
| if ( newKey.length() == 0 ) { | ||
| cacheKey.clear(); | ||
| return false; | ||
| } | ||
| cacheKey << newKey; | ||
| } | ||
| return true; | ||
| } | ||
|
|
||
| /** Register a new access control filter */ | ||
| void QgsAccessControl::registerAccessControl( QgsAccessControlFilter* accessControl, int priority ) | ||
| { | ||
| mPluginsAccessControls->insert( priority, accessControl ); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,125 @@ | ||
| /*************************************************************************** | ||
| qgsaccesscontrol.h | ||
| ------------------ | ||
| begin : 22-05-2015 | ||
| copyright : (C) 2008 by Stéphane Brunner | ||
| email : stephane dot brunner at camptocamp dot com | ||
| ***************************************************************************/ | ||
|
|
||
| /*************************************************************************** | ||
| * * | ||
| * 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. * | ||
| * * | ||
| ***************************************************************************/ | ||
|
|
||
| #ifndef QGSACCESSCONTROL_H | ||
| #define QGSACCESSCONTROL_H | ||
|
|
||
| #include "qgsfeaturefilterprovider.h" | ||
| #include "qgsaccesscontrolfilter.h" | ||
|
|
||
| #include <QMultiMap> | ||
|
|
||
| class QgsAccessControlPlugin; | ||
|
|
||
|
|
||
| /** \ingroup server | ||
| * \class QgsAccessControl | ||
| * \brief A helper class that centralise the restrictions given by all the | ||
| * access control filter plugins. | ||
| **/ | ||
| class SERVER_EXPORT QgsAccessControl : public QgsFeatureFilterProvider | ||
| { | ||
| public: | ||
| /** Constructor */ | ||
| QgsAccessControl() | ||
| { | ||
| mPluginsAccessControls = new QgsAccessControlFilterMap(); | ||
| }; | ||
| /** Constructor */ | ||
| QgsAccessControl( const QgsAccessControl& copy ) | ||
| { | ||
| mPluginsAccessControls = new QgsAccessControlFilterMap( *copy.mPluginsAccessControls ); | ||
| }; | ||
| /** Destructor */ | ||
| ~QgsAccessControl() | ||
| { | ||
| delete mPluginsAccessControls; | ||
| }; | ||
|
|
||
| /** Filter the features of the layer | ||
| * @param layer the layer to control | ||
| * @param filterFeatures the request to fill | ||
| */ | ||
| void filterFeatures( const QgsVectorLayer* layer, QgsFeatureRequest& filterFeatures ) const; | ||
|
|
||
| /** Return a clone of the object | ||
| * @return A clone | ||
| */ | ||
| QgsFeatureFilterProvider* clone() const; | ||
|
|
||
| /** Return an additional subset string (typically SQL) filter | ||
| * @param layer the layer to control | ||
| * @return the subset string to use | ||
| */ | ||
| const QString extraSubsetString( const QgsVectorLayer* layer ) const; | ||
|
|
||
| /** Return the layer read right | ||
| * @param layer the layer to control | ||
| * @return true if it can be read | ||
| */ | ||
| bool layerReadPermission( const QgsMapLayer* layer ) const; | ||
|
|
||
| /** Return the layer insert right | ||
| * @param layer the layer to control | ||
| * @return true if we can insert on it | ||
| */ | ||
| bool layerInsertPermission( const QgsVectorLayer* layer ) const; | ||
|
|
||
| /** Return the layer update right | ||
| * @param layer the layer to control | ||
| * @return true if we can do an update | ||
| */ | ||
| bool layerUpdatePermission( const QgsVectorLayer* layer ) const; | ||
|
|
||
| /** Return the layer delete right | ||
| * @param layer the layer to control | ||
| * @return true if we can do a delete | ||
| */ | ||
| bool layerDeletePermission( const QgsVectorLayer* layer ) const; | ||
|
|
||
| /** Return the authorized layer attributes | ||
| * @param layer the layer to control | ||
| * @param attributes the list of attribute | ||
| * @return the list of visible attributes | ||
| */ | ||
| const QStringList layerAttributes( const QgsVectorLayer* layer, const QStringList attributes ) const; | ||
|
|
||
| /** Are we authorized to modify the following geometry | ||
| * @param layer the layer to control | ||
| * @param feature the concerned feature | ||
| * @return true if we are allowed to edit the feature | ||
| */ | ||
| bool allowToEdit( const QgsVectorLayer* layer, const QgsFeature& feature ) const; | ||
|
|
||
| /** Fill the capabilities caching key | ||
| * @param cacheKey the list to fill with a cache variant | ||
| * @return false if we cant create a cache | ||
| */ | ||
| bool fillCacheKey( QStringList& cacheKey ) const; | ||
|
|
||
| /** Register an access control filter | ||
| * @param accessControl the access control to add | ||
| * @priority the priority used to define the order | ||
| */ | ||
| void registerAccessControl( QgsAccessControlFilter* accessControl, int priority = 0 ); | ||
|
|
||
| private: | ||
| /** The AccessControl plugins registry */ | ||
| QgsAccessControlFilterMap* mPluginsAccessControls; | ||
| }; | ||
|
|
||
| #endif |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,87 @@ | ||
| /*************************************************************************** | ||
| qgsaccesscontrolplugin.cpp | ||
| -------------------------- | ||
| Access control interface for Qgis Server plugins | ||
| begin : 2015-05-19 | ||
| copyright : (C) 2015 by Stéphane Brunner | ||
| email : stephane dot brunner at camptocamp dot org | ||
| ***************************************************************************/ | ||
|
|
||
| /*************************************************************************** | ||
| * * | ||
| * 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. * | ||
| * * | ||
| ***************************************************************************/ | ||
|
|
||
|
|
||
| #include "qgsaccesscontrolfilter.h" | ||
| #include "qgsmessagelog.h" | ||
|
|
||
| #include <QString> | ||
| #include <QStringList> | ||
|
|
||
|
|
||
| /** Constructor */ | ||
| QgsAccessControlFilter::QgsAccessControlFilter( const QgsServerInterface* serverInterface ): | ||
| mServerInterface( serverInterface ) | ||
| { | ||
| } | ||
|
|
||
| /** Destructor */ | ||
| QgsAccessControlFilter::~QgsAccessControlFilter() | ||
| { | ||
| } | ||
|
|
||
| /** Return an additional layer expression filter */ | ||
| const QString QgsAccessControlFilter::layerFilterExpression( const QgsVectorLayer* layer ) const | ||
| { | ||
| QgsMessageLog::logMessage( "QgsAccessControlFilter plugin default layerFilterExpression called", "AccessControlFilter", QgsMessageLog::INFO ); | ||
| Q_UNUSED( layer ); | ||
| return NULL; | ||
| } | ||
|
|
||
| /** Return an additional layer subset string (typically SQL) filter */ | ||
| const QString QgsAccessControlFilter::layerFilterSubsetString( const QgsVectorLayer* layer ) const | ||
| { | ||
| QgsMessageLog::logMessage( "QgsAccessControlFilter plugin default layerFilterSQL called", "AccessControlFilter", QgsMessageLog::INFO ); | ||
| Q_UNUSED( layer ); | ||
| return NULL; | ||
| } | ||
|
|
||
| /** Return the layer permissions */ | ||
| const QgsAccessControlFilter::LayerPermissions QgsAccessControlFilter::layerPermissions( const QgsMapLayer* layer ) const | ||
| { | ||
| QgsMessageLog::logMessage( "QgsAccessControlFilter plugin default layerPermissions called", "AccessControlFilter", QgsMessageLog::INFO ); | ||
| Q_UNUSED( layer ); | ||
| LayerPermissions permissions = QgsAccessControlFilter::LayerPermissions(); | ||
| permissions.canRead = permissions.canUpdate = permissions.canInsert = permissions.canDelete = true; | ||
| return permissions; | ||
| } | ||
|
|
||
| /** Return the authorized layer attributes */ | ||
| const QStringList* QgsAccessControlFilter::authorizedLayerAttributes( const QgsVectorLayer* layer, const QStringList& attributes ) const | ||
| { | ||
| Q_UNUSED( layer ); | ||
| Q_UNUSED( attributes ); | ||
| QgsMessageLog::logMessage( "QgsAccessControlFilter plugin default authorizedLayerAttributes called", "AccessControlFilter", QgsMessageLog::INFO ); | ||
| return NULL; | ||
| } | ||
|
|
||
| /** Are we authorized to modify the feature */ | ||
| bool QgsAccessControlFilter::allowToEdit( const QgsVectorLayer* layer, const QgsFeature& feature ) const | ||
| { | ||
| QgsMessageLog::logMessage( "QgsAccessControlFilter plugin default allowToEdit called", "AccessControlFilter", QgsMessageLog::INFO ); | ||
| Q_UNUSED( layer ); | ||
| Q_UNUSED( feature ); | ||
| return true; | ||
| } | ||
|
|
||
| /** Cache key to used to create the capabilities cache, "" for no cache */ | ||
| const QString QgsAccessControlFilter::cacheKey() const | ||
| { | ||
| return ""; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,115 @@ | ||
| /*************************************************************************** | ||
| qgsaccesscontrolfilter.h | ||
| ------------------------ | ||
| begin : 2015-05-19 | ||
| copyright : (C) 2015 by Stéphane Brunner | ||
| email : stephane dot brunner at camptocamp dot org | ||
| ***************************************************************************/ | ||
|
|
||
| /*************************************************************************** | ||
| * * | ||
| * 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. * | ||
| * * | ||
| ***************************************************************************/ | ||
|
|
||
| #ifndef QGSACCESSCONTROLPLUGIN_H | ||
| #define QGSACCESSCONTROLPLUGIN_H | ||
|
|
||
| #include <QMultiMap> | ||
| #include <QList> | ||
| #include <QString> | ||
|
|
||
| class QgsServerInterface; | ||
| class QgsMapLayer; | ||
| class QgsVectorLayer; | ||
| class QgsExpression; | ||
| class QgsFeature; | ||
|
|
||
|
|
||
| /** | ||
| * \class QgsAccessControlFilter | ||
| * \brief Class defining access control interface for QGIS Server plugins. | ||
| * | ||
| * Security can define any (or none) of the following method: | ||
| * * layerFilterExpression() - To get an additional expression filter (WMS/GetMap, WMS/GetFeatureInfo, WFS/GetFeature) | ||
| * * layerFilterSQL() - To get an additional SQL filter (WMS/GetMap, WMS/GetFeatureInfo, WFS/GetFeature) for layer that support SQL | ||
| * * layerPermissions() - To give the general layer permissins (read / update / insert / delete) | ||
| * * authorizedLayerAttributes() - Tho filter the attributes (WMS/GetFeatureInfo, WFS/GetFeature) | ||
| * * allowToEdit() - (all WFS-T requests) | ||
| */ | ||
| class SERVER_EXPORT QgsAccessControlFilter | ||
| { | ||
|
|
||
| public: | ||
|
|
||
| /** Constructor | ||
| * QgsServerInterface passed to plugins constructors | ||
| * and must be passed to QgsAccessControlFilter instances. | ||
| */ | ||
| QgsAccessControlFilter( const QgsServerInterface* serverInterface ); | ||
| /** Destructor */ | ||
| virtual ~QgsAccessControlFilter(); | ||
|
|
||
| /** Describe the layer permission */ | ||
| struct LayerPermissions { | ||
| bool canRead; | ||
| bool canUpdate; | ||
| bool canInsert; | ||
| bool canDelete; | ||
| }; | ||
|
|
||
| /** Return the QgsServerInterface instance */ | ||
| const QgsServerInterface* serverInterface() const { return mServerInterface; } | ||
|
|
||
| /** Return an additional expression filter | ||
| * @param layer the layer to control | ||
| * @return the filter expression | ||
| */ | ||
| virtual const QString layerFilterExpression( const QgsVectorLayer* layer ) const; | ||
|
|
||
| /** Return an additional subset string (typically SQL) filter | ||
| * @param layer the layer to control | ||
| * @return the subset string | ||
| */ | ||
| virtual const QString layerFilterSubsetString( const QgsVectorLayer* layer ) const; | ||
|
|
||
| /** Return the layer permissions | ||
| * @param layer the layer to control | ||
| * @return the permission to use on the layer | ||
| */ | ||
| virtual const LayerPermissions layerPermissions( const QgsMapLayer* layer ) const; | ||
|
|
||
| /** Return the authorized layer attributes | ||
| * @param layer the layer to control | ||
| * @param attributes the current list of visible attribute | ||
| * @return the new list of visible attributes | ||
| */ | ||
| virtual const QStringList* authorizedLayerAttributes( const QgsVectorLayer* layer, const QStringList& attributes ) const; | ||
|
|
||
| /** Are we authorized to modify the following geometry | ||
| * @param layer the layer to control | ||
| * @param feature the concerned feature | ||
| * @return true if we are allowed to edit | ||
| */ | ||
| virtual bool allowToEdit( const QgsVectorLayer* layer, const QgsFeature& feature ) const; | ||
|
|
||
| /** Cache key to used to create the capabilities cache | ||
| * @return the cache key, "" for no cache | ||
| */ | ||
| virtual const QString cacheKey() const; | ||
|
|
||
| private: | ||
|
|
||
| /** The server interface */ | ||
| const QgsServerInterface* mServerInterface; | ||
|
|
||
| }; | ||
|
|
||
| /** The registry definition */ | ||
| typedef QMultiMap<int, QgsAccessControlFilter*> QgsAccessControlFilterMap; | ||
|
|
||
|
|
||
| #endif // QGSSERVERSECURITY_H |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,72 @@ | ||
| /*************************************************************************** | ||
| qgsowsserver.cpp | ||
| ------------------- | ||
| begin : February 27, 2012 | ||
| copyright : (C) 2012 by René-Luc D'Hont & Marco Hugentobler | ||
| email : rldhont at 3liz dot com | ||
| ***************************************************************************/ | ||
|
|
||
| /*************************************************************************** | ||
| * * | ||
| * 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. * | ||
| * * | ||
| ***************************************************************************/ | ||
|
|
||
| #include "qgsowsserver.h" | ||
| #include "qgsmaplayerregistry.h" | ||
| #include "qgsmessagelog.h" | ||
| #include "qgsvectorlayer.h" | ||
| #include "qgsvectordataprovider.h" | ||
|
|
||
|
|
||
| #ifdef HAVE_SERVER_PYTHON_PLUGINS | ||
| /** Apply filter from AccessControl */ | ||
| void QgsOWSServer::applyAccessControlLayerFilters( QgsMapLayer* mapLayer, QMap<QString, QString>& originalLayerFilters ) const | ||
| { | ||
| if ( QgsVectorLayer* layer = dynamic_cast<QgsVectorLayer*>( mapLayer ) ) | ||
| { | ||
| if ( layer->setSubsetString( "" ) ) | ||
| { | ||
| QString sql = mAccessControl->extraSubsetString( layer ); | ||
| if ( sql != NULL ) | ||
| { | ||
| if ( !originalLayerFilters.contains( layer->id() ) ) | ||
| { | ||
| originalLayerFilters.insert( layer->id(), layer->subsetString() ); | ||
| } | ||
| if ( !layer->subsetString().isEmpty() ) | ||
| { | ||
| sql.prepend( " AND " ); | ||
| sql.prepend( layer->subsetString() ); | ||
| } | ||
| layer->setSubsetString( sql ); | ||
| } | ||
| } | ||
| else | ||
| { | ||
| QgsMessageLog::logMessage( "Layer does not support Subset String" ); | ||
| } | ||
| } | ||
| } | ||
| #endif | ||
|
|
||
| /** Restore layer filter as original */ | ||
| void QgsOWSServer::restoreLayerFilters( const QMap<QString, QString>& filterMap ) const | ||
| { | ||
| QMap<QString, QString>::const_iterator filterIt = filterMap.constBegin(); | ||
| for ( ; filterIt != filterMap.constEnd(); ++filterIt ) | ||
| { | ||
| QgsVectorLayer* filteredLayer = dynamic_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( filterIt.key() ) ); | ||
| if ( filteredLayer ) | ||
| { | ||
| QgsVectorDataProvider* dp = filteredLayer->dataProvider(); | ||
| if ( dp ) | ||
| { | ||
| dp->setSubsetString( filterIt.value() ); | ||
| } | ||
| } | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,58 @@ | ||
| <!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'> | ||
| <qgis version="1.8.0-Trunk" minimumScale="0" maximumScale="1e+08" hasScaleBasedVisibilityFlag="0"> | ||
| <transparencyLevelInt>255</transparencyLevelInt> | ||
| <renderer-v2 symbollevels="0" type="singleSymbol"> | ||
| <symbols> | ||
| <symbol outputUnit="MM" alpha="1" type="fill" name="0"> | ||
| <layer pass="0" class="SimpleFill" locked="0"> | ||
| <prop k="color" v="145,149,158,255"/> | ||
| <prop k="color_border" v="157,157,157,255"/> | ||
| <prop k="offset" v="2,2"/> | ||
| <prop k="style" v="solid"/> | ||
| <prop k="style_border" v="solid"/> | ||
| <prop k="width_border" v="0.26"/> | ||
| </layer> | ||
| <layer pass="0" class="SimpleFill" locked="0"> | ||
| <prop k="color" v="0,0,255,255"/> | ||
| <prop k="color_border" v="0,0,0,255"/> | ||
| <prop k="offset" v="0,0"/> | ||
| <prop k="style" v="solid"/> | ||
| <prop k="style_border" v="solid"/> | ||
| <prop k="width_border" v="0.26"/> | ||
| </layer> | ||
| </symbol> | ||
| </symbols> | ||
| <rotation field=""/> | ||
| <sizescale field=""/> | ||
| </renderer-v2> | ||
| <customproperties/> | ||
| <displayfield>name</displayfield> | ||
| <label>0</label> | ||
| <labelattributes> | ||
| <label fieldname="" text="Label"/> | ||
| <family fieldname="" name="Ubuntu"/> | ||
| <size fieldname="" units="pt" value="12"/> | ||
| <bold fieldname="" on="0"/> | ||
| <italic fieldname="" on="0"/> | ||
| <underline fieldname="" on="0"/> | ||
| <strikeout fieldname="" on="0"/> | ||
| <color fieldname="" red="0" blue="0" green="0"/> | ||
| <x fieldname=""/> | ||
| <y fieldname=""/> | ||
| <offset x="0" y="0" units="pt" yfieldname="" xfieldname=""/> | ||
| <angle fieldname="" value="0" auto="0"/> | ||
| <alignment fieldname="" value="center"/> | ||
| <buffercolor fieldname="" red="255" blue="255" green="255"/> | ||
| <buffersize fieldname="" units="pt" value="1"/> | ||
| <bufferenabled fieldname="" on=""/> | ||
| <multilineenabled fieldname="" on=""/> | ||
| <selectedonly on=""/> | ||
| </labelattributes> | ||
| <edittypes> | ||
| <edittype type="0" name="name"/> | ||
| </edittypes> | ||
| <editform>.</editform> | ||
| <editforminit></editforminit> | ||
| <annotationform>.</annotationform> | ||
| <attributeactions/> | ||
| </qgis> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,59 @@ | ||
| <!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'> | ||
| <qgis version="1.8.0-Trunk" minimumScale="0" maximumScale="1e+08" hasScaleBasedVisibilityFlag="0"> | ||
| <transparencyLevelInt>255</transparencyLevelInt> | ||
| <renderer-v2 symbollevels="0" type="singleSymbol"> | ||
| <symbols> | ||
| <symbol outputUnit="MM" alpha="1" type="fill" name="0"> | ||
| <layer pass="0" class="SimpleFill" locked="0"> | ||
| <prop k="color" v="174,176,194,255"/> | ||
| <prop k="color_border" v="121,121,121,255"/> | ||
| <prop k="offset" v="2,2"/> | ||
| <prop k="style" v="solid"/> | ||
| <prop k="style_border" v="solid"/> | ||
| <prop k="width_border" v="0.26"/> | ||
| </layer> | ||
| <layer pass="0" class="SimpleFill" locked="0"> | ||
| <prop k="color" v="224,15,183,255"/> | ||
| <prop k="color_border" v="0,0,0,255"/> | ||
| <prop k="offset" v="0,0"/> | ||
| <prop k="style" v="solid"/> | ||
| <prop k="style_border" v="solid"/> | ||
| <prop k="width_border" v="0.26"/> | ||
| </layer> | ||
| </symbol> | ||
| </symbols> | ||
| <rotation field=""/> | ||
| <sizescale field=""/> | ||
| </renderer-v2> | ||
| <customproperties/> | ||
| <displayfield>pkuid</displayfield> | ||
| <label>0</label> | ||
| <labelattributes> | ||
| <label fieldname="" text="Label"/> | ||
| <family fieldname="" name="Ubuntu"/> | ||
| <size fieldname="" units="pt" value="12"/> | ||
| <bold fieldname="" on="0"/> | ||
| <italic fieldname="" on="0"/> | ||
| <underline fieldname="" on="0"/> | ||
| <strikeout fieldname="" on="0"/> | ||
| <color fieldname="" red="0" blue="0" green="0"/> | ||
| <x fieldname=""/> | ||
| <y fieldname=""/> | ||
| <offset x="0" y="0" units="pt" yfieldname="" xfieldname=""/> | ||
| <angle fieldname="" value="0" auto="0"/> | ||
| <alignment fieldname="" value="center"/> | ||
| <buffercolor fieldname="" red="255" blue="255" green="255"/> | ||
| <buffersize fieldname="" units="pt" value="1"/> | ||
| <bufferenabled fieldname="" on=""/> | ||
| <multilineenabled fieldname="" on=""/> | ||
| <selectedonly on=""/> | ||
| </labelattributes> | ||
| <edittypes> | ||
| <edittype type="0" name="colour"/> | ||
| <edittype type="0" name="pkuid"/> | ||
| </edittypes> | ||
| <editform>../projects</editform> | ||
| <editforminit></editforminit> | ||
| <annotationform>../projects</annotationform> | ||
| <attributeactions/> | ||
| </qgis> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,20 @@ | ||
| <PAMDataset> | ||
| <PAMRasterBand band="1"> | ||
| <Histograms> | ||
| <HistItem> | ||
| <HistMin>-18.929</HistMin> | ||
| <HistMax>3842.929</HistMax> | ||
| <BucketCount>1000</BucketCount> | ||
| <IncludeOutOfRange>0</IncludeOutOfRange> | ||
| <Approximate>1</Approximate> | ||
| <HistCounts>0|0|0|0|3|4|6|3|4|4|5|5|2|3|2|8|3|3|4|6|4|4|1|3|8|6|2|2|6|3|6|3|3|2|2|3|5|4|2|2|5|4|2|2|2|2|1|0|4|4|0|4|3|3|0|1|3|0|0|2|1|1|4|1|0|1|3|3|2|3|1|2|3|1|2|2|0|0|3|3|0|3|2|2|3|1|2|3|2|0|3|2|2|0|2|0|0|2|1|1|2|3|1|0|2|3|1|1|2|1|2|1|0|1|1|1|1|0|2|0|1|1|2|1|2|0|0|0|3|1|1|0|1|0|2|2|1|0|2|1|3|4|4|1|0|1|1|3|3|0|2|1|0|0|1|1|1|2|0|1|0|2|2|0|2|1|0|0|1|3|0|0|1|2|2|2|1|1|0|1|1|1|4|2|1|1|1|1|1|1|2|1|1|4|0|1|0|0|1|1|0|2|3|1|4|1|0|2|0|3|1|2|2|1|1|5|0|1|2|0|1|1|3|1|0|0|1|0|2|2|2|5|0|1|0|2|0|0|3|1|0|1|2|0|1|1|0|1|0|3|1|2|0|1|0|0|1|1|1|2|0|0|0|1|2|0|0|0|1|0|0|0|0|0|0|2|1|1|0|1|0|2|1|0|2|1|1|0|1|2|0|0|0|0|2|3|2|0|2|0|1|0|0|1|1|0|1|0|2|0|1|1|0|1|1|1|2|0|0|2|1|1|0|1|0|0|1|3|1|0|0|0|1|0|0|0|1|1|1|0|0|2|2|1|0|0|0|2|0|2|0|0|0|0|0|0|0|0|1|1|1|0|1|0|0|0|0|0|0|0|1|0|0|1|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|2|0|1|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|1|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0</HistCounts> | ||
| </HistItem> | ||
| </Histograms> | ||
| <Metadata> | ||
| <MDI key="STATISTICS_MAXIMUM">3841</MDI> | ||
| <MDI key="STATISTICS_MEAN">550.59810315778</MDI> | ||
| <MDI key="STATISTICS_MINIMUM">-17</MDI> | ||
| <MDI key="STATISTICS_STDDEV">506.70554545277</MDI> | ||
| </Metadata> | ||
| </PAMRasterBand> | ||
| </PAMDataset> |