本文整理汇总了Python中qgis.core.QgsRelation类的典型用法代码示例。如果您正苦于以下问题:Python QgsRelation类的具体用法?Python QgsRelation怎么用?Python QgsRelation使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了QgsRelation类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: __init__
def __init__(self, iface):
# QGIS
self.iface = iface
self.settings = MySettings()
self.linkRubber = QgsRubberBand(self.iface.mapCanvas())
self.featureHighlight = None
# Relation management
self.relationManager = QgsProject.instance().relationManager()
self.relationManager.changed.connect(self.loadRelations)
self.relation = QgsRelation()
self.referencingFeature = QgsFeature()
self.relationWidgetWrapper = None
self.editorContext = QgsAttributeEditorContext()
self.editorContext.setVectorLayerTools(self.iface.vectorLayerTools())
# GUI
QDockWidget.__init__(self)
self.setupUi(self)
SettingDialog.__init__(self, MySettings(), False, True)
self.drawButton.setChecked(self.settings.value("drawEnabled"))
self.relationReferenceWidget.setAllowMapIdentification(True)
self.relationReferenceWidget.setEmbedForm(False)
self.mapTool = QgsMapToolIdentifyFeature(self.iface.mapCanvas())
self.mapTool.setButton(self.identifyReferencingFeatureButton)
# Connect signal/slot
self.relationComboBox.currentIndexChanged.connect(self.currentRelationChanged)
self.mapTool.featureIdentified.connect(self.setReferencingFeature)
# load relations at start
self.loadRelations()
示例2: loadRelations
def loadRelations(self):
self.deleteWrapper()
self.disconnectLayer()
self.relation = QgsRelation()
self.referencingFeature = QgsFeature()
self.relationComboBox.currentIndexChanged.disconnect(self.currentRelationChanged)
self.relationComboBox.clear()
for relation in self.relationManager.referencedRelations():
if relation.referencingLayer().hasGeometryType():
self.relationComboBox.addItem(relation.name(), relation.id())
self.relationComboBox.setCurrentIndex(-1)
self.relationComboBox.currentIndexChanged.connect(self.currentRelationChanged)
self.currentRelationChanged(-1)
示例3: createRelation
def createRelation(self):
rel = QgsRelation()
rel.setReferencingLayer(self.referencingLayer.id())
rel.setReferencedLayer(self.referencedLayer.id())
rel.addFieldPair('foreignkey', 'y')
return rel
示例4: test_getRelatedFeatures
def test_getRelatedFeatures(self):
rel = QgsRelation()
rel.setRelationId("rel1")
rel.setRelationName("Relation Number One")
rel.setReferencingLayer(self.referencingLayer.id())
rel.setReferencedLayer(self.referencedLayer.id())
rel.addFieldPair("foreignkey", "y")
feat = next(self.referencedLayer.getFeatures())
self.assertEqual(rel.getRelatedFeaturesFilter(feat), '"foreignkey" = 123')
it = rel.getRelatedFeatures(feat)
assert [a.attributes() for a in it] == [["test1", 123], ["test2", 123]]
示例5: test_isValid
def test_isValid(self):
rel = QgsRelation()
assert not rel.isValid()
rel.setRelationId("rel1")
assert not rel.isValid()
rel.setRelationName("Relation Number One")
assert not rel.isValid()
rel.setReferencingLayer(self.referencingLayer.id())
assert not rel.isValid()
rel.setReferencedLayer(self.referencedLayer.id())
assert not rel.isValid()
rel.addFieldPair("foreignkey", "y")
assert rel.isValid()
示例6: LinkerDock
class LinkerDock(QDockWidget, Ui_linker, SettingDialog):
def __init__(self, iface):
# QGIS
self.iface = iface
self.settings = MySettings()
self.linkRubber = QgsRubberBand(self.iface.mapCanvas())
self.featureHighlight = None
# Relation management
self.relationManager = QgsProject.instance().relationManager()
self.relationManager.changed.connect(self.loadRelations)
self.relation = QgsRelation()
self.referencingFeature = QgsFeature()
self.relationWidgetWrapper = None
self.editorContext = QgsAttributeEditorContext()
self.editorContext.setVectorLayerTools(self.iface.vectorLayerTools())
# GUI
QDockWidget.__init__(self)
self.setupUi(self)
SettingDialog.__init__(self, MySettings(), False, True)
self.drawButton.setChecked(self.settings.value("drawEnabled"))
self.relationReferenceWidget.setAllowMapIdentification(True)
self.relationReferenceWidget.setEmbedForm(False)
self.mapTool = QgsMapToolIdentifyFeature(self.iface.mapCanvas())
self.mapTool.setButton(self.identifyReferencingFeatureButton)
# Connect signal/slot
self.relationComboBox.currentIndexChanged.connect(self.currentRelationChanged)
self.mapTool.featureIdentified.connect(self.setReferencingFeature)
# load relations at start
self.loadRelations()
def showEvent(self, QShowEvent):
self.drawLink()
def closeEvent(self, e):
self.iface.mapCanvas().unsetMapTool(self.mapTool)
self.linkRubber.reset()
self.deleteHighlight()
self.deleteWrapper()
self.disconnectLayer()
def disconnectLayer(self):
if self.relation.isValid():
self.relation.referencingLayer().editingStarted.disconnect(self.relationEditableChanged)
self.relation.referencingLayer().editingStopped.disconnect(self.relationEditableChanged)
self.relation.referencingLayer().attributeValueChanged.disconnect(self.layerValueChangedOutside)
def runForFeature(self, relationId, layer, feature):
index = self.relationComboBox.findData(relationId)
self.relationComboBox.setCurrentIndex(index)
self.setReferencingFeature(feature)
self.show()
if not layer.isEditable():
self.iface.messageBar().pushMessage("Link It", "Cannot set a new related feature since %s is not editable" % layer.name(), QgsMessageBar.WARNING, 4)
else:
self.relationReferenceWidget.mapIdentification()
@pyqtSlot(name="on_identifyReferencingFeatureButton_clicked")
def activateMapTool(self):
self.iface.mapCanvas().setMapTool(self.mapTool)
def deactivateMapTool(self):
self.iface.mapCanvas().unsetMapTool(self.mapTool)
def loadRelations(self):
self.deleteWrapper()
self.disconnectLayer()
self.relation = QgsRelation()
self.referencingFeature = QgsFeature()
self.relationComboBox.currentIndexChanged.disconnect(self.currentRelationChanged)
self.relationComboBox.clear()
for relation in self.relationManager.referencedRelations():
if relation.referencingLayer().hasGeometryType():
self.relationComboBox.addItem(relation.name(), relation.id())
self.relationComboBox.setCurrentIndex(-1)
self.relationComboBox.currentIndexChanged.connect(self.currentRelationChanged)
self.currentRelationChanged(-1)
def currentRelationChanged(self, index):
# disconnect previous relation
if self.relation.isValid():
try:
self.relation.referencingLayer().editingStarted.disconnect(self.relationEditableChanged)
self.relation.referencingLayer().editingStopped.disconnect(self.relationEditableChanged)
self.relation.referencingLayer().attributeValueChanged.disconnect(self.layerValueChangedOutside)
except TypeError:
pass
self.referencingFeatureLayout.setEnabled(index >= 0)
relationId = self.relationComboBox.itemData(index)
self.relation = self.relationManager.relation(relationId)
self.mapTool.setLayer(self.relation.referencingLayer())
self.setReferencingFeature()
# connect
if self.relation.isValid():
self.relation.referencingLayer().editingStarted.connect(self.relationEditableChanged)
#.........这里部分代码省略.........
示例7: test_fieldPairs
def test_fieldPairs(self):
rel = QgsRelation()
rel.setId('rel1')
rel.setName('Relation Number One')
rel.setReferencingLayer(self.referencingLayer.id())
rel.setReferencedLayer(self.referencedLayer.id())
rel.addFieldPair('foreignkey', 'y')
assert (rel.fieldPairs() == {'foreignkey': 'y'})
示例8: test_getRelatedFeaturesWithQuote
def test_getRelatedFeaturesWithQuote(self):
rel = QgsRelation()
rel.setId('rel1')
rel.setName('Relation Number One')
rel.setReferencingLayer(self.referencingLayer.id())
rel.setReferencedLayer(self.referencedLayer.id())
rel.addFieldPair('fldtxt', 'x')
feat = self.referencedLayer.getFeature(3)
it = rel.getRelatedFeatures(feat)
assert next(it).attributes() == ["foobar'bar", 124]
示例9: open_db
#.........这里部分代码省略.........
geom_table_column_dict = dict(GEOMETRY_TABLES_COLUMNS)
for table in TABLES:
if not table_in_db(self.cur, table):
iface.messageBar().pushMessage(
"Warning",
"Table %s not found in edb" % table,
level=QgsMessageBar.WARNING,
duration=3
)
continue
geom_col = geom_table_column_dict.get(table, None)
self.db_uri.setDataSource(
schema,
table,
geom_col or ''
)
layer_uri = self.db_uri.uri() # + "&crs=EPSG:4326"
layer = QgsVectorLayer(layer_uri, table, 'spatialite')
layer.setCrs(QgsCoordinateReferenceSystem(
self.epsg,
QgsCoordinateReferenceSystem.EpsgCrsId)
)
if not layer.isValid():
raise ValueError(edb_filename)
map_layer = QgsMapLayerRegistry.instance().addMapLayer(
layer, False
)
if 'timevar' in table:
group = timevar_group
elif 'emission_function' in table:
group = emis_func_group
elif 'searchkey' in table:
group = searchkey_group
elif 'unit' in table:
group = unit_group
elif 'subgrp' in table:
group = subgrp_group
elif table == 'substances':
group = subtable_group
elif table.endswith('_emis'):
group = emis_group
elif table == 'points':
group = point_group
elif 'point_' in table:
group = point_support_group
elif table == 'areas':
group = area_group
elif 'area_' in table:
group = area_support_group
elif table == 'roads':
group = road_group
elif table in ('road_vehicle_link', 'road_alobs'):
group = road_support_group
elif 'road_' in table:
group = road_vehicle_group
elif 'roadtype' in table:
group = roadtype_group
elif table == 'facilties':
group = facility_group
elif 'facility' in table:
group = facility_support_group
elif 'companies' == table:
group = company_group
elif 'company' in table:
group = company_support_group
elif 'traffic_situation' in table:
group = road_vehicle_support_group
group.setVisible(False)
group.setExpanded(False)
group.addLayer(map_layer)
self.layers[table] = map_layer.id()
for table in TABLES:
foreign_keys = get_foreign_keys(self.con, table)
referencing_layer = self.layers[table]
for row in foreign_keys:
referenced_layer = self.layers[row['table']]
from_column = row['from']
to_column = row['to']
rel = QgsRelation()
rel.setReferencingLayer(referencing_layer)
rel.setReferencedLayer(referenced_layer)
rel.addFieldPair(from_column, to_column)
rel_name = 'fk_%s_%s-%s_%s' % (
table, from_column, row['table'], to_column
)
rel.setRelationId(rel_name)
rel.setRelationName(
'fk_%s_%s-%s_%s' % (
table, from_column, row['table'], to_column)
)
if not rel.isValid():
raise ValueError(
'Reference %s is invalid' % rel_name
)
QgsProject.instance().relationManager().addRelation(rel)
示例10: test_isValid
def test_isValid(self):
referencedLayer = createReferencedLayer()
referencingLayer = createReferencingLayer()
QgsMapLayerRegistry.instance().addMapLayers([referencedLayer,referencingLayer])
rel = QgsRelation()
assert not rel.isValid()
rel.setRelationId( 'rel1' )
assert not rel.isValid()
rel.setRelationName( 'Relation Number One' )
assert not rel.isValid()
rel.setReferencingLayer( referencingLayer.id() )
assert not rel.isValid()
rel.setReferencedLayer( referencedLayer.id() )
assert not rel.isValid()
rel.addFieldPair( 'foreignkey', 'y' )
assert rel.isValid()
QgsMapLayerRegistry.instance().removeAllMapLayers()
示例11: test_getRelatedFeatures
def test_getRelatedFeatures(self):
referencedLayer = createReferencedLayer()
referencingLayer = createReferencingLayer()
QgsMapLayerRegistry.instance().addMapLayers([referencedLayer,referencingLayer])
rel = QgsRelation()
rel.setRelationId( 'rel1' )
rel.setRelationName( 'Relation Number One' )
rel.setReferencingLayer( referencingLayer.id() )
rel.setReferencedLayer( referencedLayer.id() )
rel.addFieldPair( 'foreignkey', 'y' )
feat = referencedLayer.getFeatures().next()
it = rel.getRelatedFeatures( feat )
[ a.attributes() for a in it ] == [[u'test1', 123], [u'test2', 123]]
QgsMapLayerRegistry.instance().removeAllMapLayers()
示例12: applyJoin
def applyJoin(self):
self.dlg.show()
selectedFields = self.getSelFieldList() or []
if self.dlg.targetLayerCombo.currentText()[:6] != 'Select' and self.dlg.joinLayerCombo.currentText()[:6] != 'Select' and self.dlg.spatialTypeCombo.currentText()[:6] != 'Select':
targetLayer = self.layerSet[self.dlg.targetLayerCombo.currentText()]
joinLayer = self.layerSet[self.dlg.joinLayerCombo.currentText()]
joinLayerFields = [field.name() for field in joinLayer.pendingFields()]
#targetLayerFields = [field.name() for field in targetLayer.pendingFields()]
targetLayerFields = []
for field in targetLayer.pendingFields():
if field.name()[0:7] == 'spjoin_':
idx = targetLayer.pendingFields().fieldNameIndex(field.name())
self.tra.ce("removing:"+field.name()+str(idx))
targetLayer.dataProvider().deleteAttributes([idx])
targetLayer.removeExpressionField(idx)
else:
targetLayerFields.append(field.name())
self.tra.ce(targetLayerFields)
targetLayer.updateFields()
joinField = 'spjoin_rif'
exp = "geom"+self.dlg.spatialTypeCombo.currentText()+"('"+joinLayer.name()+"','$id')"
self.tra.ce( exp)
#add a rif field if build relation requested
if self.dlg.checkBuildRelation.checkState() == Qt.Checked:
#joinLayer.addExpressionField('$id', QgsField('spjoin_rif', QVariant.Int))
joinLayer.dataProvider().addAttributes([QgsField(joinField, QVariant.Int)])
#joinLayer.updateFields()
idx = joinLayer.dataProvider().fields().fieldNameIndex(joinField)
expObj = QgsExpression('$id')
changes = {}
for feature in joinLayer.getFeatures():
value = expObj.evaluate(feature)
#joinLayer.dataProvider().changeAttributeValues({feature.id():{idx:value}})
changes[feature.id()] = {idx:value}
joinLayer.dataProvider().changeAttributeValues(changes)
if self.dlg.checkDynamicJoin.checkState() == Qt.Checked:
targetLayer.addExpressionField(exp, QgsField(joinField, QVariant.Int))
else:
#Create static rif field
targetLayer.dataProvider().addAttributes([QgsField(joinField, QVariant.Int)])
#targetLayer.updateFields()
F = [field.name() for field in targetLayer.dataProvider().fields()]
self.tra.ce(F)
#Compile spatial expression to get feature rifs
expObj = QgsExpression(exp)
expObj.prepare(targetLayer.pendingFields())
idx = targetLayer.dataProvider().fields().fieldNameIndex(joinField)
self.tra.ce( "new " + joinField + str(idx))
changes = {}
#init progress bar
self.dlg.progressBar.setMinimum(0)
self.dlg.progressBar.setMaximum(targetLayer.featureCount())
#cicle into feature to build mod vector
for count, feature in enumerate(targetLayer.getFeatures()):
self.dlg.progressBar.setValue(count)
value = expObj.evaluate(feature)
changes[feature.id()] = {idx:value}
self.tra.ce(changes)
#apply mod vector
targetLayer.dataProvider().changeAttributeValues(changes)
targetLayer.updateFields()
#build expression fields to connect to join field rif
for f in selectedFields:
fieldType = joinLayer.pendingFields().field(f).type()
exp = """dbvaluebyid('%s','%s',"%s")""" %(joinLayer.name(),f,joinField)
self.tra.ce(exp)
targetLayer.addExpressionField(exp, QgsField('spjoin_'+f, fieldType))
targetLayer.updateFields()
if self.dlg.checkBuildRelation.checkState() == Qt.Checked:
jRel = QgsRelation()
jRel.setRelationId(targetLayer.name()+"_"+str(uuid.uuid1()))
jRel.setRelationName("%s_%s-rif_%s" % (targetLayer.name(),self.dlg.spatialTypeCombo.currentText(),joinLayer.name()))
jRel.setReferencedLayer(joinLayer.id())
jRel.setReferencingLayer(targetLayer.id())
jRel.addFieldPair('spjoin_rif','spjoin_rif')
QgsProject.instance().relationManager().addRelation(jRel)
self.dlg.hide()
示例13: testDuplicateFeature
def testDuplicateFeature(self):
""" test duplicating a feature """
project = QgsProject().instance()
# LAYERS
# - add first layer (parent)
layer1 = QgsVectorLayer("Point?field=fldtxt:string&field=pkid:integer",
"parentlayer", "memory")
# > check first layer (parent)
self.assertTrue(layer1.isValid())
# - set the value for the copy
layer1.setDefaultValueDefinition(1, QgsDefaultValue("rand(1000,2000)"))
# > check first layer (parent)
self.assertTrue(layer1.isValid())
# - add second layer (child)
layer2 = QgsVectorLayer("Point?field=fldtxt:string&field=id:integer&field=foreign_key:integer",
"childlayer", "memory")
# > check second layer (child)
self.assertTrue(layer2.isValid())
# - add layers
project.addMapLayers([layer1, layer2])
# FEATURES
# - add 2 features on layer1 (parent)
l1f1orig = QgsFeature()
l1f1orig.setFields(layer1.fields())
l1f1orig.setAttributes(["F_l1f1", 100])
l1f2orig = QgsFeature()
l1f2orig.setFields(layer1.fields())
l1f2orig.setAttributes(["F_l1f2", 101])
# > check by adding features
self.assertTrue(layer1.dataProvider().addFeatures([l1f1orig, l1f2orig]))
# add 4 features on layer2 (child)
l2f1orig = QgsFeature()
l2f1orig.setFields(layer2.fields())
l2f1orig.setAttributes(["F_l2f1", 201, 100])
l2f2orig = QgsFeature()
l2f2orig.setFields(layer2.fields())
l2f2orig.setAttributes(["F_l2f2", 202, 100])
l2f3orig = QgsFeature()
l2f3orig.setFields(layer2.fields())
l2f3orig.setAttributes(["F_l2f3", 203, 100])
l2f4orig = QgsFeature()
l2f4orig.setFields(layer2.fields())
l2f4orig.setAttributes(["F_l2f4", 204, 101])
# > check by adding features
self.assertTrue(layer2.dataProvider().addFeatures([l2f1orig, l2f2orig, l2f3orig, l2f4orig]))
# RELATION
# - create the relationmanager
relMgr = project.relationManager()
# - create the relation
rel = QgsRelation()
rel.setId('rel1')
rel.setName('childrel')
rel.setReferencingLayer(layer2.id())
rel.setReferencedLayer(layer1.id())
rel.addFieldPair('foreign_key', 'pkid')
rel.setStrength(QgsRelation.Composition)
# > check relation
self.assertTrue(rel.isValid())
# - add relation
relMgr.addRelation(rel)
# > check if referencedLayer is layer1
self.assertEqual(rel.referencedLayer(), layer1)
# > check if referencingLayer is layer2
self.assertEqual(rel.referencingLayer(), layer2)
# > check if the layers are correct in relation when loading from relationManager
relations = project.relationManager().relations()
relation = relations[list(relations.keys())[0]]
# > check if referencedLayer is layer1
self.assertEqual(relation.referencedLayer(), layer1)
# > check if referencingLayer is layer2
self.assertEqual(relation.referencingLayer(), layer2)
# > check the relatedfeatures
'''
# testoutput 1
print( "\nAll Features and relations")
featit=layer1.getFeatures()
f=QgsFeature()
while featit.nextFeature(f):
print( f.attributes())
childFeature = QgsFeature()
relfeatit=rel.getRelatedFeatures(f)
while relfeatit.nextFeature(childFeature):
print( childFeature.attributes() )
print( "\n--------------------------")
print( "\nFeatures on layer1")
for f in layer1.getFeatures():
print( f.attributes() )
print( "\nFeatures on layer2")
for f in layer2.getFeatures():
print( f.attributes() )
'''
# DUPLICATION
#.........这里部分代码省略.........
示例14: test_getRelatedFeatures
def test_getRelatedFeatures(self):
rel = QgsRelation()
rel.setRelationId('rel1')
rel.setRelationName('Relation Number One')
rel.setReferencingLayer(self.referencingLayer.id())
rel.setReferencedLayer(self.referencedLayer.id())
rel.addFieldPair('foreignkey', 'y')
feat = self.referencedLayer.getFeatures().next()
it = rel.getRelatedFeatures(feat)
assert [a.attributes() for a in it] == [[u'test1', 123], [u'test2', 123]]
示例15: testRelations
def testRelations(self):
""" check that layers are shown in widget model"""
p = QgsProject.instance()
# not valid, but doesn't matter for test....
rel = QgsRelation()
rel.setId('rel1')
rel.setName('Relation Number One')
rel.setReferencingLayer(self.referencingLayer.id())
rel.setReferencedLayer(self.referencedLayer.id())
rel.addFieldPair('foreignkey', 'y')
rel2 = QgsRelation()
rel2.setId('rel2')
rel2.setName('Relation Number Two')
rel2.setReferencingLayer(self.referencingLayer.id())
rel2.setReferencedLayer(self.referencedLayer.id())
rel2.addFieldPair('foreignkey', 'y')
p.relationManager().addRelation(rel)
p.relationManager().addRelation(rel2)
w = QgsExpressionBuilderWidget()
m = w.model()
# check that relations are shown
items = m.findItems('Relation Number One', Qt.MatchRecursive)
self.assertEqual(len(items), 1)
items = m.findItems('Relation Number Two', Qt.MatchRecursive)
self.assertEqual(len(items), 1)