Skip to content

Commit 59d8b18

Browse files
committedJul 25, 2017
Porting Raymond Nijssen FOSS4G 2016 labeling work onto latest version of master, with basic support for testing. fixes #8925
1 parent 1b9c5be commit 59d8b18

File tree

5 files changed

+424
-10
lines changed

5 files changed

+424
-10
lines changed
 

‎src/core/qgsvectorlayer.cpp

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2205,20 +2205,34 @@ bool QgsVectorLayer::writeSld( QDomNode &node, QDomDocument &doc, QString &error
22052205
{
22062206
Q_UNUSED( errorMessage );
22072207

2208-
// store the Name element
2209-
QDomElement nameNode = doc.createElement( QStringLiteral( "se:Name" ) );
2210-
nameNode.appendChild( doc.createTextNode( name() ) );
2211-
node.appendChild( nameNode );
2212-
22132208
QgsStringMap localProps = QgsStringMap( props );
22142209
if ( hasScaleBasedVisibility() )
22152210
{
22162211
QgsSymbolLayerUtils::mergeScaleDependencies( maximumScale(), minimumScale(), localProps );
22172212
}
22182213

2219-
if ( isSpatial() )
2220-
{
2221-
node.appendChild( mRenderer->writeSld( doc, name(), localProps ) );
2214+
if ( isSpatial() ) {
2215+
// store the Name element
2216+
QDomElement nameNode = doc.createElement( "se:Name" );
2217+
nameNode.appendChild( doc.createTextNode( name() ) );
2218+
node.appendChild( nameNode );
2219+
2220+
QDomElement userStyleElem = doc.createElement( "UserStyle" );
2221+
node.appendChild( userStyleElem );
2222+
2223+
QDomElement nameElem = doc.createElement( "se:Name" );
2224+
nameElem.appendChild( doc.createTextNode( name() ) );
2225+
2226+
userStyleElem.appendChild( nameElem );
2227+
2228+
QDomElement featureTypeStyleElem = doc.createElement( "se:FeatureTypeStyle" );
2229+
userStyleElem.appendChild( featureTypeStyleElem );
2230+
2231+
mRenderer->toSld( doc, featureTypeStyleElem, localProps );
2232+
if ( mLabeling != nullptr )
2233+
{
2234+
mLabeling->toSld( featureTypeStyleElem, localProps );
2235+
}
22222236
}
22232237
return true;
22242238
}

‎src/core/qgsvectorlayerlabeling.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
#include "qgspallabeling.h"
1818
#include "qgsrulebasedlabeling.h"
1919
#include "qgsvectorlayer.h"
20+
#include "qgssymbollayerutils.h"
21+
#include "qgis.h"
2022

2123

2224
QgsAbstractVectorLayerLabeling *QgsAbstractVectorLayerLabeling::create( const QDomElement &element, const QgsReadWriteContext &context )
@@ -88,3 +90,50 @@ QgsVectorLayerSimpleLabeling *QgsVectorLayerSimpleLabeling::create( const QDomEl
8890

8991
return new QgsVectorLayerSimpleLabeling( QgsPalLayerSettings() );
9092
}
93+
94+
void QgsVectorLayerSimpleLabeling::toSld( QDomNode &parent, const QgsStringMap &props ) const
95+
{
96+
97+
if ( mSettings->drawLabels )
98+
{
99+
QDomDocument doc = parent.ownerDocument();
100+
101+
QDomElement ruleElement = doc.createElement( QStringLiteral( "se:Rule" ) );
102+
parent.appendChild( ruleElement );
103+
104+
QDomElement textSymbolizerElement = doc.createElement( QStringLiteral( "se:TextSymbolizer" ) );
105+
ruleElement.appendChild( textSymbolizerElement );
106+
107+
// label
108+
QDomElement labelElement = doc.createElement( QStringLiteral( "se:Label" ) );
109+
textSymbolizerElement.appendChild( labelElement );
110+
111+
if ( mSettings->isExpression )
112+
{
113+
labelElement.appendChild( doc.createComment( QStringLiteral( "SE Export for %1 not implemented yet" ).arg( mSettings->getLabelExpression()->dump() ) ) );
114+
labelElement.appendChild( doc.createTextNode( "Placeholder" ) );
115+
}
116+
else
117+
{
118+
QDomElement propertyNameElement = doc.createElement( QStringLiteral( "ogc:PropertyName" ) );
119+
propertyNameElement.appendChild( doc.createTextNode( mSettings->fieldName ) );
120+
labelElement.appendChild( propertyNameElement );
121+
}
122+
123+
// font
124+
QDomElement fontElement = doc.createElement( QStringLiteral( "se:Font" ) );
125+
textSymbolizerElement.appendChild( fontElement );
126+
QgsTextFormat format = mSettings->format();
127+
fontElement.appendChild( QgsSymbolLayerUtils::createSvgParameterElement( doc, QStringLiteral( "font-family" ), format.font().family() ) );
128+
double fontSize = QgsSymbolLayerUtils::rescaleUom( format.size(), format.sizeUnit(), props );
129+
fontElement.appendChild( QgsSymbolLayerUtils::createSvgParameterElement( doc, QStringLiteral( "font-size" ), QString::number( fontSize ) ) );
130+
131+
132+
// fill
133+
QDomElement fillElement = doc.createElement( QStringLiteral( "se:Fill" ) );
134+
textSymbolizerElement.appendChild( fillElement );
135+
fillElement.appendChild( QgsSymbolLayerUtils::createSvgParameterElement( doc, QStringLiteral( "fill" ), format.color().name() ) );
136+
}
137+
138+
139+
}

‎src/core/qgsvectorlayerlabeling.h

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@
1919

2020
#include <QString>
2121
#include <QStringList>
22+
#include <QDomNode>
2223

23-
#include "qgis_core.h"
24-
#include "qgis_sip.h"
24+
#include "qgis.h"
2525

2626
class QDomDocument;
2727
class QDomElement;
@@ -76,6 +76,17 @@ class CORE_EXPORT QgsAbstractVectorLayerLabeling
7676
//! Try to create instance of an implementation based on the XML data
7777
static QgsAbstractVectorLayerLabeling *create( const QDomElement &element, const QgsReadWriteContext &context ) SIP_FACTORY;
7878

79+
/**
80+
* Writes the SE 1.1 TextSymbolizer element based on the current layer labelling settings
81+
*/
82+
virtual void toSld( QDomNode& parent, const QgsStringMap& props ) const
83+
{
84+
Q_UNUSED( parent )
85+
Q_UNUSED( props )
86+
QDomDocument doc = parent.ownerDocument();
87+
parent.appendChild( doc.createComment( QStringLiteral( "SE Export for %1 not implemented yet" ).arg( type() ) ) );
88+
}
89+
7990
private:
8091
Q_DISABLE_COPY( QgsAbstractVectorLayerLabeling )
8192

@@ -105,6 +116,7 @@ class CORE_EXPORT QgsVectorLayerSimpleLabeling : public QgsAbstractVectorLayerLa
105116
virtual QDomElement save( QDomDocument &doc, const QgsReadWriteContext &context ) const override;
106117
virtual QgsPalLayerSettings settings( const QString &providerId = QString() ) const override;
107118
bool requiresAdvancedEffects() const override;
119+
virtual void toSld( QDomNode& parent, const QgsStringMap& props ) const override;
108120

109121
//! Create the instance from a DOM element with saved configuration
110122
static QgsVectorLayerSimpleLabeling *create( const QDomElement &element, const QgsReadWriteContext &context );

‎tests/src/python/test_qgssymbollayer_createsld.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,60 @@ def assertRuleRangeFilter(self, root, index, attributeName, min, includeMin, max
546546
ltValue = lt.childNodes().item(1)
547547
self.assertEquals(max, ltValue.toElement().text())
548548

549+
def testSimpleLabelling(self):
550+
layer = QgsVectorLayer("Point", "addfeat", "memory")
551+
self.loadStyleWithCustomProperties(layer, "simpleLabel")
552+
553+
dom, root = self.layerToSld(layer)
554+
# print("Simple label text symbolizer" + dom.toString())
555+
556+
ts = self.getTextSymbolizer(root, 1, 0)
557+
self.assertPropertyName(ts, 'se:Label', 'NAME')
558+
font = self.assertElement(ts, 'se:Font', 0)
559+
self.assertEquals('Liberation Mono', self.assertSvgParameter(font, 'font-family').text())
560+
self.assertEquals('9', self.assertSvgParameter(font, 'font-size').text())
561+
562+
fill = self.assertElement(ts, 'se:Fill', 0)
563+
self.assertEquals('#000000', self.assertSvgParameter(fill, "fill").text())
564+
565+
def loadStyleWithCustomProperties(self, layer, qmlFileName):
566+
# load the style, only vector symbology
567+
path = QDir.toNativeSeparators('%s/symbol_layer/%s.qml' % (unitTestDataPath(), qmlFileName))
568+
569+
# labelling is in custom properties, they need to be loaded separately
570+
status = layer.loadNamedStyle(path)
571+
doc = QDomDocument()
572+
file = QFile(path)
573+
file.open(QIODevice.ReadOnly)
574+
doc.setContent(file, True)
575+
file.close()
576+
flag = layer.readCustomProperties(doc.documentElement())
577+
578+
def assertElement(self, container, elementName, index):
579+
list = container.elementsByTagName(elementName)
580+
self.assertTrue(list.size() > index, 'Expected to find at least ' + str(index + 1) + ' ' + elementName + ' in ' + container.nodeName() + ' but found ' + str(list.size()))
581+
node = list.item(index)
582+
self.assertTrue(node.isElement(), 'Found node but it''s not an element')
583+
return node.toElement()
584+
585+
def getTextSymbolizer(self, root, ruleIndex, textSymbolizerIndex):
586+
rule = self.assertElement(root, 'se:Rule', ruleIndex)
587+
textSymbolizer = self.assertElement(rule, 'se:TextSymbolizer', textSymbolizerIndex)
588+
return textSymbolizer
589+
590+
def assertPropertyName(self, root, containerProperty, expectedAttributeName):
591+
container = root.elementsByTagName(containerProperty).item(0).toElement()
592+
property = container.elementsByTagName("ogc:PropertyName").item(0).toElement()
593+
self.assertEqual(expectedAttributeName, property.text())
594+
595+
def assertSvgParameter(self, container, expectedName):
596+
list = container.elementsByTagName("se:SvgParameter")
597+
for i in range(0, list.size()):
598+
item = list.item(i)
599+
if item.isElement and item.isElement() and item.toElement().attribute('name') == expectedName:
600+
return item.toElement()
601+
self.fail('Could not find a se:SvgParameter named ' + expectedName + ' in ' + container.nodeName())
602+
549603
def assertScaleDenominator(self, root, expectedMinScale, expectedMaxScale, index=0):
550604
rule = root.elementsByTagName('se:Rule').item(index).toElement()
551605

Lines changed: 285 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,285 @@
1+
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
2+
<qgis version="2.18.0" simplifyAlgorithm="0" minimumScale="0" maximumScale="1e+08" simplifyDrawingHints="0" minLabelScale="0" maxLabelScale="1e+08" simplifyDrawingTol="1" simplifyMaxScale="1" hasScaleBasedVisibilityFlag="0" simplifyLocal="1" scaleBasedLabelVisibilityFlag="0">
3+
<edittypes>
4+
<edittype widgetv2type="TextEdit" name="ID">
5+
<widgetv2config IsMultiline="0" fieldEditable="1" constraint="" UseHtml="0" labelOnTop="0" constraintDescription="" notNull="0"/>
6+
</edittype>
7+
<edittype widgetv2type="TextEdit" name="AUTHORITY">
8+
<widgetv2config IsMultiline="0" fieldEditable="1" constraint="" UseHtml="0" labelOnTop="0" constraintDescription="" notNull="0"/>
9+
</edittype>
10+
<edittype widgetv2type="TextEdit" name="NAME">
11+
<widgetv2config IsMultiline="0" fieldEditable="1" constraint="" UseHtml="0" labelOnTop="0" constraintDescription="" notNull="0"/>
12+
</edittype>
13+
</edittypes>
14+
<renderer-v2 forceraster="0" symbollevels="0" type="singleSymbol" enableorderby="0">
15+
<symbols>
16+
<symbol alpha="1" clip_to_extent="1" type="marker" name="0">
17+
<layer pass="0" class="SimpleMarker" locked="0">
18+
<prop k="angle" v="0"/>
19+
<prop k="color" v="160,80,26,255"/>
20+
<prop k="horizontal_anchor_point" v="1"/>
21+
<prop k="joinstyle" v="bevel"/>
22+
<prop k="name" v="circle"/>
23+
<prop k="offset" v="0,0"/>
24+
<prop k="offset_map_unit_scale" v="0,0,0,0,0,0"/>
25+
<prop k="offset_unit" v="MM"/>
26+
<prop k="outline_color" v="0,0,0,255"/>
27+
<prop k="outline_style" v="solid"/>
28+
<prop k="outline_width" v="0"/>
29+
<prop k="outline_width_map_unit_scale" v="0,0,0,0,0,0"/>
30+
<prop k="outline_width_unit" v="MM"/>
31+
<prop k="scale_method" v="diameter"/>
32+
<prop k="size" v="5"/>
33+
<prop k="size_map_unit_scale" v="0,0,0,0,0,0"/>
34+
<prop k="size_unit" v="MM"/>
35+
<prop k="vertical_anchor_point" v="1"/>
36+
</layer>
37+
</symbol>
38+
</symbols>
39+
<rotation/>
40+
<sizescale scalemethod="diameter"/>
41+
</renderer-v2>
42+
<labeling type="simple"/>
43+
<customproperties>
44+
<property key="embeddedWidgets/count" value="0"/>
45+
<property key="labeling" value="pal"/>
46+
<property key="labeling/addDirectionSymbol" value="false"/>
47+
<property key="labeling/angleOffset" value="0"/>
48+
<property key="labeling/blendMode" value="0"/>
49+
<property key="labeling/bufferBlendMode" value="0"/>
50+
<property key="labeling/bufferColorA" value="255"/>
51+
<property key="labeling/bufferColorB" value="255"/>
52+
<property key="labeling/bufferColorG" value="255"/>
53+
<property key="labeling/bufferColorR" value="255"/>
54+
<property key="labeling/bufferDraw" value="true"/>
55+
<property key="labeling/bufferJoinStyle" value="128"/>
56+
<property key="labeling/bufferNoFill" value="false"/>
57+
<property key="labeling/bufferSize" value="1"/>
58+
<property key="labeling/bufferSizeInMapUnits" value="false"/>
59+
<property key="labeling/bufferSizeMapUnitScale" value="0,0,0,0,0,0"/>
60+
<property key="labeling/bufferTransp" value="0"/>
61+
<property key="labeling/centroidInside" value="false"/>
62+
<property key="labeling/centroidWhole" value="false"/>
63+
<property key="labeling/decimals" value="3"/>
64+
<property key="labeling/displayAll" value="false"/>
65+
<property key="labeling/dist" value="0"/>
66+
<property key="labeling/distInMapUnits" value="false"/>
67+
<property key="labeling/distMapUnitScale" value="0,0,0,0,0,0"/>
68+
<property key="labeling/drawLabels" value="true"/>
69+
<property key="labeling/enabled" value="true"/>
70+
<property key="labeling/fieldName" value="NAME"/>
71+
<property key="labeling/fitInPolygonOnly" value="false"/>
72+
<property key="labeling/fontCapitals" value="0"/>
73+
<property key="labeling/fontFamily" value="Liberation Mono"/>
74+
<property key="labeling/fontItalic" value="true"/>
75+
<property key="labeling/fontLetterSpacing" value="0"/>
76+
<property key="labeling/fontLimitPixelSize" value="false"/>
77+
<property key="labeling/fontMaxPixelSize" value="10000"/>
78+
<property key="labeling/fontMinPixelSize" value="3"/>
79+
<property key="labeling/fontSize" value="9"/>
80+
<property key="labeling/fontSizeInMapUnits" value="false"/>
81+
<property key="labeling/fontSizeMapUnitScale" value="0,0,0,0,0,0"/>
82+
<property key="labeling/fontStrikeout" value="false"/>
83+
<property key="labeling/fontUnderline" value="false"/>
84+
<property key="labeling/fontWeight" value="75"/>
85+
<property key="labeling/fontWordSpacing" value="0"/>
86+
<property key="labeling/formatNumbers" value="false"/>
87+
<property key="labeling/isExpression" value="false"/>
88+
<property key="labeling/labelOffsetInMapUnits" value="true"/>
89+
<property key="labeling/labelOffsetMapUnitScale" value="0,0,0,0,0,0"/>
90+
<property key="labeling/labelPerPart" value="false"/>
91+
<property key="labeling/leftDirectionSymbol" value="&lt;"/>
92+
<property key="labeling/limitNumLabels" value="false"/>
93+
<property key="labeling/maxCurvedCharAngleIn" value="25"/>
94+
<property key="labeling/maxCurvedCharAngleOut" value="-25"/>
95+
<property key="labeling/maxNumLabels" value="2000"/>
96+
<property key="labeling/mergeLines" value="false"/>
97+
<property key="labeling/minFeatureSize" value="0"/>
98+
<property key="labeling/multilineAlign" value="3"/>
99+
<property key="labeling/multilineHeight" value="1"/>
100+
<property key="labeling/namedStyle" value="Bold Italic"/>
101+
<property key="labeling/obstacle" value="true"/>
102+
<property key="labeling/obstacleFactor" value="1"/>
103+
<property key="labeling/obstacleType" value="0"/>
104+
<property key="labeling/offsetType" value="0"/>
105+
<property key="labeling/placeDirectionSymbol" value="0"/>
106+
<property key="labeling/placement" value="1"/>
107+
<property key="labeling/placementFlags" value="10"/>
108+
<property key="labeling/plussign" value="false"/>
109+
<property key="labeling/predefinedPositionOrder" value="TR,TL,BR,BL,R,L,TSR,BSR"/>
110+
<property key="labeling/preserveRotation" value="true"/>
111+
<property key="labeling/previewBkgrdColor" value="#ffffff"/>
112+
<property key="labeling/priority" value="5"/>
113+
<property key="labeling/quadOffset" value="7"/>
114+
<property key="labeling/repeatDistance" value="0"/>
115+
<property key="labeling/repeatDistanceMapUnitScale" value="0,0,0,0,0,0"/>
116+
<property key="labeling/repeatDistanceUnit" value="1"/>
117+
<property key="labeling/reverseDirectionSymbol" value="false"/>
118+
<property key="labeling/rightDirectionSymbol" value=">"/>
119+
<property key="labeling/scaleMax" value="10000000"/>
120+
<property key="labeling/scaleMin" value="1"/>
121+
<property key="labeling/scaleVisibility" value="false"/>
122+
<property key="labeling/shadowBlendMode" value="6"/>
123+
<property key="labeling/shadowColorB" value="0"/>
124+
<property key="labeling/shadowColorG" value="0"/>
125+
<property key="labeling/shadowColorR" value="0"/>
126+
<property key="labeling/shadowDraw" value="false"/>
127+
<property key="labeling/shadowOffsetAngle" value="135"/>
128+
<property key="labeling/shadowOffsetDist" value="1"/>
129+
<property key="labeling/shadowOffsetGlobal" value="true"/>
130+
<property key="labeling/shadowOffsetMapUnitScale" value="0,0,0,0,0,0"/>
131+
<property key="labeling/shadowOffsetUnits" value="1"/>
132+
<property key="labeling/shadowRadius" value="1.5"/>
133+
<property key="labeling/shadowRadiusAlphaOnly" value="false"/>
134+
<property key="labeling/shadowRadiusMapUnitScale" value="0,0,0,0,0,0"/>
135+
<property key="labeling/shadowRadiusUnits" value="1"/>
136+
<property key="labeling/shadowScale" value="100"/>
137+
<property key="labeling/shadowTransparency" value="30"/>
138+
<property key="labeling/shadowUnder" value="0"/>
139+
<property key="labeling/shapeBlendMode" value="0"/>
140+
<property key="labeling/shapeBorderColorA" value="255"/>
141+
<property key="labeling/shapeBorderColorB" value="128"/>
142+
<property key="labeling/shapeBorderColorG" value="128"/>
143+
<property key="labeling/shapeBorderColorR" value="128"/>
144+
<property key="labeling/shapeBorderWidth" value="0"/>
145+
<property key="labeling/shapeBorderWidthMapUnitScale" value="0,0,0,0,0,0"/>
146+
<property key="labeling/shapeBorderWidthUnits" value="1"/>
147+
<property key="labeling/shapeDraw" value="false"/>
148+
<property key="labeling/shapeFillColorA" value="255"/>
149+
<property key="labeling/shapeFillColorB" value="255"/>
150+
<property key="labeling/shapeFillColorG" value="255"/>
151+
<property key="labeling/shapeFillColorR" value="255"/>
152+
<property key="labeling/shapeJoinStyle" value="64"/>
153+
<property key="labeling/shapeOffsetMapUnitScale" value="0,0,0,0,0,0"/>
154+
<property key="labeling/shapeOffsetUnits" value="1"/>
155+
<property key="labeling/shapeOffsetX" value="0"/>
156+
<property key="labeling/shapeOffsetY" value="0"/>
157+
<property key="labeling/shapeRadiiMapUnitScale" value="0,0,0,0,0,0"/>
158+
<property key="labeling/shapeRadiiUnits" value="1"/>
159+
<property key="labeling/shapeRadiiX" value="0"/>
160+
<property key="labeling/shapeRadiiY" value="0"/>
161+
<property key="labeling/shapeRotation" value="0"/>
162+
<property key="labeling/shapeRotationType" value="0"/>
163+
<property key="labeling/shapeSVGFile" value=""/>
164+
<property key="labeling/shapeSizeMapUnitScale" value="0,0,0,0,0,0"/>
165+
<property key="labeling/shapeSizeType" value="0"/>
166+
<property key="labeling/shapeSizeUnits" value="1"/>
167+
<property key="labeling/shapeSizeX" value="0"/>
168+
<property key="labeling/shapeSizeY" value="0"/>
169+
<property key="labeling/shapeTransparency" value="0"/>
170+
<property key="labeling/shapeType" value="0"/>
171+
<property key="labeling/substitutions" value="&lt;substitutions/>"/>
172+
<property key="labeling/textColorA" value="255"/>
173+
<property key="labeling/textColorB" value="0"/>
174+
<property key="labeling/textColorG" value="0"/>
175+
<property key="labeling/textColorR" value="0"/>
176+
<property key="labeling/textTransp" value="0"/>
177+
<property key="labeling/upsidedownLabels" value="0"/>
178+
<property key="labeling/useSubstitutions" value="false"/>
179+
<property key="labeling/wrapChar" value=""/>
180+
<property key="labeling/xOffset" value="0"/>
181+
<property key="labeling/yOffset" value="0"/>
182+
<property key="labeling/zIndex" value="0"/>
183+
<property key="variableNames" value="_fields_"/>
184+
<property key="variableValues" value=""/>
185+
</customproperties>
186+
<blendMode>0</blendMode>
187+
<featureBlendMode>0</featureBlendMode>
188+
<layerTransparency>0</layerTransparency>
189+
<displayfield>NAME</displayfield>
190+
<label>0</label>
191+
<labelattributes>
192+
<label fieldname="" text="Etichetta"/>
193+
<family fieldname="" name="Liberation Mono"/>
194+
<size fieldname="" units="pt" value="12"/>
195+
<bold fieldname="" on="0"/>
196+
<italic fieldname="" on="0"/>
197+
<underline fieldname="" on="0"/>
198+
<strikeout fieldname="" on="0"/>
199+
<color fieldname="" red="0" blue="0" green="0"/>
200+
<x fieldname=""/>
201+
<y fieldname=""/>
202+
<offset x="0" y="0" units="pt" yfieldname="" xfieldname=""/>
203+
<angle fieldname="" value="0" auto="0"/>
204+
<alignment fieldname="" value="center"/>
205+
<buffercolor fieldname="" red="255" blue="255" green="255"/>
206+
<buffersize fieldname="" units="pt" value="1"/>
207+
<bufferenabled fieldname="" on=""/>
208+
<multilineenabled fieldname="" on=""/>
209+
<selectedonly on=""/>
210+
</labelattributes>
211+
<SingleCategoryDiagramRenderer diagramType="Histogram" sizeLegend="0" attributeLegend="1">
212+
<DiagramCategory penColor="#000000" labelPlacementMethod="XHeight" penWidth="0" diagramOrientation="Up" sizeScale="0,0,0,0,0,0" minimumSize="0" barWidth="5" penAlpha="255" maxScaleDenominator="1e+08" backgroundColor="#ffffff" transparency="0" width="15" scaleDependency="Area" backgroundAlpha="255" angleOffset="1440" scaleBasedVisibility="0" enabled="0" height="15" lineSizeScale="0,0,0,0,0,0" sizeType="MM" lineSizeType="MM" minScaleDenominator="inf">
213+
<fontProperties description="Liberation Mono,9,-1,5,50,0,0,0,0,0" style=""/>
214+
</DiagramCategory>
215+
<symbol alpha="1" clip_to_extent="1" type="marker" name="sizeSymbol">
216+
<layer pass="0" class="SimpleMarker" locked="0">
217+
<prop k="angle" v="0"/>
218+
<prop k="color" v="255,0,0,255"/>
219+
<prop k="horizontal_anchor_point" v="1"/>
220+
<prop k="joinstyle" v="bevel"/>
221+
<prop k="name" v="circle"/>
222+
<prop k="offset" v="0,0"/>
223+
<prop k="offset_map_unit_scale" v="0,0,0,0,0,0"/>
224+
<prop k="offset_unit" v="MM"/>
225+
<prop k="outline_color" v="0,0,0,255"/>
226+
<prop k="outline_style" v="solid"/>
227+
<prop k="outline_width" v="0"/>
228+
<prop k="outline_width_map_unit_scale" v="0,0,0,0,0,0"/>
229+
<prop k="outline_width_unit" v="MM"/>
230+
<prop k="scale_method" v="diameter"/>
231+
<prop k="size" v="2"/>
232+
<prop k="size_map_unit_scale" v="0,0,0,0,0,0"/>
233+
<prop k="size_unit" v="MM"/>
234+
<prop k="vertical_anchor_point" v="1"/>
235+
</layer>
236+
</symbol>
237+
</SingleCategoryDiagramRenderer>
238+
<DiagramLayerSettings yPosColumn="-1" showColumn="-1" linePlacementFlags="10" placement="0" dist="0" xPosColumn="-1" priority="0" obstacle="0" zIndex="0" showAll="1"/>
239+
<annotationform></annotationform>
240+
<aliases>
241+
<alias field="ID" index="0" name=""/>
242+
<alias field="AUTHORITY" index="1" name=""/>
243+
<alias field="NAME" index="2" name=""/>
244+
</aliases>
245+
<excludeAttributesWMS/>
246+
<excludeAttributesWFS/>
247+
<attributeactions default="-1"/>
248+
<attributetableconfig actionWidgetStyle="dropDown" sortExpression="" sortOrder="2359551">
249+
<columns>
250+
<column width="-1" hidden="0" type="field" name="ID"/>
251+
<column width="-1" hidden="0" type="field" name="AUTHORITY"/>
252+
<column width="-1" hidden="0" type="field" name="NAME"/>
253+
<column width="-1" hidden="1" type="actions"/>
254+
</columns>
255+
</attributetableconfig>
256+
<editform></editform>
257+
<editforminit/>
258+
<editforminitcodesource>0</editforminitcodesource>
259+
<editforminitfilepath></editforminitfilepath>
260+
<editforminitcode><![CDATA[# -*- coding: utf-8 -*-
261+
"""
262+
QGIS forms can have a Python function that is called when the form is
263+
opened.
264+
265+
Use this function to add extra logic to your forms.
266+
267+
Enter the name of the function in the "Python Init function"
268+
field.
269+
An example follows:
270+
"""
271+
from qgis.PyQt.QtWidgets import QWidget
272+
273+
def my_form_open(dialog, layer, feature):
274+
geom = feature.geometry()
275+
control = dialog.findChild(QWidget, "MyLineEdit")
276+
]]></editforminitcode>
277+
<featformsuppress>0</featformsuppress>
278+
<editorlayout>generatedlayout</editorlayout>
279+
<widgets/>
280+
<conditionalstyles>
281+
<rowstyles/>
282+
<fieldstyles/>
283+
</conditionalstyles>
284+
<layerGeometryType>0</layerGeometryType>
285+
</qgis>

0 commit comments

Comments
 (0)
Please sign in to comment.