Fixes #45872 : resolveReference after we load/create embedded group

This commit is contained in:
Julien Cabieces 2021-12-08 11:40:50 +01:00
parent 1d306402d5
commit 5db95e3a4d
7 changed files with 912 additions and 38 deletions

View File

@ -13607,52 +13607,61 @@ void QgisApp::addMapLayer( QgsMapLayer *mapLayer )
} }
} }
void QgisApp::embedLayers() void QgisApp::embedLayers()
{ {
//dialog to select groups/layers from other project files //dialog to select groups/layers from other project files
QgsProjectLayerGroupDialog d( this ); QgsProjectLayerGroupDialog d( this );
if ( d.exec() == QDialog::Accepted && d.isValid() ) if ( d.exec() == QDialog::Accepted && d.isValid() )
{ {
QgsCanvasRefreshBlocker refreshBlocker; addEmbeddedItems( d.selectedProjectFile(), d.selectedGroups(), d.selectedLayerIds() );
}
}
QString projectFile = d.selectedProjectFile(); void QgisApp::addEmbeddedItems( const QString &projectFile, const QStringList &groups, const QStringList &layerIds )
{
QgsCanvasRefreshBlocker refreshBlocker;
//groups //groups
QStringList groups = d.selectedGroups(); QStringList::const_iterator groupIt = groups.constBegin();
QStringList::const_iterator groupIt = groups.constBegin(); for ( ; groupIt != groups.constEnd(); ++groupIt )
for ( ; groupIt != groups.constEnd(); ++groupIt ) {
QgsLayerTreeGroup *newGroup = QgsProject::instance()->createEmbeddedGroup( *groupIt, projectFile, QStringList() );
if ( newGroup )
QgsProject::instance()->layerTreeRoot()->addChildNode( newGroup );
}
//layer ids
QList<QDomNode> brokenNodes;
// resolve dependencies
QgsLayerDefinition::DependencySorter depSorter( projectFile );
QStringList sortedIds = depSorter.sortedLayerIds();
const auto constSortedIds = sortedIds;
for ( const QString &id : constSortedIds )
{
const auto constLayerIds = layerIds;
for ( const QString &selId : constLayerIds )
{ {
QgsLayerTreeGroup *newGroup = QgsProject::instance()->createEmbeddedGroup( *groupIt, projectFile, QStringList() ); if ( selId == id )
QgsProject::instance()->createEmbeddedLayer( selId, projectFile, brokenNodes );
if ( newGroup )
QgsProject::instance()->layerTreeRoot()->addChildNode( newGroup );
} }
}
//layer ids // fix broken relations and dependencies
QList<QDomNode> brokenNodes; for ( const QString &id : constSortedIds )
{
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( QgsProject::instance()->mapLayer( id ) );
if ( vlayer )
vectorLayerStyleLoaded( vlayer, QgsMapLayer::AllStyleCategories );
}
// resolve dependencies // Resolve references to other layers
QgsLayerDefinition::DependencySorter depSorter( projectFile ); QMap<QString, QgsMapLayer *> layers = QgsProject::instance()->mapLayers();
QStringList sortedIds = depSorter.sortedLayerIds(); for ( QMap<QString, QgsMapLayer *>::iterator it = layers.begin(); it != layers.end(); ++it )
QStringList layerIds = d.selectedLayerIds(); {
const auto constSortedIds = sortedIds; it.value()->resolveReferences( QgsProject::instance() );
for ( const QString &id : constSortedIds )
{
const auto constLayerIds = layerIds;
for ( const QString &selId : constLayerIds )
{
if ( selId == id )
QgsProject::instance()->createEmbeddedLayer( selId, projectFile, brokenNodes );
}
}
// fix broken relations and dependencies
for ( const QString &id : constSortedIds )
{
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( QgsProject::instance()->mapLayer( id ) );
if ( vlayer )
vectorLayerStyleLoaded( vlayer, QgsMapLayer::AllStyleCategories );
}
} }
} }

View File

@ -1558,8 +1558,17 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
void showMeshCalculator(); void showMeshCalculator();
//! Open dialog to align raster layers //! Open dialog to align raster layers
void showAlignRasterTool(); void showAlignRasterTool();
/**
* Called whenever user wants to embed layers
*/
void embedLayers(); void embedLayers();
/**
* Embed \a groups and \a layerIds items from \a projectFile
*/
void addEmbeddedItems( const QString &projectFile, const QStringList &groups, const QStringList &layerIds );
//! Creates a new map canvas view //! Creates a new map canvas view
void newMapCanvas(); void newMapCanvas();
//! Creates a new 3D map canvas view //! Creates a new 3D map canvas view
@ -2733,6 +2742,7 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
friend class QgsCanvasRefreshBlocker; friend class QgsCanvasRefreshBlocker;
friend class TestQgisAppPython; friend class TestQgisAppPython;
friend class TestQgisApp;
friend class QgisAppInterface; friend class QgisAppInterface;
friend class QgsAppScreenShots; friend class QgsAppScreenShots;
}; };

View File

