Пример #1
0
    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)
Пример #2
0
    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)
Пример #6
0
 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
Пример #7
0
    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
Пример #8
0
    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