def testRectangle(self): rect = QgsReferencedRectangle(QgsRectangle(0.0, 1.0, 20.0, 10.0), QgsCoordinateReferenceSystem('epsg:3111')) self.assertEqual(rect.xMinimum(), 0.0) self.assertEqual(rect.yMinimum(), 1.0) self.assertEqual(rect.xMaximum(), 20.0) self.assertEqual(rect.yMaximum(), 10.0) self.assertEqual(rect.crs().authid(), 'EPSG:3111') rect.setCrs(QgsCoordinateReferenceSystem('epsg:28356')) self.assertEqual(rect.crs().authid(), 'EPSG:28356') # in variant v = QVariant(QgsReferencedRectangle(QgsRectangle(1.0, 2.0, 3.0, 4.0), QgsCoordinateReferenceSystem('epsg:3111'))) self.assertEqual(v.value().xMinimum(), 1.0) self.assertEqual(v.value().yMinimum(), 2.0) self.assertEqual(v.value().xMaximum(), 3.0) self.assertEqual(v.value().yMaximum(), 4.0) self.assertEqual(v.value().crs().authid(), 'EPSG:3111') # to rectangle r = QgsRectangle(rect) self.assertEqual(r.xMinimum(), 0.0) self.assertEqual(r.yMinimum(), 1.0) self.assertEqual(r.xMaximum(), 20.0) self.assertEqual(r.yMaximum(), 10.0) # test that QgsReferencedRectangle IS a QgsRectangle r2 = QgsRectangle(5, 6, 30, 40) r2.combineExtentWith(rect) self.assertEqual(r2.xMinimum(), 0.0) self.assertEqual(r2.yMinimum(), 1.0) self.assertEqual(r2.xMaximum(), 30.0) self.assertEqual(r2.yMaximum(), 40.0)
def find_duplicate_value(self, source_value, source_field_type, target_value_dict, target_field_type): """ Check if source_value is in target layer. First, as is, and if necessary as a converted value. :param source_value: single value from the source layer :param source_field_type: QVariant.Type :param target_value_dict: dict of unique values in the target layer. We only use keys in this function. :param target_field_type: QVariant.Type :return: Whether the source_value is duplicated in the target layer and, if so, also the target value """ # Direct comparison if source_field_type == target_field_type: if source_value in target_value_dict: return True, source_value else: return False, None # We first need to convert types before comparing... qvariant_value = QVariant(source_value) res_can_convert = qvariant_value.canConvert(target_field_type) if res_can_convert: res_convert = qvariant_value.convert(target_field_type) if res_convert: if qvariant_value.value() in target_value_dict: return True, qvariant_value.value() return False, None
def testPoint(self): point = QgsReferencedPointXY(QgsPointXY(1.0, 2.0), QgsCoordinateReferenceSystem('epsg:3111')) self.assertEqual(point.x(), 1.0) self.assertEqual(point.y(), 2.0) self.assertEqual(point.crs().authid(), 'EPSG:3111') point.setCrs(QgsCoordinateReferenceSystem('epsg:28356')) self.assertEqual(point.crs().authid(), 'EPSG:28356') # in variant v = QVariant( QgsReferencedPointXY(QgsPointXY(3.0, 4.0), QgsCoordinateReferenceSystem('epsg:3111'))) self.assertEqual(v.value().x(), 3.0) self.assertEqual(v.value().y(), 4.0) self.assertEqual(v.value().crs().authid(), 'EPSG:3111') # to QgsPointXY p = QgsPointXY(point) self.assertEqual(p.x(), 1.0) self.assertEqual(p.y(), 2.0) # equality point = QgsReferencedPointXY(QgsPointXY(1.0, 2.0), QgsCoordinateReferenceSystem('epsg:3111')) point2 = QgsReferencedPointXY( QgsPointXY(1.0, 2.0), QgsCoordinateReferenceSystem('epsg:3111')) self.assertEqual(point, point2) point2 = QgsReferencedPointXY( QgsPointXY(1.0, 2.0), QgsCoordinateReferenceSystem('epsg:4326')) self.assertNotEqual(point, point2) point2 = QgsReferencedPointXY( QgsPointXY(1.1, 2.0), QgsCoordinateReferenceSystem('epsg:3111')) self.assertNotEqual(point, point2)
def handleRegulationAndLandUseClassificationInSourceToTargetCopy( self, sourceFeature, targetSchemaTableName, targetFeature, shouldCreateRelation): # Tee tarvittaessa linkki olemassa olevaan tai uuteen kaavamääräykseen. Huomioi asetukset "Luo tarvittaessa uudet kaavamääräykset" ja "Täytä kaavakohteiden käyttötarkoitus kaavamääräyksen mukaan tai päinvastoin" # Huomioi, että kaavamääräys voi tulla lähteen käyttötarkoituksen kautta (muokkaa myös asetus-dialogia, jotta ko. asia on mahdollista) # Muuttaa lähdekaavamääräyksen isoihin kirjaimiin, jos ei ole valmiiksi # Huomioi, että kaavamääräys ja/tai käyttötarkoitus ovat voineet tulla oletusarvojen kautta fieldMatches = self.getSourceTargetFieldMatches() fieldMatchTargetNames = [ fieldMatch["target"] for fieldMatch in fieldMatches ] sourceRegulationName = self.getSourceFeatureValueForSourceTargetFieldMatch( fieldMatches, sourceFeature, "kaavamaaraysotsikko") if not sourceRegulationName.isNull(): if self.shouldCapitalize: sourceRegulationName = QVariant( sourceRegulationName.value().upper()) sourceRegulationName = QVariant( sourceRegulationName.value().rstrip()) sourceLandUseClassificationName = self.getSourceFeatureValueForSourceTargetFieldMatch( fieldMatches, sourceFeature, "kayttotarkoitus_lyhenne") if not sourceLandUseClassificationName.isNull(): if self.shouldCapitalize: sourceLandUseClassificationName = QVariant( sourceLandUseClassificationName.value().upper()) sourceLandUseClassificationName = QVariant( sourceLandUseClassificationName.value().rstrip()) # QgsMessageLog.logMessage("sourceRegulationName: " + str(sourceRegulationName.value()), 'Yleiskaava-työkalu', Qgis.Info) # QgsMessageLog.logMessage("sourceLandUseClassificationName: " + str(sourceLandUseClassificationName.value()), 'Yleiskaava-työkalu', Qgis.Info) if "kaavamaaraysotsikko" in fieldMatchTargetNames and not sourceRegulationName.isNull( ): # QgsMessageLog.logMessage("handleRegulationAndLandUseClassificationInSourceToTargetCopy - not sourceRegulationName.isNull()", 'Yleiskaava-työkalu', Qgis.Info) self.handleRegulationInSourceToTargetCopy(sourceFeature, targetFeature, sourceRegulationName, targetSchemaTableName, shouldCreateRelation) elif "kayttotarkoitus_lyhenne" in fieldMatchTargetNames and not sourceLandUseClassificationName.isNull( ): # QgsMessageLog.logMessage("handleRegulationAndLandUseClassificationInSourceToTargetCopy - not sourceLandUseClassificationName.isNull()", 'Yleiskaava-työkalu', Qgis.Info) self.handleLandUseClassificationInSourceToTargetCopy( sourceFeature, targetFeature, sourceLandUseClassificationName, targetSchemaTableName, shouldCreateRelation) elif self.getDefaultValuesRegulationValue() is not None: self.handleRegulationInSourceToTargetCopy( sourceFeature, targetFeature, self.getDefaultValuesRegulationValue(), targetSchemaTableName, shouldCreateRelation) elif self.getDefaultValuesLandUseClassificationValue() is not None: self.handleLandUseClassificationInSourceToTargetCopy( sourceFeature, targetFeature, self.getDefaultValuesLandUseClassificationValue(), targetSchemaTableName, shouldCreateRelation)
def checkValue(value: QVariant): if value.isNull(): return CellValue.ValueNone if value.convert(QMetaType.QString): if str(value.value()) == "": return CellValue.ValueNone if value.convert(QMetaType.Float): if isnan(float(value.value())): return CellValue.ValueNotFloat else: return CellValue.ValueFloat else: return CellValue.ValueNotFloat
def isFloat(value): q_value = QVariant(value) if q_value.isNull(): return False if q_value.convert(QMetaType.QString): if str(q_value.value()) == '': return False if q_value.convert(QMetaType.Float): if isnan(float(q_value.value())): return False else: return True else: return False
def testPoint(self): point = QgsReferencedPointXY(QgsPointXY(1.0, 2.0), QgsCoordinateReferenceSystem('epsg:3111')) self.assertEqual(point.x(), 1.0) self.assertEqual(point.y(), 2.0) self.assertEqual(point.crs().authid(), 'EPSG:3111') point.setCrs(QgsCoordinateReferenceSystem('epsg:28356')) self.assertEqual(point.crs().authid(), 'EPSG:28356') # in variant v = QVariant(QgsReferencedPointXY(QgsPointXY(3.0, 4.0), QgsCoordinateReferenceSystem('epsg:3111'))) self.assertEqual(v.value().x(), 3.0) self.assertEqual(v.value().y(), 4.0) self.assertEqual(v.value().crs().authid(), 'EPSG:3111') # to QgsPointXY p = QgsPointXY(point) self.assertEqual(p.x(), 1.0) self.assertEqual(p.y(), 2.0)
def setTargetFeatureValues(self, sourceFeature, targetFeature): # tarvittaessa tehdään muunnos esim. int -> string kopioinnissa sourceAttrData = self.getSourceFeatureAttributesWithInfo(sourceFeature) targetFieldData = self.getTargetFeatureFieldInfo() fieldMatches = self.getSourceTargetFieldMatches() # QgsMessageLog.logMessage("len(fieldMatches): " + str(len(fieldMatches)), 'Yleiskaava-työkalu', Qgis.Info) fieldMatchSourceNames = [ fieldMatch["source"] for fieldMatch in fieldMatches ] defaultTargetFieldInfos = self.getDefaultTargetFieldInfo() # QgsMessageLog.logMessage("len(defaultTargetFieldInfos): " + str(len(defaultTargetFieldInfos)), 'Yleiskaava-työkalu', Qgis.Info) # QgsMessageLog.logMessage("len(targetFieldData): " + str(len(targetFieldData)), 'Yleiskaava-työkalu', Qgis.Info) for targetFieldDataItem in targetFieldData: foundFieldMatchForTarget = False sourceHadValue = False attrNames = [] attrValues = [] for sourceAttrDataItem in sourceAttrData: # Jos käyttäjä täsmännyt lähdekentän kohdekenttään ja lähdekentässä on arvo, niin käytä sitä, muuten käytä kohdekenttään oletusarvoa, jos käyttäjä antanut sen # foundFieldMatch = False # sourceHadValue = False for fieldMatch in fieldMatches: # QgsMessageLog.logMessage("fieldMatch - source: " + fieldMatch["source"] + ", sourceFieldTypeName: " + fieldMatch["sourceFieldTypeName"] + ", target:" + fieldMatch["target"] + ", targetFieldTypeName:" + fieldMatch["targetFieldTypeName"], 'Yleiskaava-työkalu', Qgis.Info) if fieldMatch["source"] == sourceAttrDataItem[ "name"] and fieldMatch[ "target"] == targetFieldDataItem["name"]: if not sourceAttrDataItem["value"].isNull(): # QgsMessageLog.logMessage("setTargetFeatureValues, fieldMatch - sourceHadValue = True - source: " + fieldMatch["source"] + ", sourceFieldTypeName: " + fieldMatch["sourceFieldTypeName"] + ", sourceValue: " + str(sourceAttrDataItem["value"].value()) + ", target:" + fieldMatch["target"] + ", targetFieldTypeName:" + fieldMatch["targetFieldTypeName"], 'Yleiskaava-työkalu', Qgis.Info) attrValue = self.yleiskaavaUtils.getAttributeValueInCompatibleType( targetFieldDataItem["name"], targetFieldDataItem["type"], sourceAttrDataItem["type"], sourceAttrDataItem["value"]) if attrValue is not None: if self.shouldCapitalizeWithTargetField( targetFieldDataItem["name"]): attrValue = QVariant( attrValue.value().upper()) if self.shouldRStripWithTargetField( targetFieldDataItem["name"]): attrValue = QVariant( attrValue.value().rstrip()) attrNames.append(sourceAttrDataItem["name"]) attrValues.append(attrValue) else: CopySourceDataToDatabaseTask.yleiskaava_exceptions.append( { 'messageLevel': Qgis.Critical, 'message': 'Lähderivin sarakkeen ' + sourceAttrDataItem["name"] + ' arvoa ei voitu kopioida kohderiville' }) return False sourceHadValue = True # foundFieldMatch = True foundFieldMatchForTarget = True break if foundFieldMatchForTarget and not sourceHadValue: # QgsMessageLog.logMessage("setTargetFeatureValues, foundFieldMatch and not sourceHadValue - targetFieldName: " + targetFieldDataItem["name"] + ", sourceAttrName:" + sourceAttrDataItem["name"], 'Yleiskaava-työkalu', Qgis.Info) for defaultTargetFieldInfo in defaultTargetFieldInfos: # QgsMessageLog.logMessage("defaultTargetFieldInfo - defaultTargetName: " + defaultTargetFieldInfo["name"] + ", targetFieldName: " + targetFieldDataItem["name"], 'Yleiskaava-työkalu', Qgis.Info) if defaultTargetFieldInfo["name"] == targetFieldDataItem[ "name"]: # QgsMessageLog.logMessage("setTargetFeatureValues, foundFieldMatch and not sourceHadValue, defaultTargetFieldInfo - defaultTargetName = targetFieldName: " + defaultTargetFieldInfo["name"] + ", defaultTargetValue: " + str(defaultTargetFieldInfo["value"].value()), 'Yleiskaava-työkalu', Qgis.Info) if defaultTargetFieldInfo["value"] is not None: attrValue = self.yleiskaavaUtils.getAttributeValueInCompatibleType( targetFieldDataItem["name"], targetFieldDataItem["type"], defaultTargetFieldInfo["type"], defaultTargetFieldInfo["value"]) if attrValue is not None: targetFeature.setAttribute( targetFieldDataItem["name"], attrValue) else: CopySourceDataToDatabaseTask.yleiskaava_exceptions.append( { 'messageLevel': Qgis.Critical, 'message': 'Oletusarvoa ei voitu kopioida kohderiville ' + targetFieldDataItem["name"] }) return False break elif foundFieldMatchForTarget and sourceHadValue: # QgsMessageLog.logMessage("setTargetFeatureValues - foundFieldMatch and sourceHadValue - targetFieldName: " + targetFieldDataItem["name"], 'Yleiskaava-työkalu', Qgis.Info) if len(attrValues) == 1: attrValue = attrValues[0] if attrValue is not None: if self.shouldCapitalizeWithTargetField( targetFieldDataItem["name"]): attrValue = QVariant(attrValue.value().upper()) if self.shouldRStripWithTargetField( targetFieldDataItem["name"]): attrValue = QVariant(attrValue.value().rstrip()) targetFeature.setAttribute(targetFieldDataItem["name"], attrValue) else: # len(attrValues) > 1 combinedAttrValues = "" for index, attrValue in enumerate(attrValues): if self.includeFieldNamesForMultiValues: combinedAttrValues += attrNames[index] + ": " combinedAttrValues += str(QVariant(attrValue).value( )) + self.targetFieldValueSeparator if combinedAttrValues != "" and len( self.targetFieldValueSeparator) > 0: combinedAttrValues = combinedAttrValues[:-( len(self.targetFieldValueSeparator))] if self.shouldCapitalizeWithTargetField( targetFieldDataItem["name"]): combinedAttrValues = combinedAttrValues.upper() if self.shouldRStripWithTargetField( targetFieldDataItem["name"]): combinedAttrValues = combinedAttrValues.rstrip() targetFeature.setAttribute(targetFieldDataItem["name"], combinedAttrValues) # QgsMessageLog.logMessage("setTargetFeatureValues - foundFieldMatch and sourceHadValue - targetFieldName: " + targetFieldDataItem["name"] + ", combinedAttrValues:" + combinedAttrValues, 'Yleiskaava-työkalu', Qgis.Info) elif not foundFieldMatchForTarget: for defaultTargetFieldInfo in defaultTargetFieldInfos: # QgsMessageLog.logMessage("setTargetFeatureValues, not foundFieldMatch - targetFieldName: " + targetFieldDataItem["name"] + ", targetFieldType: " + targetFieldDataItem["type"], 'Yleiskaava-työkalu', Qgis.Info) # QgsMessageLog.logMessage("setTargetFeatureValues, not foundFieldMatch - defaultTargetName: " + defaultTargetFieldInfo["name"] + ", defaultTargetType: " + defaultTargetFieldInfo["type"] + ", defaultTargetValue: " + str(defaultTargetFieldInfo["value"].value()), 'Yleiskaava-työkalu', Qgis.Info) if defaultTargetFieldInfo["name"] == targetFieldDataItem[ "name"]: # QgsMessageLog.logMessage("defaultTargetFieldInfo - defaultTargetName = targetFieldName: " + defaultTargetFieldInfo["name"], 'Yleiskaava-työkalu', Qgis.Info) if defaultTargetFieldInfo["value"] is not None: # QgsMessageLog.logMessage("setTargetFeatureValues, not foundFieldMatch - not defaultTargetFieldInfo['value'].isNull()", 'Yleiskaava-työkalu', Qgis.Info) attrValue = self.yleiskaavaUtils.getAttributeValueInCompatibleType( targetFieldDataItem["name"], targetFieldDataItem["type"], defaultTargetFieldInfo["type"], defaultTargetFieldInfo["value"]) # QgsMessageLog.logMessage("setTargetFeatureValues - not foundFieldMatchForTarget, default attrValue: " + str(attrValue), 'Yleiskaava-työkalu', Qgis.Info) if attrValue is not None: targetFeature.setAttribute( targetFieldDataItem["name"], attrValue) else: CopySourceDataToDatabaseTask.yleiskaava_exceptions.append( { 'messageLevel': Qgis.Critical, 'message': 'Oletusarvoa ei voitu kopioida kohderiville ' + targetFieldDataItem["name"] }) return False break return True