@ -1640,6 +1640,10 @@ bool QgsProject::readProjectFile( const QString &filename, QgsProject::ReadFlags
mMainAnnotationLayer->readLayerXml( doc->documentElement().firstChildElement( QStringLiteral( "main-annotation-layer" ) ), context ); mMainAnnotationLayer->readLayerXml( doc->documentElement().firstChildElement( QStringLiteral( "main-annotation-layer" ) ), context );
mMainAnnotationLayer->setTransformContext( mTransformContext ); mMainAnnotationLayer->setTransformContext( mTransformContext );
// load embedded groups and layers
profile.switchTask( tr( "Loading embedded layers" ) );
loadEmbeddedNodes( mRootGroup, flags );
// Resolve references to other layers // Resolve references to other layers
// Needs to be done here once all dependent layers are loaded // Needs to be done here once all dependent layers are loaded
profile.switchTask( tr( "Resolving layer references" ) ); profile.switchTask( tr( "Resolving layer references" ) );
@ -1651,10 +1655,6 @@ bool QgsProject::readProjectFile( const QString &filename, QgsProject::ReadFlags
mLayerTreeRegistryBridge->setEnabled( true ); mLayerTreeRegistryBridge->setEnabled( true );
// load embedded groups and layers
profile.switchTask( tr( "Loading embedded layers" ) );
loadEmbeddedNodes( mRootGroup, flags );
// now that layers are loaded, we can resolve layer tree's references to the layers // now that layers are loaded, we can resolve layer tree's references to the layers
profile.switchTask( tr( "Resolving references" ) ); profile.switchTask( tr( "Resolving references" ) );
mRootGroup->resolveReferences( this ); mRootGroup->resolveReferences( this );

View File

@ -42,6 +42,7 @@ class TestQgisApp : public QObject
void addVectorLayerGeopackageSingleLayer(); void addVectorLayerGeopackageSingleLayer();
void addVectorLayerGeopackageSingleLayerAlreadyLayername(); void addVectorLayerGeopackageSingleLayerAlreadyLayername();
void addVectorLayerInvalid(); void addVectorLayerInvalid();
void addEmbeddedGroup();
private: private:
QgisApp *mQgisApp = nullptr; QgisApp *mQgisApp = nullptr;
@ -137,5 +138,22 @@ void TestQgisApp::addVectorLayerInvalid()
QVERIFY( !layer ); QVERIFY( !layer );
} }
void TestQgisApp::addEmbeddedGroup()
{
const QString projectPath = QString( TEST_DATA_DIR ) + QStringLiteral( "/embedded_groups/joins1.qgs" );
QCOMPARE( QgsProject::instance()->layers<QgsVectorLayer *>().count(), 0 );
mQgisApp->addEmbeddedItems( projectPath, QStringList() << QStringLiteral( "GROUP" ), QStringList() );
QgsVectorLayer *vl = QgsProject::instance()->mapLayer<QgsVectorLayer *>( QStringLiteral( "polys_with_id_32002f94_eebe_40a5_a182_44198ba1bc5a" ) );
QCOMPARE( vl->fields().count(), 5 );
// cleanup
QgsProject::instance()->clear();
}
QGSTEST_MAIN( TestQgisApp ) QGSTEST_MAIN( TestQgisApp )
#include "testqgisapp.moc" #include "testqgisapp.moc"

View File

@ -59,6 +59,7 @@ class TestQgsProject : public QObject
void testAttachmentsQgs(); void testAttachmentsQgs();
void testAttachmentsQgz(); void testAttachmentsQgz();
void testAttachmentIdentifier(); void testAttachmentIdentifier();
void testEmbeddedGroupWithJoins();
}; };
void TestQgsProject::init() void TestQgsProject::init()
@ -906,5 +907,18 @@ void TestQgsProject::testAttachmentIdentifier()
} }
void TestQgsProject::testEmbeddedGroupWithJoins()
{
const QString projectPath = QString( TEST_DATA_DIR ) + QStringLiteral( "/embedded_groups/joins2.qgz" );
QgsProject p;
p.read( projectPath );
QCOMPARE( p.layers<QgsVectorLayer *>().count(), 2 );
QgsVectorLayer *vl = p.mapLayer<QgsVectorLayer *>( QStringLiteral( "polys_with_id_32002f94_eebe_40a5_a182_44198ba1bc5a" ) );
QCOMPARE( vl->fields().count(), 5 );
}
QGSTEST_MAIN( TestQgsProject ) QGSTEST_MAIN( TestQgsProject )
#include "testqgsproject.moc" #include "testqgsproject.moc"

View File

