本文整理汇总了Python中qgis.core.QgsRelation.isValid方法的典型用法代码示例。如果您正苦于以下问题:Python QgsRelation.isValid方法的具体用法?Python QgsRelation.isValid怎么用?Python QgsRelation.isValid使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类qgis.core.QgsRelation
的用法示例。
在下文中一共展示了QgsRelation.isValid方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: test_isValid
# 需要导入模块: from qgis.core import QgsRelation [as 别名]
# 或者: from qgis.core.QgsRelation import isValid [as 别名]
def test_isValid(self):
rel = QgsRelation()
assert not rel.isValid()
rel.setId('rel1')
assert not rel.isValid()
rel.setName('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()
示例2: test_isValid
# 需要导入模块: from qgis.core import QgsRelation [as 别名]
# 或者: from qgis.core.QgsRelation import isValid [as 别名]
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()
示例3: testDuplicateFeature
# 需要导入模块: from qgis.core import QgsRelation [as 别名]
# 或者: from qgis.core.QgsRelation import isValid [as 别名]
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
#.........这里部分代码省略.........
示例4: open_db
# 需要导入模块: from qgis.core import QgsRelation [as 别名]
# 或者: from qgis.core.QgsRelation import isValid [as 别名]
def open_db(self):
edb_filename = self.open_db_lineedit.text()
edb_name, ext = os.path.splitext(os.path.basename(str(edb_filename)))
QgsMessageLog.logMessage(
"Loading edb %s" % edb_filename,
'AirviroOfflineEdb',
QgsMessageLog.INFO
)
self.db_uri.setDatabase(edb_filename)
self.con, self.cur = connect(str(self.db_uri.database()))
self.epsg = get_epsg(self.con)
root = QgsProject.instance().layerTreeRoot()
edb_increment = 1
while root.findGroup(edb_name) is not None:
edb_name = edb_name + unicode(edb_increment)
edb_increment += 1
QgsMessageLog.logMessage(
"Adding edb layers in %s" % edb_name,
'AirviroOfflineEdb',
QgsMessageLog.INFO
)
edb_group = root.addGroup(edb_name)
point_group = edb_group.addGroup('Point sources')
area_group = edb_group.addGroup('Area sources')
grid_group = edb_group.addGroup('Grid sources')
road_group = edb_group.addGroup('Road sources')
subtable_group = edb_group.addGroup('Subtables')
company_group = edb_group.addGroup('Companies')
facility_group = edb_group.addGroup('Facilities')
emis_group = edb_group.addGroup('Emissions')
point_support_group = point_group.addGroup('Support tables')
area_support_group = area_group.addGroup('Support tables')
grid_support_group = grid_group.addGroup('Support tables')
road_support_group = road_group.addGroup('Support tables')
facility_support_group = facility_group.addGroup('Support tables')
company_support_group = company_group.addGroup('Support tables')
unit_group = subtable_group.addGroup('Units')
road_vehicle_group = subtable_group.addGroup('Road vehicles')
road_vehicle_support_group = road_vehicle_group.addGroup(
'Support tables'
)
roadtype_group = subtable_group.addGroup('Roadtypes')
emis_func_group = subtable_group.addGroup('Emission functions')
searchkey_group = subtable_group.addGroup('Searchkeys')
timevar_group = subtable_group.addGroup('Time variations')
subgrp_group = subtable_group.addGroup('Substance groups')
self.layers = {}
schema = ''
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
#.........这里部分代码省略.........
示例5: LinkerDock
# 需要导入模块: from qgis.core import QgsRelation [as 别名]
# 或者: from qgis.core.QgsRelation import isValid [as 别名]
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)
#.........这里部分代码省略.........
示例6: import_in_qgis
# 需要导入模块: from qgis.core import QgsRelation [as 别名]
# 或者: from qgis.core.QgsRelation import isValid [as 别名]
def import_in_qgis(gmlas_uri, provider, schema = None):
"""Imports layers from a GMLAS file in QGIS with relations and editor widgets
@param gmlas_uri connection parameters
@param provider name of the QGIS provider that handles gmlas_uri parameters (postgresql or spatialite)
@param schema name of the PostgreSQL schema where tables and metadata tables are
"""
if schema is not None:
schema_s = schema + "."
else:
schema_s = ""
ogr.UseExceptions()
drv = ogr.GetDriverByName(provider)
ds = drv.Open(gmlas_uri)
if ds is None:
raise RuntimeError("Problem opening {}".format(gmlas_uri))
# get list of layers
sql = "select o.*, g.f_geometry_column, g.srid from {}_ogr_layers_metadata o left join geometry_columns g on g.f_table_name = o.layer_name".format(schema_s)
l = ds.ExecuteSQL(sql)
layers = {}
for f in l:
ln = f.GetField("layer_name")
if ln not in layers:
layers[ln] = {
'uid': f.GetField("layer_pkid_name"),
'category': f.GetField("layer_category"),
'xpath': f.GetField("layer_xpath"),
'parent_pkid': f.GetField("layer_parent_pkid_name"),
'srid': f.GetField("srid"),
'geometry_column': f.GetField("f_geometry_column"),
'1_n' : [], # 1:N relations
'layer_id': None,
'layer_name' : ln,
'layer': None,
'fields' : []}
else:
# additional geometry columns
g = f.GetField("f_geometry_column")
k = "{} ({})".format(ln, g)
layers[k] = dict(layers[ln])
layers[k]["geometry_column"] = g
# collect fields with xlink:href
href_fields = {}
for ln, layer in layers.items():
layer_name = layer["layer_name"]
for f in ds.ExecuteSQL("select field_name, field_xpath from {}_ogr_fields_metadata where layer_name='{}'".format(schema_s, layer_name)):
field_name, field_xpath = f.GetField("field_name"), f.GetField("field_xpath")
if field_xpath and field_xpath.endswith("@xlink:href"):
if ln not in href_fields:
href_fields[ln] = []
href_fields[ln].append(field_name)
# with unknown srid, don't ask for each layer, set to a default
settings = QgsSettings()
projection_behavior = settings.value("Projections/defaultBehavior")
projection_default = settings.value("Projections/layerDefaultCrs")
settings.setValue("Projections/defaultBehavior", "useGlobal")
settings.setValue("Projections/layerDefaultCrs", "EPSG:4326")
# add layers
crs = QgsCoordinateReferenceSystem("EPSG:4326")
for ln in sorted(layers.keys()):
lyr = layers[ln]
g_column = lyr["geometry_column"] or None
l = _qgis_layer(gmlas_uri, schema, lyr["layer_name"], g_column, provider, ln, lyr["xpath"], lyr["uid"])
if not l.isValid():
raise RuntimeError("Problem loading layer {} with {}".format(ln, l.source()))
if g_column is not None:
if lyr["srid"]:
crs = QgsCoordinateReferenceSystem("EPSG:{}".format(lyr["srid"]))
l.setCrs(crs)
QgsProject.instance().addMapLayer(l)
layers[ln]['layer_id'] = l.id()
layers[ln]['layer'] = l
# save fields which represent a xlink:href
if ln in href_fields:
l.setCustomProperty("href_fields", href_fields[ln])
# save gmlas_uri
l.setCustomProperty("ogr_uri", gmlas_uri)
l.setCustomProperty("ogr_schema", schema)
# change icon the layer has a custom viewer
xpath = no_ns(l.customProperty("xpath", ""))
for viewer_cls, _ in get_custom_viewers().values():
tag = no_prefix(viewer_cls.xml_tag())
if tag == xpath:
lg = CustomViewerLegend(viewer_cls.name(), viewer_cls.icon())
l.setLegend(lg)
# restore settings
settings.setValue("Projections/defaultBehavior", projection_behavior)
settings.setValue("Projections/layerDefaultCrs", projection_default)
# add 1:1 relations
relations_1_1 = []
sql = """
#.........这里部分代码省略.........