@ -0,0 +1,823 @@
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
<qgis projectname="" version="3.23.0-Master" saveUserFull="Julien Cabieces" saveDateTime="2021-12-08T09:10:24" saveUser="julien">
<homePath path=""/>
<title></title>
<autotransaction active="0"/>
<evaluateDefaultValues active="0"/>
<trust active="0"/>
<projectCrs>
<spatialrefsys>
<wkt>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["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]</wkt>
<proj4>+proj=longlat +datum=WGS84 +no_defs</proj4>
<srsid>3452</srsid>
<srid>4326</srid>
<authid>EPSG:4326</authid>
<description>WGS 84</description>
<projectionacronym>longlat</projectionacronym>
<ellipsoidacronym>EPSG:7030</ellipsoidacronym>
<geographicflag>true</geographicflag>
</spatialrefsys>
</projectCrs>
<layer-tree-group>
<customproperties>
<Option/>
</customproperties>
<layer-tree-group groupLayer="" expanded="1" name="GROUP" checked="Qt::Checked">
<customproperties>
<Option/>
</customproperties>
<layer-tree-layer source="../polys_with_id.shp" legend_exp="" patch_size="0,0" providerKey="ogr" expanded="1" name="polys_with_id" id="polys_with_id_32002f94_eebe_40a5_a182_44198ba1bc5a" checked="Qt::Checked" legend_split_behavior="0">
<customproperties>
<Option/>
</customproperties>
</layer-tree-layer>
<layer-tree-layer source="../polys_overlapping_with_id.shp" legend_exp="" patch_size="0,0" providerKey="ogr" expanded="1" name="polys_overlapping_with_id" id="polys_overlapping_with_id_3c22a7a0_06b3_4ff5_a2f8_332bafa241bd" checked="Qt::Checked" legend_split_behavior="0">
<customproperties>
<Option/>
</customproperties>
</layer-tree-layer>
</layer-tree-group>
<custom-order enabled="0">
<item>polys_with_id_32002f94_eebe_40a5_a182_44198ba1bc5a</item>
<item>polys_overlapping_with_id_3c22a7a0_06b3_4ff5_a2f8_332bafa241bd</item>
</custom-order>
</layer-tree-group>
<snapping-settings intersection-snapping="0" scaleDependencyMode="0" maxScale="0" enabled="0" tolerance="0" unit="2" self-snapping="0" type="1" minScale="0" mode="2">
<individual-layer-settings>
<layer-setting maxScale="0" enabled="1" tolerance="0" id="polys_overlapping_with_id_3c22a7a0_06b3_4ff5_a2f8_332bafa241bd" type="1" minScale="0" units="2"/>
<layer-setting maxScale="0" enabled="1" tolerance="0" id="polys_with_id_32002f94_eebe_40a5_a182_44198ba1bc5a" type="1" minScale="0" units="2"/>
</individual-layer-settings>
</snapping-settings>
<relations/>
<polymorphicRelations/>
<mapcanvas name="theMapCanvas" annotationsVisible="1">
<units>degrees</units>
<extent>
<xmin>-119.80118356386469713</xmin>
<ymin>23.95241214538275187</ymin>
<xmax>-82.91169073314071625</xmax>
<ymax>47.28163022407258609</ymax>
</extent>
<rotation>0</rotation>
<destinationsrs>
<spatialrefsys>
<wkt>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["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]</wkt>
<proj4>+proj=longlat +datum=WGS84 +no_defs</proj4>
<srsid>3452</srsid>
<srid>4326</srid>
<authid>EPSG:4326</authid>
<description>WGS 84</description>
<projectionacronym>longlat</projectionacronym>
<ellipsoidacronym>EPSG:7030</ellipsoidacronym>
<geographicflag>true</geographicflag>
</spatialrefsys>
</destinationsrs>
<rendermaptile>0</rendermaptile>
<expressionContextScope/>
</mapcanvas>
<projectModels/>
<legend updateDrawingOrder="true">
<legendgroup open="true" name="GROUP" checked="Qt::Checked">
<legendlayer showFeatureCount="0" drawingOrder="-1" open="true" name="polys_with_id" checked="Qt::Checked">
<filegroup open="true" hidden="false">
<legendlayerfile visible="1" isInOverview="0" layerid="polys_with_id_32002f94_eebe_40a5_a182_44198ba1bc5a"/>
</filegroup>
</legendlayer>
<legendlayer showFeatureCount="0" drawingOrder="-1" open="true" name="polys_overlapping_with_id" checked="Qt::Checked">
<filegroup open="true" hidden="false">
<legendlayerfile visible="1" isInOverview="0" layerid="polys_overlapping_with_id_3c22a7a0_06b3_4ff5_a2f8_332bafa241bd"/>
</filegroup>
</legendlayer>
</legendgroup>
</legend>
<mapViewDocks/>
<main-annotation-layer autoRefreshEnabled="0" autoRefreshTime="0" type="annotation" legendPlaceholderImage="" refreshOnNotifyEnabled="0" refreshOnNotifyMessage="">
<id>Annotations_d365fe16_031e_4beb_8157_5b1a54d7f109</id>
<datasource></datasource>
<keywordList>
<value></value>
</keywordList>
<layername></layername>
<srs>
<spatialrefsys>
<wkt></wkt>
<proj4></proj4>
<srsid>0</srsid>
<srid>0</srid>
<authid></authid>
<description></description>
<projectionacronym></projectionacronym>
<ellipsoidacronym></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>
<wkt></wkt>
<proj4></proj4>
<srsid>0</srsid>
<srid>0</srid>
<authid></authid>
<description></description>
<projectionacronym></projectionacronym>
<ellipsoidacronym></ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</crs>
<extent/>
</resourceMetadata>
<items/>
<layerOpacity>1</layerOpacity>
<blendMode>0</blendMode>
<paintEffect/>
</main-annotation-layer>
<projectlayers>
<maplayer refreshOnNotifyMessage="" simplifyLocal="1" type="vector" refreshOnNotifyEnabled="0" simplifyMaxScale="1" symbologyReferenceScale="-1" styleCategories="AllStyleCategories" labelsEnabled="1" wkbType="MultiPolygon" simplifyDrawingHints="1" legendPlaceholderImage="" simplifyDrawingTol="1" geometry="Polygon" simplifyAlgorithm="0" maxScale="0" autoRefreshEnabled="0" hasScaleBasedVisibilityFlag="0" readOnly="0" autoRefreshTime="0" minScale="100000000">
<extent>
<xmin>-118.92286230599032137</xmin>
<ymin>24.50786971868489061</ymin>
<xmax>-83.79001199101509201</xmax>
<ymax>46.72617265077044379</ymax>
</extent>
<wgs84extent>
<xmin>-118.92286230599032137</xmin>
<ymin>24.50786971868489061</ymin>
<xmax>-83.79001199101509201</xmax>
<ymax>46.72617265077044379</ymax>
</wgs84extent>
<id>polys_overlapping_with_id_3c22a7a0_06b3_4ff5_a2f8_332bafa241bd</id>
<datasource>../polys_overlapping_with_id.shp</datasource>
<keywordList>
<value></value>
</keywordList>
<layername>polys_overlapping_with_id</layername>
<srs>
<spatialrefsys>
<wkt>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["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]</wkt>
<proj4>+proj=longlat +datum=WGS84 +no_defs</proj4>
<srsid>3452</srsid>
<srid>4326</srid>
<authid>EPSG:4326</authid>
<description>WGS 84</description>
<projectionacronym>longlat</projectionacronym>
<ellipsoidacronym>EPSG:7030</ellipsoidacronym>
<geographicflag>true</geographicflag>
</spatialrefsys>
</srs>
<resourceMetadata>
<identifier></identifier>
<parentidentifier></parentidentifier>
<language></language>
<type>dataset</type>
<title></title>
<abstract></abstract>
<links/>
<fees></fees>
<encoding></encoding>
<crs>
<spatialrefsys>
<wkt></wkt>
<proj4></proj4>
<srsid>0</srsid>
<srid>0</srid>
<authid></authid>
<description></description>
<projectionacronym></projectionacronym>
<ellipsoidacronym></ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</crs>
<extent/>
</resourceMetadata>
<provider encoding="UTF-8">ogr</provider>
<vectorjoins/>
<layerDependencies/>
<dataDependencies/>
<expressionfields/>
<map-layer-style-manager current="défaut">
<map-layer-style name="défaut"/>
</map-layer-style-manager>
<auxiliaryLayer/>
<metadataUrls/>
<flags>
<Identifiable>1</Identifiable>
<Removable>1</Removable>
<Searchable>1</Searchable>
<Private>0</Private>
</flags>
<temporal startExpression="" endExpression="" fixedDuration="0" enabled="0" limitMode="0" durationUnit="min" startField="" accumulate="0" endField="" durationField="" mode="0">
<fixedRange>
<start></start>
<end></end>
</fixedRange>
</temporal>
<renderer-v2 referencescale="-1" enableorderby="0" symbollevels="0" forceraster="0" type="singleSymbol">
<symbols>
<symbol force_rhr="0" clip_to_extent="1" name="0" type="fill" alpha="1">
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
<layer locked="0" enabled="1" class="SimpleFill" pass="0">
<Option type="Map">
<Option value="3x:0,0,0,0,0,0" name="border_width_map_unit_scale" type="QString"/>
<Option value="190,178,151,255" name="color" type="QString"/>
<Option value="bevel" name="joinstyle" type="QString"/>
<Option value="0,0" name="offset" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="offset_map_unit_scale" type="QString"/>
<Option value="MM" name="offset_unit" type="QString"/>
<Option value="35,35,35,255" name="outline_color" type="QString"/>
<Option value="solid" name="outline_style" type="QString"/>
<Option value="0.26" name="outline_width" type="QString"/>
<Option value="MM" name="outline_width_unit" type="QString"/>
<Option value="solid" name="style" type="QString"/>
</Option>
<prop k="border_width_map_unit_scale" v="3x:0,0,0,0,0,0"/>
<prop k="color" v="190,178,151,255"/>
<prop k="joinstyle" v="bevel"/>
<prop k="offset" v="0,0"/>
<prop k="offset_map_unit_scale" v="3x:0,0,0,0,0,0"/>
<prop k="offset_unit" v="MM"/>
<prop k="outline_color" v="35,35,35,255"/>
<prop k="outline_style" v="solid"/>
<prop k="outline_width" v="0.26"/>
<prop k="outline_width_unit" v="MM"/>
<prop k="style" v="solid"/>
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
</layer>
</symbol>
</symbols>
<rotation/>
<sizescale/>
</renderer-v2>
<customproperties>
<Option/>
</customproperties>
<blendMode>0</blendMode>
<featureBlendMode>0</featureBlendMode>
<layerOpacity>1</layerOpacity>
<geometryOptions removeDuplicateNodes="0" geometryPrecision="0">
<activeChecks/>
<checkConfiguration/>
</geometryOptions>
<legend showLabelLegend="0" type="default-vector"/>
<referencedLayers/>
<fieldConfiguration>
<field configurationFlags="None" name="Name">
<editWidget type="">
<config>
<Option/>
</config>
</editWidget>
</field>
<field configurationFlags="None" name="Value">
<editWidget type="">
<config>
<Option/>
</config>
</editWidget>
</field>
<field configurationFlags="None" name="id">
<editWidget type="">
<config>
<Option/>
</config>
</editWidget>
</field>
</fieldConfiguration>
<aliases>
<alias field="Name" index="0" name=""/>
<alias field="Value" index="1" name=""/>
<alias field="id" index="2" name=""/>
</aliases>
<defaults>
<default field="Name" expression="" applyOnUpdate="0"/>
<default field="Value" expression="" applyOnUpdate="0"/>
<default field="id" expression="" applyOnUpdate="0"/>
</defaults>
<constraints>
<constraint field="Name" notnull_strength="0" unique_strength="0" constraints="0" exp_strength="0"/>
<constraint field="Value" notnull_strength="0" unique_strength="0" constraints="0" exp_strength="0"/>
<constraint field="id" notnull_strength="0" unique_strength="0" constraints="0" exp_strength="0"/>
</constraints>
<constraintExpressions>
<constraint field="Name" desc="" exp=""/>
<constraint field="Value" desc="" exp=""/>
<constraint field="id" desc="" exp=""/>
</constraintExpressions>
<expressionfields/>
<attributeactions>
<defaultAction key="Canvas" value="{00000000-0000-0000-0000-000000000000}"/>
</attributeactions>
<attributetableconfig sortOrder="0" sortExpression="" actionWidgetStyle="dropDown">
<columns>
<column width="-1" hidden="0" name="Name" type="field"/>
<column width="271" hidden="0" name="Value" type="field"/>
<column width="-1" hidden="0" name="id" type="field"/>
<column width="-1" hidden="1" type="actions"/>
</columns>
</attributetableconfig>
<conditionalstyles>
<rowstyles/>
<fieldstyles/>
</conditionalstyles>
<storedexpressions/>
<editform tolerant="1"></editform>
<editforminit/>
<editforminitcodesource>0</editforminitcodesource>
<editforminitfilepath></editforminitfilepath>
<editforminitcode><![CDATA[]]></editforminitcode>
<featformsuppress>0</featformsuppress>
<editorlayout>generatedlayout</editorlayout>
<editable/>
<labelOnTop/>
<reuseLastValue/>
<dataDefinedFieldProperties/>
<widgets/>
<previewExpression>"Name"</previewExpression>
<mapTip></mapTip>
</maplayer>
<maplayer refreshOnNotifyMessage="" simplifyLocal="1" type="vector" refreshOnNotifyEnabled="0" simplifyMaxScale="1" symbologyReferenceScale="-1" styleCategories="AllStyleCategories" labelsEnabled="1" wkbType="MultiPolygon" simplifyDrawingHints="1" legendPlaceholderImage="" simplifyDrawingTol="1" geometry="Polygon" simplifyAlgorithm="0" maxScale="0" autoRefreshEnabled="0" hasScaleBasedVisibilityFlag="0" readOnly="0" autoRefreshTime="0" minScale="100000000">
<extent>
<xmin>-118.92286230599032137</xmin>
<ymin>24.50786971868489061</ymin>
<xmax>-83.79001199101509201</xmax>
<ymax>46.72617265077044379</ymax>
</extent>
<wgs84extent>
<xmin>-118.92286230599032137</xmin>
<ymin>24.50786971868489061</ymin>
<xmax>-83.79001199101509201</xmax>
<ymax>46.72617265077044379</ymax>
</wgs84extent>
<id>polys_with_id_32002f94_eebe_40a5_a182_44198ba1bc5a</id>
<datasource>../polys_with_id.shp</datasource>
<keywordList>
<value></value>
</keywordList>
<layername>polys_with_id</layername>
<srs>
<spatialrefsys>
<wkt>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["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]</wkt>
<proj4>+proj=longlat +datum=WGS84 +no_defs</proj4>
<srsid>3452</srsid>
<srid>4326</srid>
<authid>EPSG:4326</authid>
<description>WGS 84</description>
<projectionacronym>longlat</projectionacronym>
<ellipsoidacronym>EPSG:7030</ellipsoidacronym>
<geographicflag>true</geographicflag>
</spatialrefsys>
</srs>
<resourceMetadata>
<identifier></identifier>
<parentidentifier></parentidentifier>
<language></language>
<type>dataset</type>
<title></title>
<abstract></abstract>
<links/>
<fees></fees>
<encoding></encoding>
<crs>
<spatialrefsys>
<wkt></wkt>
<proj4></proj4>
<srsid>0</srsid>
<srid>0</srid>
<authid></authid>
<description></description>
<projectionacronym></projectionacronym>
<ellipsoidacronym></ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</crs>
<extent/>
</resourceMetadata>
<provider encoding="UTF-8">ogr</provider>
<vectorjoins>
<join joinLayerId="polys_overlapping_with_id_3c22a7a0_06b3_4ff5_a2f8_332bafa241bd" joinFieldName="id" cascadedDelete="0" dynamicForm="0" memoryCache="1" targetFieldName="id" editable="0" upsertOnEdit="0"/>
</vectorjoins>
<layerDependencies/>
<dataDependencies/>
<expressionfields/>
<map-layer-style-manager current="défaut">
<map-layer-style name="défaut"/>
</map-layer-style-manager>
<auxiliaryLayer/>
<metadataUrls/>
<flags>
<Identifiable>1</Identifiable>
<Removable>1</Removable>
<Searchable>1</Searchable>
<Private>0</Private>
</flags>
<temporal startExpression="" endExpression="" fixedDuration="0" enabled="0" limitMode="0" durationUnit="min" startField="" accumulate="0" endField="" durationField="" mode="0">
<fixedRange>
<start></start>
<end></end>
</fixedRange>
</temporal>
<renderer-v2 referencescale="-1" enableorderby="0" symbollevels="0" forceraster="0" type="singleSymbol">
<symbols>
<symbol force_rhr="0" clip_to_extent="1" name="0" type="fill" alpha="1">
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
<layer locked="0" enabled="1" class="SimpleFill" pass="0">
<Option type="Map">
<Option value="3x:0,0,0,0,0,0" name="border_width_map_unit_scale" type="QString"/>
<Option value="196,60,57,255" name="color" type="QString"/>
<Option value="bevel" name="joinstyle" type="QString"/>
<Option value="0,0" name="offset" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="offset_map_unit_scale" type="QString"/>
<Option value="MM" name="offset_unit" type="QString"/>
<Option value="35,35,35,255" name="outline_color" type="QString"/>
<Option value="solid" name="outline_style" type="QString"/>
<Option value="0.26" name="outline_width" type="QString"/>
<Option value="MM" name="outline_width_unit" type="QString"/>
<Option value="solid" name="style" type="QString"/>
</Option>
<prop k="border_width_map_unit_scale" v="3x:0,0,0,0,0,0"/>
<prop k="color" v="196,60,57,255"/>
<prop k="joinstyle" v="bevel"/>
<prop k="offset" v="0,0"/>
<prop k="offset_map_unit_scale" v="3x:0,0,0,0,0,0"/>
<prop k="offset_unit" v="MM"/>
<prop k="outline_color" v="35,35,35,255"/>
<prop k="outline_style" v="solid"/>
<prop k="outline_width" v="0.26"/>
<prop k="outline_width_unit" v="MM"/>
<prop k="style" v="solid"/>
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
</layer>
</symbol>
</symbols>
<rotation/>
<sizescale/>
</renderer-v2>
<customproperties>
<Option type="Map">
<Option name="dualview/previewExpressions" type="List">
<Option value="Name" type="QString"/>
</Option>
<Option value="0" name="embeddedWidgets/count" type="QString"/>
<Option name="variableNames"/>
<Option name="variableValues"/>
</Option>
</customproperties>
<blendMode>0</blendMode>
<featureBlendMode>0</featureBlendMode>
<layerOpacity>1</layerOpacity>
<SingleCategoryDiagramRenderer diagramType="Histogram" attributeLegend="1">
<DiagramCategory height="15" spacingUnit="MM" minScaleDenominator="0" showAxis="0" enabled="0" scaleDependency="Area" labelPlacementMethod="XHeight" sizeScale="3x:0,0,0,0,0,0" sizeType="MM" minimumSize="0" penWidth="0" width="15" penAlpha="255" penColor="#000000" backgroundColor="#ffffff" direction="1" scaleBasedVisibility="0" lineSizeType="MM" opacity="1" rotationOffset="270" backgroundAlpha="255" spacing="0" lineSizeScale="3x:0,0,0,0,0,0" barWidth="5" maxScaleDenominator="1e+08" diagramOrientation="Up" spacingUnitScale="3x:0,0,0,0,0,0">
<fontProperties description="Sans Serif,9,-1,5,50,0,0,0,0,0" style=""/>
<attribute field="" label="" color="#000000"/>
<axisSymbol>
<symbol force_rhr="0" clip_to_extent="1" name="" type="line" alpha="1">
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
<layer locked="0" enabled="1" class="SimpleLine" pass="0">
<Option type="Map">
<Option value="0" name="align_dash_pattern" type="QString"/>
<Option value="square" name="capstyle" type="QString"/>
<Option value="5;2" name="customdash" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="customdash_map_unit_scale" type="QString"/>
<Option value="MM" name="customdash_unit" type="QString"/>
<Option value="0" name="dash_pattern_offset" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="dash_pattern_offset_map_unit_scale" type="QString"/>
<Option value="MM" name="dash_pattern_offset_unit" type="QString"/>
<Option value="0" name="draw_inside_polygon" type="QString"/>
<Option value="bevel" name="joinstyle" type="QString"/>
<Option value="35,35,35,255" name="line_color" type="QString"/>
<Option value="solid" name="line_style" type="QString"/>
<Option value="0.26" name="line_width" type="QString"/>
<Option value="MM" name="line_width_unit" type="QString"/>
<Option value="0" name="offset" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="offset_map_unit_scale" type="QString"/>
<Option value="MM" name="offset_unit" type="QString"/>
<Option value="0" name="ring_filter" type="QString"/>
<Option value="0" name="trim_distance_end" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="trim_distance_end_map_unit_scale" type="QString"/>
<Option value="MM" name="trim_distance_end_unit" type="QString"/>
<Option value="0" name="trim_distance_start" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="trim_distance_start_map_unit_scale" type="QString"/>
<Option value="MM" name="trim_distance_start_unit" type="QString"/>
<Option value="0" name="tweak_dash_pattern_on_corners" type="QString"/>
<Option value="0" name="use_custom_dash" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="width_map_unit_scale" type="QString"/>
</Option>
<prop k="align_dash_pattern" v="0"/>
<prop k="capstyle" v="square"/>
<prop k="customdash" v="5;2"/>
<prop k="customdash_map_unit_scale" v="3x:0,0,0,0,0,0"/>
<prop k="customdash_unit" v="MM"/>
<prop k="dash_pattern_offset" v="0"/>
<prop k="dash_pattern_offset_map_unit_scale" v="3x:0,0,0,0,0,0"/>
<prop k="dash_pattern_offset_unit" v="MM"/>
<prop k="draw_inside_polygon" v="0"/>
<prop k="joinstyle" v="bevel"/>
<prop k="line_color" v="35,35,35,255"/>
<prop k="line_style" v="solid"/>
<prop k="line_width" v="0.26"/>
<prop k="line_width_unit" v="MM"/>
<prop k="offset" v="0"/>
<prop k="offset_map_unit_scale" v="3x:0,0,0,0,0,0"/>
<prop k="offset_unit" v="MM"/>
<prop k="ring_filter" v="0"/>
<prop k="trim_distance_end" v="0"/>
<prop k="trim_distance_end_map_unit_scale" v="3x:0,0,0,0,0,0"/>
<prop k="trim_distance_end_unit" v="MM"/>
<prop k="trim_distance_start" v="0"/>
<prop k="trim_distance_start_map_unit_scale" v="3x:0,0,0,0,0,0"/>
<prop k="trim_distance_start_unit" v="MM"/>
<prop k="tweak_dash_pattern_on_corners" v="0"/>
<prop k="use_custom_dash" v="0"/>
<prop k="width_map_unit_scale" v="3x:0,0,0,0,0,0"/>
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
</layer>
</symbol>
</axisSymbol>
</DiagramCategory>
</SingleCategoryDiagramRenderer>
<DiagramLayerSettings dist="0" showAll="1" zIndex="0" placement="0" linePlacementFlags="18" obstacle="0" priority="0">
<properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</properties>
</DiagramLayerSettings>
<geometryOptions removeDuplicateNodes="0" geometryPrecision="0">
<activeChecks/>
<checkConfiguration/>
</geometryOptions>
<legend showLabelLegend="0" type="default-vector"/>
<referencedLayers/>
<fieldConfiguration>
<field configurationFlags="None" name="Name">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field configurationFlags="None" name="Value">
<editWidget type="Range">
<config>
<Option/>
</config>
</editWidget>
</field>
<field configurationFlags="None" name="id">
<editWidget type="Range">
<config>
<Option/>
</config>
</editWidget>
</field>
<field configurationFlags="None" name="polys_overlapping_with_id_Name">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field configurationFlags="None" name="polys_overlapping_with_id_Value">
<editWidget type="Range">
<config>
<Option/>
</config>
</editWidget>
</field>
</fieldConfiguration>
<aliases>
<alias field="Name" index="0" name=""/>
<alias field="Value" index="1" name=""/>
<alias field="id" index="2" name=""/>
<alias field="polys_overlapping_with_id_Name" index="3" name=""/>
<alias field="polys_overlapping_with_id_Value" index="4" name=""/>
</aliases>
<defaults>
<default field="Name" expression="" applyOnUpdate="0"/>
<default field="Value" expression="" applyOnUpdate="0"/>
<default field="id" expression="" applyOnUpdate="0"/>
<default field="polys_overlapping_with_id_Name" expression="" applyOnUpdate="0"/>
<default field="polys_overlapping_with_id_Value" expression="" applyOnUpdate="0"/>
</defaults>
<constraints>
<constraint field="Name" notnull_strength="0" unique_strength="0" constraints="0" exp_strength="0"/>
<constraint field="Value" notnull_strength="0" unique_strength="0" constraints="0" exp_strength="0"/>
<constraint field="id" notnull_strength="0" unique_strength="0" constraints="0" exp_strength="0"/>
<constraint field="polys_overlapping_with_id_Name" notnull_strength="0" unique_strength="0" constraints="0" exp_strength="0"/>
<constraint field="polys_overlapping_with_id_Value" notnull_strength="0" unique_strength="0" constraints="0" exp_strength="0"/>
</constraints>
<constraintExpressions>
<constraint field="Name" desc="" exp=""/>
<constraint field="Value" desc="" exp=""/>
<constraint field="id" desc="" exp=""/>
<constraint field="polys_overlapping_with_id_Name" desc="" exp=""/>
<constraint field="polys_overlapping_with_id_Value" desc="" exp=""/>
</constraintExpressions>
<expressionfields/>
<attributeactions>
<defaultAction key="Canvas" value="{00000000-0000-0000-0000-000000000000}"/>
</attributeactions>
<attributetableconfig sortOrder="0" sortExpression="" actionWidgetStyle="dropDown">
<columns>
<column width="-1" hidden="0" name="Name" type="field"/>
<column width="-1" hidden="0" name="Value" type="field"/>
<column width="-1" hidden="0" name="id" type="field"/>
<column width="-1" hidden="1" type="actions"/>
<column width="-1" hidden="0" name="polys_overlapping_with_id_Name" type="field"/>
<column width="329" hidden="0" name="polys_overlapping_with_id_Value" type="field"/>
</columns>
</attributetableconfig>
<conditionalstyles>
<rowstyles/>
<fieldstyles/>
</conditionalstyles>
<storedexpressions/>
<editform tolerant="1"></editform>
<editforminit/>
<editforminitcodesource>0</editforminitcodesource>
<editforminitfilepath></editforminitfilepath>
<editforminitcode><![CDATA[# -*- coding: utf-8 -*-
"""
QGIS forms can have a Python function that is called when the form is
opened.
Use this function to add extra logic to your forms.
Enter the name of the function in the "Python Init function"
field.
An example follows:
"""
from qgis.PyQt.QtWidgets import QWidget
def my_form_open(dialog, layer, feature):
geom = feature.geometry()
control = dialog.findChild(QWidget, "MyLineEdit")
]]></editforminitcode>
<featformsuppress>0</featformsuppress>
<editorlayout>generatedlayout</editorlayout>
<editable/>
<labelOnTop/>
<reuseLastValue/>
<dataDefinedFieldProperties/>
<widgets/>
<previewExpression>Name</previewExpression>
<mapTip></mapTip>
</maplayer>
</projectlayers>
<layerorder>
<layer id="polys_with_id_32002f94_eebe_40a5_a182_44198ba1bc5a"/>
<layer id="polys_overlapping_with_id_3c22a7a0_06b3_4ff5_a2f8_332bafa241bd"/>
</layerorder>
<properties>
<Digitizing>
<AvoidIntersectionsMode type="int">2</AvoidIntersectionsMode>
</Digitizing>
<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>
<Measurement>
<AreaUnits type="QString"></AreaUnits>
<DistanceUnits type="QString"></DistanceUnits>
</Measurement>
<PAL>
<CandidatesLine type="int">50</CandidatesLine>
<CandidatesLinePerCM type="double">5</CandidatesLinePerCM>
<CandidatesPoint type="int">16</CandidatesPoint>
<CandidatesPolygon type="int">30</CandidatesPolygon>
<CandidatesPolygonPerCM type="double">2.5</CandidatesPolygonPerCM>
<DrawOutlineLabels type="bool">true</DrawOutlineLabels>
<DrawRectOnly type="bool">false</DrawRectOnly>
<DrawUnplaced type="bool">false</DrawUnplaced>
<PlacementEngineVersion type="int">0</PlacementEngineVersion>
<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>
<UnplacedColor type="QString">255,0,0,255</UnplacedColor>
</PAL>
<Paths>
<Absolute type="bool">false</Absolute>
</Paths>
<PositionPrecision>
<Automatic type="bool">true</Automatic>
<DecimalPlaces type="int">2</DecimalPlaces>
</PositionPrecision>
<SpatialRefSys>
<ProjectCRSID type="int">3452</ProjectCRSID>
<ProjectCRSProj4String type="QString">+proj=longlat +datum=WGS84 +no_defs</ProjectCRSProj4String>
<ProjectCrs type="QString">EPSG:4326</ProjectCrs>
<ProjectionsEnabled type="int">1</ProjectionsEnabled>
</SpatialRefSys>
</properties>
<dataDefinedServerProperties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</dataDefinedServerProperties>
<visibility-presets/>
<transformContext/>
<projectMetadata>
<identifier></identifier>
<parentidentifier></parentidentifier>
<language></language>
<type></type>
<title></title>
<abstract></abstract>
<links/>
<author></author>
<creation></creation>
</projectMetadata>
<Annotations/>
<Layouts/>
<Bookmarks/>
<ProjectViewSettings UseProjectScales="0">
<Scales/>
<DefaultViewExtent xmin="-123.51279691427851049" ymin="23.95241214538275187" xmax="-79.2000773827269029" ymax="47.28163022407258609">
<spatialrefsys>
<wkt>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["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]</wkt>
<proj4>+proj=longlat +datum=WGS84 +no_defs</proj4>
<srsid>3452</srsid>
<srid>4326</srid>
<authid>EPSG:4326</authid>
<description>WGS 84</description>
<projectionacronym>longlat</projectionacronym>
<ellipsoidacronym>EPSG:7030</ellipsoidacronym>
<geographicflag>true</geographicflag>
</spatialrefsys>
</DefaultViewExtent>
</ProjectViewSettings>
<ProjectTimeSettings cumulativeTemporalRange="0" timeStep="1" timeStepUnit="h" frameRate="1"/>
<ProjectDisplaySettings>
<BearingFormat id="bearing">
<Option type="Map">
<Option value="" name="decimal_separator" type="QChar"/>
<Option value="6" name="decimals" type="int"/>
<Option value="0" name="direction_format" type="int"/>
<Option value="0" name="rounding_type" type="int"/>
<Option value="false" name="show_plus" type="bool"/>
<Option value="true" name="show_thousand_separator" type="bool"/>
<Option value="false" name="show_trailing_zeros" type="bool"/>
<Option value="" name="thousand_separator" type="QChar"/>
</Option>
</BearingFormat>
</ProjectDisplaySettings>
</qgis>

Binary file not shown.