def processAlgorithm(self, progress): polyLayer = QGisLayers.getObjectFromUri(self.getParameterValue(self.POLYGONS)) pointLayer = QGisLayers.getObjectFromUri(self.getParameterValue(self.POINTS)) fieldName = self.getParameterValue(self.FIELD) fieldIdx = pointLayer.fieldNameIndex(self.getParameterValue(self.WEIGHT)) polyProvider = polyLayer.dataProvider() idxCount, fieldList = utils.findOrCreateField(polyLayer, polyLayer.pendingFields(), fieldName) writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( fieldList.toList(), polyProvider.geometryType(), polyProvider.crs() ) spatialIndex = utils.createSpatialIndex(pointLayer) ftPoint = QgsFeature() outFeat = QgsFeature() geom = QgsGeometry() current = 0 hasIntersections = False features = QGisLayers.features(polyLayer) total = 100.0 / float(len(features)) for ftPoly in features: geom = ftPoly.geometry() attrs = ftPoly.attributes() count = 0 hasIntersections = False points = spatialIndex.intersects(geom.boundingBox()) if len(points) > 0: hasIntersections = True if hasIntersections: progress.setText(str(len(points))) for i in points: request = QgsFeatureRequest().setFilterFid(i) ftPoint = pointLayer.getFeatures(request).next() tmpGeom = QgsGeometry(ftPoint.geometry()) if geom.contains(tmpGeom): weight = str(ftPoint.attributes()[fieldIdx]) try: count += float(weight) except: pass # ignore fields with non-numeric values outFeat.setGeometry(geom) if idxCount == len(attrs): attrs.append(count) else: attrs[idxCount] = count outFeat.setAttributes(attrs) writer.addFeature(outFeat) current += 1 progress.setPercentage(int(current * total)) del writer
def processAlgorithm(self, progress): polyLayer = QGisLayers.getObjectFromUri(self.getParameterValue(self.POLYGONS)) pointLayer = QGisLayers.getObjectFromUri(self.getParameterValue(self.POINTS)) fieldName = self.getParameterValue(self.FIELD) polyProvider = polyLayer.dataProvider() pointProvider = pointLayer.dataProvider() if polyProvider.crs() != pointProvider.crs(): SextanteLog.addToLog(SextanteLog.LOG_WARNING, "CRS warning: Input layers have non-matching CRS. This may cause unexpected results.") idxCount, fieldList = utils.findOrCreateField(polyLayer, polyLayer.pendingFields(), fieldName) writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fieldList, polyProvider.geometryType(), polyProvider.crs()) spatialIndex = utils.createSpatialIndex(pointLayer) pointProvider.rewind() pointProvider.select() allAttrs = polyLayer.pendingAllAttributesList() polyLayer.select(allAttrs) ftPoly = QgsFeature() ftPoint = QgsFeature() outFeat = QgsFeature() geom = QgsGeometry() current = 0 hasIntersections = False features = QGisLayers.features(polyLayer) total = 100.0 / float(len(features)) for ftPoly in features: geom = ftPoly.geometry() atMap = ftPoly.attributeMap() count = 0 hasIntersections = False points = spatialIndex.intersects(geom.boundingBox()) if len(points) > 0: hasIntersections = True if hasIntersections: for i in points: pointLayer.featureAtId(int(i), ftPoint, True, False) tmpGeom = QgsGeometry(ftPoint.geometry()) if geom.contains(tmpGeom): count += 1 outFeat.setGeometry(geom) outFeat.setAttributeMap(atMap) outFeat.addAttribute(idxCount, QVariant(count)) writer.addFeature(outFeat) current += 1 progress.setPercentage(int(current * total)) del writer
def processAlgorithm(self, progress): polyLayer = QGisLayers.getObjectFromUri(self.getParameterValue(self.POLYGONS)) pointLayer = QGisLayers.getObjectFromUri(self.getParameterValue(self.POINTS)) fieldName = self.getParameterValue(self.FIELD) classFieldName = self.getParameterValue(self.CLASSFIELD) polyProvider = polyLayer.dataProvider() pointProvider = pointLayer.dataProvider() if polyProvider.crs() != pointProvider.crs(): SextanteLog.addToLog(SextanteLog.LOG_WARNING, "CRS warning: Input layers have non-matching CRS. This may cause unexpected results.") classFieldIndex = pointProvider.fieldNameIndex(classFieldName) idxCount, fieldList = utils.findOrCreateField(polyLayer, polyLayer.pendingFields(), fieldName) writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fieldList, polyProvider.geometryType(), polyProvider.crs()) spatialIndex = utils.createSpatialIndex(pointLayer) ftPoint = QgsFeature() outFeat = QgsFeature() geom = QgsGeometry() current = 0 hasIntersections = False features = QGisLayers.features(polyLayer) total = 100.0 / float(len(features)) for ftPoly in features: geom = ftPoly.geometry() atMap = ftPoly.attributes() classes = [] hasIntersections = False points = spatialIndex.intersects(geom.boundingBox()) if len(points) > 0: hasIntersections = True if hasIntersections: for i in points: pointLayer.featureAtId(int(i), ftPoint, True, True) tmpGeom = QgsGeometry(ftPoint.geometry()) if geom.contains(tmpGeom): clazz = ftPoint.attributes()[classFieldIndex].toString() if not clazz in classes: classes.append(clazz) outFeat.setGeometry(geom) if idxCount == len(atMap): atMap.append(QVariant(len(classes))) else: atMap[idxCount] = QVariant(len(classes)) outFeat.setAttributes(atMap) writer.addFeature(outFeat) current += 1 progress.setPercentage(current / total) del writer
def processAlgorithm(self, progress): polyLayer = QGisLayers.getObjectFromUri(self.getParameterValue(self.POLYGONS)) pointLayer = QGisLayers.getObjectFromUri(self.getParameterValue(self.POINTS)) fieldName = self.getParameterValue(self.FIELD) fieldIdx = pointLayer.fieldNameIndex(self.getParameterValue(self.WEIGHT)) polyProvider = polyLayer.dataProvider() idxCount, fieldList = utils.findOrCreateField(polyLayer, polyLayer.pendingFields(), fieldName) writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fieldList.toList(), polyProvider.geometryType(), polyProvider.crs()) spatialIndex = utils.createSpatialIndex(pointLayer) ftPoint = QgsFeature() outFeat = QgsFeature() geom = QgsGeometry() current = 0 hasIntersections = False features = QGisLayers.features(polyLayer) total = 100.0 / float(len(features)) for ftPoly in features: geom = ftPoly.geometry() attrs = ftPoly.attributes() count = 0 hasIntersections = False points = spatialIndex.intersects(geom.boundingBox()) if len(points) > 0: hasIntersections = True if hasIntersections: progress.setText(str(len(points))) for i in points: request = QgsFeatureRequest().setFilterFid(i) ftPoint = pointLayer.getFeatures(request).next() tmpGeom = QgsGeometry(ftPoint.geometry()) if geom.contains(tmpGeom): weight = str(ftPoint.attributes()[fieldIdx]) try: count += float(weight) except: pass #ignore fields with non-numeric values outFeat.setGeometry(geom) if idxCount == len(attrs): attrs.append(count) else: attrs[idxCount] = count outFeat.setAttributes(attrs) writer.addFeature(outFeat) current += 1 progress.setPercentage(int(current * total)) del writer
def processAlgorithm(self, progress): polyLayer = QGisLayers.getObjectFromUri(self.getParameterValue(self.POLYGONS)) pointLayer = QGisLayers.getObjectFromUri(self.getParameterValue(self.POINTS)) fieldName = self.getParameterValue(self.FIELD) classFieldName = self.getParameterValue(self.CLASSFIELD) polyProvider = polyLayer.dataProvider() classFieldIndex = pointLayer.fieldNameIndex(classFieldName) idxCount, fieldList = utils.findOrCreateField(polyLayer, polyLayer.pendingFields(), fieldName) writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fieldList.toList(), polyProvider.geometryType(), polyProvider.crs()) spatialIndex = utils.createSpatialIndex(pointLayer) ftPoint = QgsFeature() outFeat = QgsFeature() geom = QgsGeometry() current = 0 hasIntersections = False features = QGisLayers.features(polyLayer) total = 100.0 / float(len(features)) for ftPoly in features: geom = ftPoly.geometry() attrs = ftPoly.attributes() classes = [] hasIntersections = False points = spatialIndex.intersects(geom.boundingBox()) if len(points) > 0: hasIntersections = True if hasIntersections: for i in points: request = QgsFeatureRequest().setFilterFid(i) ftPoint = pointLayer.getFeatures(request).next() tmpGeom = QgsGeometry(ftPoint.geometry()) if geom.contains(tmpGeom): clazz = ftPoint.attributes()[classFieldIndex] if not clazz in classes: classes.append(clazz) outFeat.setGeometry(geom) if idxCount == len(attrs): attrs.append(len(classes)) else: attrs[idxCount] = len(classes) outFeat.setAttributes(attrs) writer.addFeature(outFeat) current += 1 progress.setPercentage(current / total) del writer
def processAlgorithm(self, progress): layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT)) writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( layer.pendingFields().toList(), QGis.WKBPoint, layer.crs()) outFeat = QgsFeature() inGeom = QgsGeometry() outGeom = QgsGeometry() current = 0 features = QGisLayers.features(layer) total = 100.0 / float(len(features)) for f in features: inGeom = f.geometry() attrs = f.attributes() points = utils.extractPoints(inGeom) outFeat.setAttributes(attrs) for i in points: outFeat.setGeometry(outGeom.fromPoint(i)) writer.addFeature(outFeat) current += 1 progress.setPercentage(int(current * total)) del writer
def processAlgorithm(self, progress): filename = self.getParameterValue(self.INPUT) inputLayer = QGisLayers.getObjectFromUri(filename) method = self.getParameterValue(self.METHOD) filename = self.getParameterValue(self.INTERSECT) selectLayer = QGisLayers.getObjectFromUri(filename) oldSelection = set(inputLayer.selectedFeaturesIds()) index = spatialIndex = utils.createSpatialIndex(inputLayer) feat = QgsFeature() geom = QgsGeometry() selectedSet = [] current = 0 features = QGisLayers.features(selectLayer) total = 100.0 / float(len(features)) for f in features: geom = QgsGeometry(f.geometry()) intersects = index.intersects(geom.boundingBox()) for i in intersects: request = QgsFeatureRequest().setFilterFid(i) feat = inputLayer.getFeatures(request).next() tmpGeom = QgsGeometry(feat.geometry()) if geom.intersects(tmpGeom): selectedSet.append(feat.id()) current += 1 progress.setPercentage(int(current * total)) if method == 1: selectedSet = list(oldSelection.union(selectedSet)) elif method == 2: selectedSet = list(oldSelection.difference(selectedSet)) inputLayer.setSelectedFeatures(selectedSet) self.setOutputValue(self.OUTPUT, filename)
def processAlgorithm(self, progress): filename = self.getParameterValue(self.INPUT) layer = QGisLayers.getObjectFromUri(filename) field = self.getParameterValue(self.FIELD) method = self.getParameterValue(self.METHOD) layer.removeSelection() index = layer.fieldNameIndex(field) unique = utils.getUniqueValues(layer, index) featureCount = layer.featureCount() value = int(self.getParameterValue(self.NUMBER)) if method == 0: if value > featureCount: raise GeoAlgorithmExecutionException( "Selected number is greater that feature count. Choose lesser value and try again." ) else: if value > 100: raise GeoAlgorithmExecutionException( "Persentage can't be greater than 100. Set corrent value and try again." ) value = value / 100.0 selran = [] inFeat = QgsFeature() current = 0 total = 100.0 / float(featureCount * len(unique)) features = QGisLayers.features(layer) if not len(unique) == featureCount: for i in unique: FIDs = [] for inFeat in features: attrs = inFeat.attributes() if attrs[index] == QVariant(i): FIDs.append(inFeat.id()) current += 1 progress.setPercentage(int(current * total)) if method == 1: selValue = int(round(value * len(FIDs), 0)) else: selValue = value if selValue >= len(FIDs): selFeat = FIDs else: selFeat = random.sample(FIDs, selValue) selran.extend(selFeat) layer.setSelectedFeatures(selran) else: layer.setSelectedFeatures(range(0, featureCount)) self.setOutputValue(self.OUTPUT, filename)
def processAlgorithm(self, progress): layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT)) provider = layer.dataProvider() writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( layer.pendingFields(), QGis.WKBPoint, provider.crs() ) outFeat = QgsFeature() inGeom = QgsGeometry() outGeom = QgsGeometry() current = 0 features = QGisLayers.features(layer) total = 100.0 / float(len(features)) for inFeat in features: inGeom = inFeat.geometry() atMap = inFeat.attributes() points = utils.extractPoints(inGeom) outFeat.setAttributes(atMap) for i in points: outFeat.setGeometry(outGeom.fromPoint(i)) writer.addFeature(outFeat) current += 1 progress.setPercentage(int(current * total)) del writer
def processAlgorithm(self, progress): layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT_LAYER)) fieldName = self.getParameterValue(self.FIELD_NAME) outputFile = self.getOutputValue(self.OUTPUT) values = utils.getUniqueValues(layer, layer.fieldNameIndex(fieldName)) self.createHTML(outputFile, values) self.setOutputValue(self.TOTAL_VALUES, len(values)) self.setOutputValue(self.UNIQUE_VALUES, ";".join([unicode(v) for v in values]))
def processAlgorithm(self, progress): vlayerA = QGisLayers.getObjectFromUri(self.getParameterValue(Intersection.INPUT)) vlayerB = QGisLayers.getObjectFromUri(self.getParameterValue(Intersection.INPUT2)) vproviderA = vlayerA.dataProvider() fields = utils.combineVectorFields(vlayerA, vlayerB) writer = self.getOutputFromName(Intersection.OUTPUT).getVectorWriter(fields, vproviderA.geometryType(), vproviderA.crs() ) inFeatA = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() index = utils.createSpatialIndex(vlayerB) nElement = 0 selectionA = QGisLayers.features(vlayerA) nFeat = len(selectionA) for inFeatA in selectionA: nElement += 1 progress.setPercentage(nElement/float(nFeat) * 100) geom = QgsGeometry( inFeatA.geometry() ) atMapA = inFeatA.attributes() intersects = index.intersects( geom.boundingBox() ) for i in intersects: request = QgsFeatureRequest().setFilterFid(i) inFeatB = vlayerB.getFeatures(request).next() tmpGeom = QgsGeometry(inFeatB.geometry()) try: if geom.intersects( tmpGeom ): atMapB = inFeatB.attributes() int_geom = QgsGeometry( geom.intersection( tmpGeom ) ) if int_geom.wkbType() == 7: int_com = geom.combine( tmpGeom ) int_sym = geom.symDifference( tmpGeom ) int_geom = QgsGeometry( int_com.difference( int_sym ) ) try: outFeat.setGeometry( int_geom ) attrs = [] attrs.extend(atMapA) attrs.extend(atMapB) outFeat.setAttributes(attrs) writer.addFeature( outFeat ) except: raise GeoAlgorithmExecutionException("Feature exception while computing intersection") except: raise GeoAlgorithmExecutionException("Geometry exception while computing intersection") del writer
def processAlgorithm(self, progress): layerA = QGisLayers.getObjectFromUri(self.getParameterValue(Difference.INPUT)) layerB = QGisLayers.getObjectFromUri(self.getParameterValue(Difference.OVERLAY)) GEOS_EXCEPT = True FEATURE_EXCEPT = True writer = self.getOutputFromName(Difference.OUTPUT).getVectorWriter(layerA.pendingFields(), layerA.dataProvider().geometryType(), layerA.dataProvider().crs()) inFeatA = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() index = utils.createSpatialIndex(layerB) selectionA = QGisLayers.features(layerA) current = 0 total = 100.0 / float(len(selectionA)) for inFeatA in selectionA: add = True geom = QgsGeometry(inFeatA.geometry()) diff_geom = QgsGeometry(geom) attrs = inFeatA.attributes() intersections = index.intersects(geom.boundingBox()) for i in intersections: request = QgsFeatureRequest().setFilterFid(i) inFeatB = layerB.getFeatures(request).next() tmpGeom = QgsGeometry(inFeatB.geometry()) try: if diff_geom.intersects(tmpGeom): diff_geom = QgsGeometry(diff_geom.difference(tmpGeom)) except: GEOS_EXCEPT = False add = False break if add: try: outFeat.setGeometry(diff_geom) outFeat.setAttributes(attrs) writer.addFeature(outFeat) except: FEATURE_EXCEPT = False continue current += 1 progress.setPercentage(int(current * total)) del writer if not GEOS_EXCEPT: SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Geometry exception while computing difference") if not FEATURE_EXCEPT: SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Feature exception while computing difference")
def processAlgorithm(self, progress): vlayerA = QGisLayers.getObjectFromUri(self.getParameterValue(Intersection.INPUT)) vlayerB = QGisLayers.getObjectFromUri(self.getParameterValue(Intersection.INPUT2)) vproviderA = vlayerA.dataProvider() fields = utils.combineVectorFields(vlayerA, vlayerB) writer = self.getOutputFromName(Intersection.OUTPUT).getVectorWriter(fields, vproviderA.geometryType(), vproviderA.crs() ) inFeatA = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() index = utils.createSpatialIndex(vlayerB) nElement = 0 selectionA = QGisLayers.features(vlayerA) nFeat = len(selectionA) for inFeatA in selectionA: nElement += 1 progress.setPercentage(nElement/float(nFeat) * 100) geom = QgsGeometry( inFeatA.geometry() ) atMapA = inFeatA.attributes() intersects = index.intersects( geom.boundingBox() ) for id in intersects: vlayerB.featureAtId( int( id ), inFeatB , True) tmpGeom = QgsGeometry( inFeatB.geometry() ) try: if geom.intersects( tmpGeom ): atMapB = inFeatB.attributes() int_geom = QgsGeometry( geom.intersection( tmpGeom ) ) if int_geom.wkbType() == 7: int_com = geom.combine( tmpGeom ) int_sym = geom.symDifference( tmpGeom ) int_geom = QgsGeometry( int_com.difference( int_sym ) ) try: outFeat.setGeometry( int_geom ) attrs = [] attrs.extend(atMapA) attrs.extend(atMapB) outFeat.setAttributes(attrs) writer.addFeature( outFeat ) except: raise GeoAlgorithmExecutionException("Feature exception while computing intersection") except: raise GeoAlgorithmExecutionException("Geometry exception while computing intersection") del writer
def processAlgorithm(self, progress): filename = self.getParameterValue(self.INPUT) inputLayer = QGisLayers.getObjectFromUri(filename) method = self.getParameterValue(self.METHOD) selection = self.getParameterValue(self.USE_SELECTED) filename = self.getParameterValue(self.INTERSECT) selectLayer = QGisLayers.getObjectFromUri(filename) inputProvider = inputLayer.dataProvider() selectProvider = selectLayer.dataProvider() index = utils.createSpatialIndex(inputLayer) inputProvider.select() selectProvider.select() feat = QgsFeature() infeat = QgsFeature() geom = QgsGeometry() selectedSet = [] if selection: features = selectLayer.selectedFeatures() total = 100.0 / float(len(features)) current = 0 for feat in features: geom = QgsGeometry(feat.geometry()) intersects = index.intersects(geom.boundingBox()) for i in intersects: inputProvider.featureAtId(i, infeat, True) tmpGeom = QgsGeometry(infeat.geometry()) if geom.intersects(tmpGeom): selectedSet.append(infeat.id()) current += 1 progress.setPercentage(int(current * total)) else: total = 100.0 / float(selectProvider.featureCount()) current = 0 while selectProvider.nextFeature(feat): geom = QgsGeometry(feat.geometry()) intersects = index.intersects(geom.boundingBox()) for i in intersects: inputProvider.featureAtId(i, infeat, True) tmpGeom = QgsGeometry(infeat.geometry()) if geom.intersects(tmpGeom): selectedSet.append(infeat.id()) current += 1 progress.setPercentage(int(current * total)) if method == 1: selectedSet = list(set(inputLayer.selectedFeaturesIds()).union(selectedSet)) elif method == 2: selectedSet = list(set(inputLayer.selectedFeaturesIds()).difference(selectedSet)) inputLayer.setSelectedFeatures(selectedSet) self.setOutputValue(self.OUTPUT, filename)
def processAlgorithm(self, progress): layer = QGisLayers.getObjectFromUri(self.getParameterValue( self.POINTS)) weightField = self.getParameterValue(self.WEIGHT) uniqueField = self.getParameterValue(self.UID) weightIndex = layer.fieldNameIndex(weightField) uniqueIndex = layer.fieldNameIndex(uniqueField) fieldList = [ QgsField("MEAN_X", QVariant.Double, "", 24, 15), QgsField("MEAN_Y", QVariant.Double, "", 24, 15), QgsField("UID", QVariant.String, "", 255) ] writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( fieldList, QGis.WKBPoint, layer.crs()) current = 0 features = QGisLayers.features(layer) total = 100.0 / float(len(features)) means = {} for feat in features: current += 1 progress.setPercentage(current * total) clazz = str(feat.attributes()[uniqueIndex]).strip() if weightIndex == -1: weight = 1.00 else: try: weight = float(feat.attributes()[weightIndex]) except: weight = 1.00 if clazz not in means: means[clazz] = (0, 0, 0) cx, cy, totalweight = means[clazz] geom = QgsGeometry(feat.geometry()) geom = utils.extractPoints(geom) for i in geom: cx += i.x() * weight cy += i.y() * weight totalweight += weight means[clazz] = (cx, cy, totalweight) for clazz, values in means.iteritems(): outFeat = QgsFeature() cx = values[0] / values[2] cy = values[1] / values[2] meanPoint = QgsPoint(cx, cy) outFeat.setGeometry(QgsGeometry.fromPoint(meanPoint)) outFeat.setAttributes([cx, cy, clazz]) writer.addFeature(outFeat) del writer
def linearMatrix(self, inLayer, inField, targetLayer, targetField, matType, nPoints, progress): if matType == 0: self.writer.writerow(["InputID", "TargetID", "Distance"]) else: self.writer.writerow(["InputID", "MEAN", "STDDEV", "MIN", "MAX"]) index = utils.createSpatialIndex(targetLayer) inIdx = inLayer.fieldNameIndex(inField) inLayer.select([inIdx]) outIdx = targetLayer.fieldNameIndex(inField) outFeat = QgsFeature() inGeom = QgsGeometry() outGeom = QgsGeometry() distArea = QgsDistanceArea() features = QGisLayers.features(inLayer) current = 0 total = 100.0 / float(len(features)) for inFeat in features: inGeom = inFeat.geometry() inID = inFeat.attributes()[inIdx].toString() featList = index.nearestNeighbor(inGeom.asPoint(), nPoints) distList = [] vari = 0.0 for i in featList: request = QgsFeatureRequest().setFilterFid(i) outFeat = targetLayer.getFeatures(request).next() outID = outFeat.attributes()[outIdx].toString() outGeom = outFeat.geometry() dist = distArea.measureLine(inGeom.asPoint(), outGeom.asPoint()) if matType == 0: self.writer.writerow( [unicode(inID), unicode(outID), unicode(dist)]) else: distList.append(float(dist)) if matType == 2: mean = sum(distList) / len(distList) for i in distList: vari += (i - mean) * (i - mean) vari = math.sqrt(vari / len(distList)) self.writer.writerow([ unicode(inID), unicode(mean), unicode(vari), unicode(min(distList)), unicode(max(distList)) ]) current += 1 progress.setPercentage(int(current * total))
def processAlgorithm(self, progress): vlayerA = QGisLayers.getObjectFromUri(self.getParameterValue(Difference.INPUT)) vlayerB = QGisLayers.getObjectFromUri(self.getParameterValue(Difference.INPUT2)) GEOS_EXCEPT = True FEATURE_EXCEPT = True vproviderA = vlayerA.dataProvider() vproviderB = vlayerB.dataProvider() fields = vproviderA.fields() # check for crs compatibility crsA = vproviderA.crs() crsB = vproviderB.crs() if not crsA.isValid() or not crsB.isValid(): SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Difference. Invalid CRS. Results might be unexpected") else: if crsA != crsB: SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Difference. Non-matching CRSs. Results might be unexpected") writer = self.getOutputFromName(Difference.OUTPUT).getVectorWriter(fields, vproviderA.geometryType(), vproviderA.crs() ) inFeatA = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() index = utils.createSpatialIndex(vlayerB) nElement = 0 selectionA = QGisLayers.features(vlayerA) nFeat = len(selectionA) for inFeatA in selectionA: nElement += 1 progress.setPercentage(nElement/float(nFeat) * 100) add = True geom = QgsGeometry( inFeatA.geometry() ) diff_geom = QgsGeometry( geom ) atMap = inFeatA.attributes() intersects = index.intersects( geom.boundingBox() ) for id in intersects: vlayerB.featureAtId( int( id ), inFeatB , True) tmpGeom = QgsGeometry( inFeatB.geometry() ) try: if diff_geom.intersects( tmpGeom ): diff_geom = QgsGeometry( diff_geom.difference( tmpGeom ) ) except: GEOS_EXCEPT = False add = False break if add: try: outFeat.setGeometry( diff_geom ) outFeat.setAttributes( atMap ) writer.addFeature( outFeat ) except: FEATURE_EXCEPT = False continue del writer if not GEOS_EXCEPT: SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Geometry exception while computing difference") if not FEATURE_EXCEPT: SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Feature exception while computing difference")
def processAlgorithm(self, progress): layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.POINTS)) weightField = self.getParameterValue(self.WEIGHT) uniqueField = self.getParameterValue(self.UID) weightIndex = layer.fieldNameIndex(weightField) uniqueIndex = layer.fieldNameIndex(uniqueField) fieldList = [QgsField("MEAN_X", QVariant.Double, "", 24, 15), QgsField("MEAN_Y", QVariant.Double, "", 24, 15), QgsField("UID", QVariant.String, "", 255) ] writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fieldList, QGis.WKBPoint, layer.crs()) current = 0 features = QGisLayers.features(layer) total = 100.0 / float(len(features)) means = {} for feat in features: current += 1 progress.setPercentage(current * total) clazz = str(feat.attributes()[uniqueIndex]).strip() if weightIndex == -1: weight = 1.00 else: try: weight = float(feat.attributes()[weightIndex]) except: weight = 1.00 if clazz not in means: means[clazz] = (0,0,0) cx,cy, totalweight = means[clazz] geom = QgsGeometry(feat.geometry()) geom = utils.extractPoints(geom) for i in geom: cx += i.x() * weight cy += i.y() * weight totalweight += weight means[clazz] = (cx, cy, totalweight) for clazz, values in means.iteritems(): outFeat = QgsFeature() cx = values[0] / values[2] cy = values[1] / values[2] meanPoint = QgsPoint(cx, cy) outFeat.setGeometry(QgsGeometry.fromPoint(meanPoint)) outFeat.setAttributes([cx, cy, clazz]) writer.addFeature(outFeat) del writer
def processAlgorithm(self, progress): filename = self.getParameterValue(self.INPUT) layer = QGisLayers.getObjectFromUri(filename) field = self.getParameterValue(self.FIELD) method = self.getParameterValue(self.METHOD) layer.removeSelection() index = layer.fieldNameIndex(field) unique = utils.getUniqueValues(layer, index) featureCount = layer.featureCount() value = int(self.getParameterValue(self.NUMBER)) if method == 0: if value > featureCount: raise GeoAlgorithmExecutionException("Selected number is greater that feature count. Choose lesser value and try again.") else: if value > 100: raise GeoAlgorithmExecutionException("Persentage can't be greater than 100. Set corrent value and try again.") value = value / 100.0 selran = [] inFeat = QgsFeature() current = 0 total = 100.0 / float(featureCount * len(unique)) features = QGisLayers.features(layer) if not len(unique) == featureCount: for i in unique: FIDs= [] for inFeat in features: attrs = inFeat.attributes() if attrs[index] == QVariant(i): FIDs.append(inFeat.id()) current += 1 progress.setPercentage(int(current * total)) if method == 1: selValue = int(round(value * len(FIDs), 0)) else: selValue = value if selValue >= len(FIDs): selFeat = FIDs else: selFeat = random.sample(FIDs, selValue) selran.extend(selFeat) layer.setSelectedFeatures(selran) else: layer.setSelectedFeatures(range(0, featureCount)) self.setOutputValue(self.OUTPUT, filename)
def processAlgorithm(self, progress): layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT)) output = self.getOutputValue(self.OUTPUT) fieldName = self.getParameterValue(self.FIELD) provider = layer.dataProvider() allAttrs = layer.pendingAllAttributesList() layer.select(allAttrs) geomType = self.singleToMultiGeom(provider.geometryType()) writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.pendingFields(), geomType, provider.crs()) inFeat = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() outGeom = QgsGeometry() index = layer.fieldNameIndex(fieldName) unique = utils.getUniqueValues(layer, index) current = 0 features = QGisLayers.features(layer) total = 100.0 / float(len(features) * len(unique)) if not len(unique) == layer.featureCount(): for i in unique: #provider.rewind() multi_feature= [] first = True layer.select(allAttrs) features = QGisLayers.features(layer) for inFeat in features: atMap = inFeat.attributes() idVar = atMap[index] if idVar.toString().trimmed() == i.toString().trimmed(): if first: attrs = atMap print attrs first = False inGeom = QgsGeometry(inFeat.geometry()) vType = inGeom.type() feature_list = self.extractAsMulti(inGeom) multi_feature.extend(feature_list) current += 1 progress.setPercentage(int(current * total)) outFeat.setAttributes(attrs) outGeom = QgsGeometry(self.convertGeometry(multi_feature, vType)) outFeat.setGeometry(outGeom) writer.addFeature(outFeat) del writer else: raise GeoAlgorithmExecutionException("Invalid unique ID field")
def processAlgorithm(self, progress): layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT)) output = self.getOutputValue(self.OUTPUT) fieldName = self.getParameterValue(self.FIELD) geomType = self.singleToMultiGeom(layer.dataProvider().geometryType()) writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( layer.pendingFields().toList(), geomType, layer.crs()) inFeat = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() outGeom = QgsGeometry() index = layer.fieldNameIndex(fieldName) unique = utils.getUniqueValues(layer, index) current = 0 features = QGisLayers.features(layer) total = 100.0 / float(len(features) * len(unique)) if not len(unique) == layer.featureCount(): for i in unique: multi_feature = [] first = True features = QGisLayers.features(layer) for inFeat in features: atMap = inFeat.attributes() idVar = atMap[index] if idVar.toString().trimmed() == i.toString().trimmed(): if first: attrs = atMap print attrs first = False inGeom = QgsGeometry(inFeat.geometry()) vType = inGeom.type() feature_list = self.extractAsMulti(inGeom) multi_feature.extend(feature_list) current += 1 progress.setPercentage(int(current * total)) outFeat.setAttributes(attrs) outGeom = QgsGeometry( self.convertGeometry(multi_feature, vType)) outFeat.setGeometry(outGeom) writer.addFeature(outFeat) del writer else: raise GeoAlgorithmExecutionException("Invalid unique ID field")
def processAlgorithm(self, progress): layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.POINTS)) output = self.getOutputValue(self.OUTPUT) provider = layer.dataProvider() spatialIndex = utils.createSpatialIndex(provider) provider.rewind() provider.select() feat = QgsFeature() neighbour = QgsFeature() distance = QgsDistanceArea() sumDist = 0.00 A = layer.extent() A = float(A.width() * A.height()) current = 0 total = 100.0 / float(provider.featureCount()) while provider.nextFeature( feat ): neighbourID = spatialIndex.nearestNeighbor(feat.geometry().asPoint(), 2)[1] provider.featureAtId(neighbourID, neighbour, True) sumDist += distance.measureLine(neighbour.geometry().asPoint(), feat.geometry().asPoint()) current += 1 progress.setPercentage(int(current * total)) count = provider.featureCount() do = float(sumDist) / count de = float(0.5 / math.sqrt(count / A)) d = float(do / de) SE = float(0.26136 / math.sqrt(( count ** 2) / A)) zscore = float((do - de) / SE) data = [] data.append("Observed mean distance: " + unicode(do)) data.append("Expected mean distance: " + unicode(de)) data.append("Nearest neighbour index: " + unicode(d)) data.append("Number of points: " + unicode(count)) data.append("Z-Score: " + unicode(zscore)) self.createHTML(output, data) self.setOutputValue(self.OBSERVED_MD, float( data[ 0 ].split( ": " )[ 1 ] ) ) self.setOutputValue(self.EXPECTED_MD, float( data[ 1 ].split( ": " )[ 1 ] ) ) self.setOutputValue(self.NN_INDEX, float( data[ 2 ].split( ": " )[ 1 ] ) ) self.setOutputValue(self.POINT_COUNT, float( data[ 3 ].split( ": " )[ 1 ] ) ) self.setOutputValue(self.Z_SCORE, float( data[ 4 ].split( ": " )[ 1 ] ) )
def processAlgorithm(self, progress): layer = QGisLayers.getObjectFromUri(self.getParameterValue( self.POINTS)) output = self.getOutputValue(self.OUTPUT) spatialIndex = utils.createSpatialIndex(layer) neighbour = QgsFeature() distance = QgsDistanceArea() sumDist = 0.00 A = layer.extent() A = float(A.width() * A.height()) current = 0 features = QGisLayers.features(layer) count = len(features) total = 100.0 / float(len(features)) for feat in features: neighbourID = spatialIndex.nearestNeighbor( feat.geometry().asPoint(), 2)[1] request = QgsFeatureRequest().setFilterFid(neighbourID) neighbour = layer.getFeatures(request).next() sumDist += distance.measureLine(neighbour.geometry().asPoint(), feat.geometry().asPoint()) current += 1 progress.setPercentage(int(current * total)) do = float(sumDist) / count de = float(0.5 / math.sqrt(count / A)) d = float(do / de) SE = float(0.26136 / math.sqrt((count**2) / A)) zscore = float((do - de) / SE) data = [] data.append("Observed mean distance: " + unicode(do)) data.append("Expected mean distance: " + unicode(de)) data.append("Nearest neighbour index: " + unicode(d)) data.append("Number of points: " + unicode(count)) data.append("Z-Score: " + unicode(zscore)) self.createHTML(output, data) self.setOutputValue(self.OBSERVED_MD, float(data[0].split(": ")[1])) self.setOutputValue(self.EXPECTED_MD, float(data[1].split(": ")[1])) self.setOutputValue(self.NN_INDEX, float(data[2].split(": ")[1])) self.setOutputValue(self.POINT_COUNT, float(data[3].split(": ")[1])) self.setOutputValue(self.Z_SCORE, float(data[4].split(": ")[1]))
def linearMatrix(self, inLayer, inField, targetLayer, targetField, matType, nPoints, progress): if matType == 0: self.writer.writerow(["InputID", "TargetID", "Distance"]) else: self.writer.writerow(["InputID", "MEAN", "STDDEV", "MIN", "MAX"]) index = utils.createSpatialIndex(targetLayer); inIdx = inLayer.fieldNameIndex(inField) inLayer.select([inIdx]) outIdx = targetLayer.fieldNameIndex(inField) outFeat = QgsFeature() inGeom = QgsGeometry() outGeom = QgsGeometry() distArea = QgsDistanceArea() features = QGisLayers.features(inLayer) current = 0 total = 100.0 / float(len(features)) for inFeat in features: inGeom = inFeat.geometry() inID = inFeat.attributes()[inIdx].toString() featList = index.nearestNeighbor(inGeom.asPoint(), nPoints) distList = [] vari = 0.0 for i in featList: request = QgsFeatureRequest().setFilterFid(i) outFeat = targetLayer.getFeatures(request).next() outID = outFeat.attributes()[outIdx].toString() outGeom = outFeat.geometry() dist = distArea.measureLine(inGeom.asPoint(), outGeom.asPoint()) if matType == 0: self.writer.writerow([unicode(inID), unicode(outID), unicode(dist)]) else: distList.append(float(dist)) if matType == 2: mean = sum(distList) / len(distList) for i in distList: vari += (i - mean) * (i - mean) vari = math.sqrt(vari / len(distList)) self.writer.writerow([unicode(inID), unicode(mean), unicode(vari), unicode(min(distList)), unicode(max(distList))]) current += 1 progress.setPercentage(int(current * total))
def regularMatrix(self, inLayer, inField, targetLayer, targetField, nPoints, progress): index = utils.createSpatialIndex(targetLayer) inIdx = inLayer.fieldNameIndex(inField) outIdx = targetLayer.fieldNameIndex(inField) outFeat = QgsFeature() inGeom = QgsGeometry() outGeom = QgsGeometry() distArea = QgsDistanceArea() first = True current = 0 features = QGisLayers.features(inLayer) total = 100.0 / float(features) for inFeat in features: inGeom = inFeat.geometry() inID = inFeat.attributes()[inIdx].toString() if first: featList = index.nearestNeighbor(inGeom.asPoint(), nPoints) first = False data = ["ID"] for i in featList: request = QgsFeatureRequest().setFilterFid(i) outFeat = targetLayer.getFeatures(request).next() data.append(unicode(outFeat.attributes[outIdx].toString())) self.writer.writerow(data) data = [unicode(inID)] for i in featList: request = QgsFeatureRequest().setFilterFid(i) outFeat = targetLayer.getFeatures(request).next() outGeom = outFeat.geometry() dist = distArea.measureLine(inGeom.asPoint(), outGeom.asPoint()) data.append(unicode(float(dist))) self.writer.writerow(data) current += 1 progress.setPercentage(int(current * total))
def regularMatrix(self, inLayer, inField, targetLayer, targetField, nPoints, progress): index = utils.createSpatialIndex(targetLayer) inIdx = inLayer.fieldNameIndex(inField) outIdx = targetLayer.fieldNameIndex(inField) outFeat = QgsFeature() inGeom = QgsGeometry() outGeom = QgsGeometry() distArea = QgsDistanceArea() first = True current = 0 features = QGisLayers.features(inLayer) total = 100.0 / float(len(features)) for inFeat in features: inGeom = inFeat.geometry() inID = inFeat.attributes()[inIdx].toString() if first: featList = index.nearestNeighbor(inGeom.asPoint(), nPoints) first = False data = ["ID"] for i in featList: request = QgsFeatureRequest().setFilterFid(i) outFeat = targetLayer.getFeatures(request).next() data.append(unicode(outFeat.attributes[outIdx].toString())) self.writer.writerow(data) data = [unicode(inID)] for i in featList: request = QgsFeatureRequest().setFilterFid(i) outFeat = targetLayer.getFeatures(request).next() outGeom = outFeat.geometry() dist = distArea.measureLine(inGeom.asPoint(), outGeom.asPoint()) data.append(unicode(float(dist))) self.writer.writerow(data) current += 1 progress.setPercentage(int(current * total))
def processAlgorithm(self, progress): layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT_LAYER)) fieldName = self.getParameterValue(self.FIELD_NAME) outputFile = self.getOutputValue(self.OUTPUT_HTML_FILE) index = layer.fieldNameIndex(fieldName) cvValue = 0 minValue = 0 maxValue = 0 sumValue = 0 meanValue = 0 medianValue = 0 stdDevValue = 0 isFirst = True values = [] features = QGisLayers.features(layer) count = len(features) total = 100.0 / float(count) current = 0 for ft in features: value = float(ft.attributes()[index].toDouble()[0]) if isFirst: minValue = value maxValue = value isFirst = False else: if value < minValue: minValue = value if value > maxValue: maxValue = value values.append( value ) sumValue += value current += 1 progress.setPercentage(int(current * total)) # calculate additional values rValue = maxValue - minValue uniqueValue = utils.getUniqueValuesCount(layer, index) if count > 0: meanValue = sumValue / count if meanValue != 0.00: for v in values: stdDevValue += ((v - meanValue) * (v - meanValue)) stdDevValue = math.sqrt(stdDevValue / count) cvValue = stdDevValue / meanValue if count > 1: tmp = values tmp.sort() # calculate median if (count % 2) == 0: medianValue = 0.5 * (tmp[(count - 1) / 2] + tmp[count / 2]) else: medianValue = tmp[(count + 1) / 2 - 1] data = [] data.append("Count: " + unicode(count)) data.append("Unique values: " + unicode(uniqueValue)) data.append("Minimum value: " + unicode(minValue)) data.append("Maximum value: " + unicode(maxValue)) data.append("Range: " + unicode(rValue)) data.append("Sum: " + unicode(sumValue)) data.append("Mean value: " + unicode(meanValue)) data.append("Median value: " + unicode(medianValue)) data.append("Standard deviation: " + unicode(stdDevValue)) data.append("Coefficient of Variation: " + unicode(cvValue)) self.createHTML(outputFile, data) self.setOutputValue(self.COUNT, count) self.setOutputValue(self.UNIQUE, uniqueValue) self.setOutputValue(self.MIN, minValue) self.setOutputValue(self.MAX, maxValue) self.setOutputValue(self.RANGE, rValue) self.setOutputValue(self.SUM, sumValue) self.setOutputValue(self.MEAN, meanValue) self.setOutputValue(self.MEDIAN, medianValue) self.setOutputValue(self.STD_DEV, stdDevValue) self.setOutputValue(self.CV, cvValue)
def processAlgorithm(self, progress): useField = (self.getParameterValue(ConvexHull.METHOD) == 1) field = self.getParameterValue(ConvexHull.FIELD) vlayerA = QGisLayers.getObjectFromUri(self.getParameterValue(ConvexHull.INPUT)) GEOS_EXCEPT = True FEATURE_EXCEPT = True vproviderA = vlayerA.dataProvider() #allAttrsA = vproviderA.attributeIndexes() #vproviderA.select(allAttrsA) fields = [QgsField("ID", QVariant.Int), QgsField("Area", QVariant.Double), QgsField("Perim", QVariant.Double)] writer = self.getOutputFromName(ConvexHull.OUTPUT).getVectorWriter(fields, QGis.WKBPolygon, vproviderA.crs()) inFeat = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() outGeom = QgsGeometry() nElement = 0 index = vproviderA.fieldNameIndex(field) features = QGisLayers.features(vlayerA) nFeat = len(features) if useField: unique = utils.getUniqueValues(vproviderA, index) nFeat = nFeat * len(unique) for i in unique: hull = [] first = True outID = 0 #vproviderA.select(allAttrsA) features = QGisLayers.features(vlayerA) for inFeat in features: atMap = inFeat.attributes() idVar = atMap[ index ] if idVar.toString().trimmed() == i.toString().trimmed(): if first: outID = idVar first = False inGeom = QgsGeometry(inFeat.geometry()) points = utils.extractPoints(inGeom) hull.extend(points) nElement += 1 progress.setPercentage(int(nElement / nFeat * 100)) if len(hull) >= 3: tmpGeom = QgsGeometry(outGeom.fromMultiPoint(hull)) try: outGeom = tmpGeom.convexHull() outFeat.setGeometry(outGeom) (area, perim) = self.simpleMeasure(outGeom) outFeat.addAttribute(0, QVariant(outID)) outFeat.addAttribute(1, QVariant(area)) outFeat.addAttribute(2, QVariant(perim)) writer.addFeature(outFeat) except: GEOS_EXCEPT = False continue else: hull = [] #vproviderA.select(allAttrsA) features = QGisLayers.features(vlayerA) for inFeat in features: inGeom = QgsGeometry(inFeat.geometry()) points = utils.extractPoints(inGeom) hull.extend(points) nElement += 1 progress.setPercentage(int(nElement / nFeat * 100)) tmpGeom = QgsGeometry(outGeom.fromMultiPoint(hull)) try: outGeom = tmpGeom.convexHull() outFeat.setGeometry(outGeom) (area, perim) = self.simpleMeasure(outGeom) #outFeat.addAttribute(0, QVariant("1")) #outFeat.addAttribute(1, QVariant(area)) #outFeat.addAttribute(2, QVariant(perim)) writer.addFeature(outFeat) except: GEOS_EXCEPT = False del writer if not GEOS_EXCEPT: SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Geometry exception while computing convex hull") if not FEATURE_EXCEPT: SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Feature exception while computing convex hull")
def processAlgorithm(self, progress): vlayerA = QGisLayers.getObjectFromUri(self.getParameterValue(Union.INPUT)) vlayerB = QGisLayers.getObjectFromUri(self.getParameterValue(Union.INPUT2)) GEOS_EXCEPT = True FEATURE_EXCEPT = True vproviderA = vlayerA.dataProvider() fields = utils.combineVectorFields(vlayerA, vlayerB ) names = [field.name() for field in fields] SextanteLog.addToLog(SextanteLog.LOG_INFO, str(names)) writer = self.getOutputFromName(Union.OUTPUT).getVectorWriter(fields, vproviderA.geometryType(), vproviderA.crs() ) inFeatA = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() indexA = utils.createSpatialIndex(vlayerB) indexB = utils.createSpatialIndex(vlayerA) count = 0 nElement = 0 featuresA = QGisLayers.features(vlayerA) nFeat = len(featuresA) for inFeatA in featuresA: progress.setPercentage(nElement/float(nFeat) * 50) nElement += 1 found = False geom = QgsGeometry( inFeatA.geometry() ) diff_geom = QgsGeometry( geom ) atMapA = inFeatA.attributes() intersects = indexA.intersects( geom.boundingBox() ) if len( intersects ) < 1: try: outFeat.setGeometry( geom ) outFeat.setAttributes( atMapA ) writer.addFeature( outFeat ) except: # this really shouldn't happen, as we # haven't edited the input geom at all raise GeoAlgorithmExecutionException("Feature exception while computing union") else: for id in intersects: count += 1 request = QgsFeatureRequest().setFilterFid(id) inFeatB = vlayerB.getFeatures(request).next() atMapB = inFeatB.attributes() tmpGeom = QgsGeometry( inFeatB.geometry() ) if geom.intersects( tmpGeom ): found = True int_geom = geom.intersection( tmpGeom ) if int_geom is None: # There was a problem creating the intersection raise GeoAlgorithmExecutionException("Geometry exception while computing intersection") else: int_geom = QgsGeometry(int_geom) if diff_geom.intersects( tmpGeom ): diff_geom = diff_geom.difference( tmpGeom ) if diff_geom is None: # It's possible there was an error here? diff_geom = QgsGeometry() else: diff_geom = QgsGeometry(diff_geom) if int_geom.wkbType() == 0: # intersection produced different geomety types temp_list = int_geom.asGeometryCollection() for i in temp_list: if i.type() == geom.type(): int_geom = QgsGeometry( i ) try: outFeat.setGeometry( int_geom ) attrs = [] attrs.extend(atMapA) attrs.extend(atMapB) outFeat.setAttributes(attrs) writer.addFeature( outFeat ) except Exception, err: raise GeoAlgorithmExecutionException("Feature exception while computing union") else: # this only happends if the bounding box # intersects, but the geometry doesn't try: outFeat.setGeometry( geom ) outFeat.setAttributes( atMapA ) writer.addFeature( outFeat ) except: # also shoudn't ever happen raise GeoAlgorithmExecutionException("Feature exception while computing union") if found: try: if diff_geom.wkbType() == 0: temp_list = diff_geom.asGeometryCollection() for i in temp_list: if i.type() == geom.type(): diff_geom = QgsGeometry( i ) outFeat.setGeometry( diff_geom ) outFeat.setAttributes( atMapA ) writer.addFeature( outFeat ) except Exception, err: raise GeoAlgorithmExecutionException("Feature exception while computing union")
def processAlgorithm(self, progress): layerA = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT_A)) layerB = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT_B)) fieldA = self.getParameterValue(self.FIELD_A) fieldB = self.getParameterValue(self.FIELD_B) idxA = layerA.fieldNameIndex(fieldA) idxB = layerB.fieldNameIndex(fieldB) fieldList = [layerA.pendingFields()[idxA], layerB.pendingFields()[idxB] ] writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fieldList, QGis.WKBPoint, layerA.dataProvider().crs()) spatialIndex = utils.createSpatialIndex(layerB) inFeatA = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() tmpGeom = QgsGeometry() features = QGisLayers.features(layerA) current = 0 total = 100.0 / float(len(features)) hasIntersections = False for inFeatA in features: inGeom = inFeatA.geometry() hasIntersections = False lines = spatialIndex.intersects(inGeom.boundingBox()) if len(lines) > 0: hasIntersections = True if hasIntersections: for i in lines: request = QgsFeatureRequest().setFilterFid(i) inFeatB = layerB.getFeatures(request).next() tmpGeom = QgsGeometry(inFeatB.geometry()) points = [] attrsA = inFeatA.attributes() attrsB = inFeatB.attributes() if inGeom.intersects(tmpGeom): tempGeom = inGeom.intersection(tmpGeom) if tempGeom.type() == QGis.Point: if tempGeom.isMultipart(): points = tempGeom.asMultiPoint() else: points.append(tempGeom.asPoint()) for j in points: outFeat.setGeometry(tempGeom.fromPoint(j)) outFeat.setAttributes([attrsA[idxA], attrsB[idxB]]) writer.addFeature(outFeat) current += 1 progress.setPercentage(int(current * total)) del writer
def processAlgorithm(self, progress): useField = (self.getParameterValue(ConvexHull.METHOD) == 1) fieldName = self.getParameterValue(ConvexHull.FIELD) layer = QGisLayers.getObjectFromUri( self.getParameterValue(ConvexHull.INPUT)) GEOS_EXCEPT = True FEATURE_EXCEPT = True index = layer.fieldNameIndex(fieldName) fType = layer.pendingFields()[index].type() f = QgsField("value") f.setType(QVariant.String) f.setLength(255) if useField: if fType == QVariant.Int: f.setType(QVariant.Int) f.setLength(20) elif fType == QVariant.Double: f.setType(QVariant.Double) f.setLength(20) f.setPrecision(6) else: f.setType(QVariant.String) f.setLength(255) fields = [ QgsField("id", QVariant.Int, "", 20), f, QgsField("area", QVariant.Double, "", 20, 6), QgsField("perim", QVariant.Double, "", 20, 6) ] writer = self.getOutputFromName(ConvexHull.OUTPUT).getVectorWriter( fields, QGis.WKBPolygon, layer.dataProvider().crs()) outFeat = QgsFeature() inGeom = QgsGeometry() outGeom = QgsGeometry() current = 0 fid = 0 val = "" if useField: unique = layer.uniqueValues(index) total = 100.0 / float(layer.featureCount() * len(unique)) for i in unique: hull = [] first = True features = QGisLayers.features(layer) for f in features: idVar = f[fieldName] if idVar.toString().trimmed() == i.toString().trimmed(): if first: val = idVar first = False inGeom = QgsGeometry(f.geometry()) points = utils.extractPoints(inGeom) hull.extend(points) current += 1 progress.setPercentage(int(current * total)) if len(hull) >= 3: tmpGeom = QgsGeometry(outGeom.fromMultiPoint(hull)) try: outGeom = tmpGeom.convexHull() (area, perim) = utils.simpleMeasure(outGeom) outFeat.setGeometry(outGeom) outFeat.setAttributes([ QVariant(fid), QVariant(val), QVariant(area), QVariant(perim) ]) writer.addFeature(outFeat) except: GEOS_EXCEPT = False continue fid += 1 else: hull = [] total = 100.0 / float(layer.featureCount()) features = QGisLayers.features(layer) for f in features: inGeom = QgsGeometry(f.geometry()) points = utils.extractPoints(inGeom) hull.extend(points) current += 1 progress.setPercentage(int(current * total)) tmpGeom = QgsGeometry(outGeom.fromMultiPoint(hull)) try: outGeom = tmpGeom.convexHull() (area, perim) = utils.simpleMeasure(outGeom) outFeat.setGeometry(outGeom) outFeat.setAttributes([ QVariant(0), QVariant("all"), QVariant(area), QVariant(perim) ]) writer.addFeature(outFeat) except: GEOS_EXCEPT = False del writer if not GEOS_EXCEPT: SextanteLog.addToLog( SextanteLog.LOG_WARNING, "Geometry exception while computing convex hull") if not FEATURE_EXCEPT: SextanteLog.addToLog( SextanteLog.LOG_WARNING, "Feature exception while computing convex hull")
def processAlgorithm(self, progress): polyLayer = QGisLayers.getObjectFromUri( self.getParameterValue(self.POLYGONS)) pointLayer = QGisLayers.getObjectFromUri( self.getParameterValue(self.POINTS)) fieldName = self.getParameterValue(self.FIELD) classFieldName = self.getParameterValue(self.CLASSFIELD) polyProvider = polyLayer.dataProvider() classFieldIndex = pointLayer.fieldNameIndex(classFieldName) idxCount, fieldList = utils.findOrCreateField( polyLayer, polyLayer.pendingFields(), fieldName) writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( fieldList.toList(), polyProvider.geometryType(), polyProvider.crs()) spatialIndex = utils.createSpatialIndex(pointLayer) ftPoint = QgsFeature() outFeat = QgsFeature() geom = QgsGeometry() current = 0 hasIntersections = False features = QGisLayers.features(polyLayer) total = 100.0 / float(len(features)) for ftPoly in features: geom = ftPoly.geometry() attrs = ftPoly.attributes() classes = [] hasIntersections = False points = spatialIndex.intersects(geom.boundingBox()) if len(points) > 0: hasIntersections = True if hasIntersections: for i in points: request = QgsFeatureRequest().setFilterFid(i) ftPoint = pointLayer.getFeatures(request).next() tmpGeom = QgsGeometry(ftPoint.geometry()) if geom.contains(tmpGeom): clazz = ftPoint.attributes()[classFieldIndex] if not clazz in classes: classes.append(clazz) outFeat.setGeometry(geom) if idxCount == len(attrs): attrs.append(len(classes)) else: attrs[idxCount] = len(classes) outFeat.setAttributes(attrs) writer.addFeature(outFeat) current += 1 progress.setPercentage(current / total) del writer
def processAlgorithm(self, progress): layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT)) method = self.getParameterValue(self.METHOD) provider = layer.dataProvider() geometryType = layer.geometryType() layer.select(layer.pendingAllAttributesList()) idx1 = -1 idx2 = -1 fields = layer.pendingFields() if geometryType == QGis.Polygon: idx1, fields = utils.findOrCreateField(layer, fields, "area", 21, 6) idx2, fields = utils.findOrCreateField(layer, fields, "perimeter", 21, 6) elif geometryType == QGis.Line: idx1, fields = utils.findOrCreateField(layer, fields, "length", 21, 6) idx2 = idx1 else: idx1, fields = utils.findOrCreateField(layer, fields, "xcoord", 21, 6) idx2, fields = utils.findOrCreateField(layer, fields, "ycoord", 21, 6) writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, provider.geometryType(), provider.crs()) ellips = None crs = None coordTransform = None # calculate with: # 0 - layer CRS # 1 - project CRS # 2 - ellipsoidal if method == 2: settings = QSettings() ellips = settings.value("/qgis/measure/ellipsoid", "WGS84").toString() crs = layer.crs().srsid() elif method == 1: mapCRS = QGisLayers.iface.mapCanvas().mapRenderer().destinationCrs() layCRS = layer.crs() coordTransform = QgsCoordinateTransform(layCRS, mapCRS) inFeat = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() current = 0 total = 100.0 / float(provider.featureCount()) while layer.nextFeature(inFeat): inGeom = inFeat.geometry() if method == 1: inGeom.transform(coordTransform) (attr1, attr2) = self.simpleMeasure(inGeom, method, ellips, crs) outFeat.setGeometry(inGeom) atMap = inFeat.attributeMap() outFeat.setAttributeMap(atMap) outFeat.addAttribute(idx1, QVariant(attr1)) outFeat.addAttribute(idx2, QVariant(attr2)) writer.addFeature(outFeat) current += 1 progress.setPercentage(int(current * total)) del writer
def processAlgorithm(self, progress): layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT)) method = self.getParameterValue(self.METHOD) geometryType = layer.geometryType() idx1 = -1 idx2 = -1 fields = layer.pendingFields() if geometryType == QGis.Polygon: idx1, fields = utils.findOrCreateField(layer, fields, "area", 21, 6) idx2, fields = utils.findOrCreateField(layer, fields, "perimeter", 21, 6) elif geometryType == QGis.Line: idx1, fields = utils.findOrCreateField(layer, fields, "length", 21, 6) idx2 = idx1 else: idx1, fields = utils.findOrCreateField(layer, fields, "xcoord", 21, 6) idx2, fields = utils.findOrCreateField(layer, fields, "ycoord", 21, 6) writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( fields.toList(), layer.dataProvider().geometryType(), layer.crs()) print idx1, idx2 ellips = None crs = None coordTransform = None # calculate with: # 0 - layer CRS # 1 - project CRS # 2 - ellipsoidal if method == 2: ellips = QgsProject.instance().readEntry("Measure", "/Ellipsoid", GEO_NONE)[0] crs = layer.crs().srsid() elif method == 1: mapCRS = QGisLayers.iface.mapCanvas().mapRenderer().destinationCrs( ) layCRS = layer.crs() coordTransform = QgsCoordinateTransform(layCRS, mapCRS) outFeat = QgsFeature() inGeom = QgsGeometry() outFeat.initAttributes(len(fields)) outFeat.setFields(fields) current = 0 features = QGisLayers.features(layer) total = 100.0 / float(len(features)) for f in features: inGeom = f.geometry() if method == 1: inGeom.transform(coordTransform) (attr1, attr2) = utils.simpleMeasure(inGeom, method, ellips, crs) outFeat.setGeometry(inGeom) attrs = f.attributes() attrs.insert(idx1, attr1) if attr2 is not None: attrs.insert(idx2, attr2) outFeat.setAttributes(attrs) writer.addFeature(outFeat) current += 1 progress.setPercentage(int(current * total)) del writer
def processAlgorithm(self, progress): lineLayer = QGisLayers.getObjectFromUri(self.getParameterValue(self.LINES)) polyLayer = QGisLayers.getObjectFromUri(self.getParameterValue(self.POLYGONS)) lengthFieldName = self.getParameterValue(self.LEN_FIELD) countFieldName = self.getParameterValue(self.COUNT_FIELD) polyProvider = polyLayer.dataProvider() lineProvider = lineLayer.dataProvider() if polyProvider.crs() != lineProvider.crs(): SextanteLog.addToLog(SextanteLog.LOG_WARNING, "CRS warning: Input layers have non-matching CRS. This may cause unexpected results.") idxLength, fieldList = utils.findOrCreateField(polyLayer, polyLayer.pendingFields(), lengthFieldName) idxCount, fieldList = utils.findOrCreateField(polyLayer, fieldList, countFieldName) writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fieldList, polyProvider.geometryType(), polyProvider.crs()) spatialIndex = utils.createSpatialIndex(lineLayer) ftLine = QgsFeature() ftPoly = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() outGeom = QgsGeometry() distArea = QgsDistanceArea() current = 0 features = QGisLayers.features(polyLayer) total = 100.0 / float(len(features)) hasIntersections = False for ftPoly in features: inGeom = QgsGeometry(ftPoly.geometry()) atMap = ftPoly.attributes() count = 0 length = 0 hasIntersections = False lines = spatialIndex.intersects(inGeom.boundingBox()) if len(lines) > 0: hasIntersections = True if hasIntersections: for i in lines: lineLayer.featureAtId(int(i), ftLine) tmpGeom = QgsGeometry(ftLine.geometry()) if inGeom.intersects(tmpGeom): outGeom = inGeom.intersection(tmpGeom) length += distArea.measure(outGeom) count += 1 outFeat.setGeometry(inGeom) if idxLength == len(atMap): atMap.append(QVariant(length)) else: atMap[idxLength] = QVariant(length) if idxCount == len(atMap): atMap.append(QVariant(count)) else: atMap[idxCount] = QVariant(count) outFeat.setAttributes(atMap) writer.addFeature(outFeat) current += 1 progress.setPercentage(int(current * total)) del writer
def processAlgorithm(self, progress): layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT)) method = self.getParameterValue(self.METHOD) geometryType = layer.geometryType() idx1 = -1 idx2 = -1 fields = layer.pendingFields() if geometryType == QGis.Polygon: idx1, fields = utils.findOrCreateField(layer, fields, "area", 21, 6) idx2, fields = utils.findOrCreateField(layer, fields, "perimeter", 21, 6) elif geometryType == QGis.Line: idx1, fields = utils.findOrCreateField(layer, fields, "length", 21, 6) idx2 = idx1 else: idx1, fields = utils.findOrCreateField(layer, fields, "xcoord", 21, 6) idx2, fields = utils.findOrCreateField(layer, fields, "ycoord", 21, 6) writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields.toList(), layer.dataProvider().geometryType(), layer.crs()) print idx1, idx2 ellips = None crs = None coordTransform = None # calculate with: # 0 - layer CRS # 1 - project CRS # 2 - ellipsoidal if method == 2: ellips = QgsProject.instance().readEntry("Measure", "/Ellipsoid", GEO_NONE)[0] crs = layer.crs().srsid() elif method == 1: mapCRS = QGisLayers.iface.mapCanvas().mapRenderer().destinationCrs() layCRS = layer.crs() coordTransform = QgsCoordinateTransform(layCRS, mapCRS) outFeat = QgsFeature() inGeom = QgsGeometry() outFeat.initAttributes(len(fields)) outFeat.setFields(fields) current = 0 features = QGisLayers.features(layer) total = 100.0 / float(len(features)) for f in features: inGeom = f.geometry() if method == 1: inGeom.transform(coordTransform) (attr1, attr2) = utils.simpleMeasure(inGeom, method, ellips, crs) outFeat.setGeometry(inGeom) attrs = f.attributes() attrs.insert(idx1, attr1) if attr2 is not None: attrs.insert(idx2, attr2) outFeat.setAttributes(attrs) writer.addFeature(outFeat) current += 1 progress.setPercentage(int(current * total)) del writer
def processAlgorithm(self, progress): layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT_LAYER)) fieldName = self.getParameterValue(self.FIELD_NAME) outputFile = self.getOutputValue(self.OUTPUT_HTML_FILE) index = layer.fieldNameIndex(fieldName) #layer.select([index], QgsRectangle(), False) cvValue = 0 minValue = 0 maxValue = 0 sumValue = 0 meanValue = 0 medianValue = 0 stdDevValue = 0 isFirst = True values = [] features = QGisLayers.features(layer) count = len(features) total = 100.0 / float(count) current = 0 for ft in features: value = float(ft.attributes()[index].toDouble()[0]) if isFirst: minValue = value maxValue = value isFirst = False else: if value < minValue: minValue = value if value > maxValue: maxValue = value values.append( value ) sumValue += value current += 1 progress.setPercentage(int(current * total)) # calculate additional values rValue = maxValue - minValue uniqueValue = utils.getUniqueValuesCount(layer, index) if count > 0: meanValue = sumValue / count if meanValue != 0.00: for v in values: stdDevValue += ((v - meanValue) * (v - meanValue)) stdDevValue = math.sqrt(stdDevValue / count) cvValue = stdDevValue / meanValue if count > 1: tmp = values tmp.sort() # calculate median if (count % 2) == 0: medianValue = 0.5 * (tmp[(count - 1) / 2] + tmp[count / 2]) else: medianValue = tmp[(count + 1) / 2 - 1] data = [] data.append("Count: " + unicode(count)) data.append("Unique values: " + unicode(uniqueValue)) data.append("Minimum value: " + unicode(minValue)) data.append("Maximum value: " + unicode(maxValue)) data.append("Range: " + unicode(rValue)) data.append("Sum: " + unicode(sumValue)) data.append("Mean value: " + unicode(meanValue)) data.append("Median value: " + unicode(medianValue)) data.append("Standard deviation: " + unicode(stdDevValue)) data.append("Coefficient of Variation: " + unicode(cvValue)) self.createHTML(outputFile, data) self.setOutputValue(self.COUNT, count) self.setOutputValue(self.UNIQUE, uniqueValue) self.setOutputValue(self.MIN, minValue) self.setOutputValue(self.MAX, maxValue) self.setOutputValue(self.RANGE, rValue) self.setOutputValue(self.SUM, sumValue) self.setOutputValue(self.MEAN, meanValue) self.setOutputValue(self.MEDIAN, medianValue) self.setOutputValue(self.STD_DEV, stdDevValue) self.setOutputValue(self.CV, cvValue)
def processAlgorithm(self, progress): lineLayer = QGisLayers.getObjectFromUri( self.getParameterValue(self.LINES)) polyLayer = QGisLayers.getObjectFromUri( self.getParameterValue(self.POLYGONS)) lengthFieldName = self.getParameterValue(self.LEN_FIELD) countFieldName = self.getParameterValue(self.COUNT_FIELD) polyProvider = polyLayer.dataProvider() idxLength, fieldList = utils.findOrCreateField( polyLayer, polyLayer.pendingFields(), lengthFieldName) idxCount, fieldList = utils.findOrCreateField(polyLayer, fieldList, countFieldName) writer = self.getOutputFromName(self.OUTPUT).getVectorWriter( fieldList.toList(), polyProvider.geometryType(), polyProvider.crs()) spatialIndex = utils.createSpatialIndex(lineLayer) ftLine = QgsFeature() ftPoly = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() outGeom = QgsGeometry() distArea = QgsDistanceArea() current = 0 features = QGisLayers.features(polyLayer) total = 100.0 / float(len(features)) hasIntersections = False for ftPoly in features: inGeom = QgsGeometry(ftPoly.geometry()) attrs = ftPoly.attributes() count = 0 length = 0 hasIntersections = False lines = spatialIndex.intersects(inGeom.boundingBox()) if len(lines) > 0: hasIntersections = True if hasIntersections: for i in lines: request = QgsFeatureRequest().setFilterFid(i) ftLine = lineLayer.getFeatures(request).next() tmpGeom = QgsGeometry(ftLine.geometry()) if inGeom.intersects(tmpGeom): outGeom = inGeom.intersection(tmpGeom) length += distArea.measure(outGeom) count += 1 outFeat.setGeometry(inGeom) if idxLength == len(attrs): attrs.append(length) else: attrs[idxLength] = length if idxCount == len(attrs): attrs.append(count) else: attrs[idxCount] = count outFeat.setAttributes(attrs) writer.addFeature(outFeat) current += 1 progress.setPercentage(int(current * total)) del writer
def processAlgorithm(self, progress): useField = not self.getParameterValue(Dissolve.DISSOLVE_ALL) fieldname = self.getParameterValue(Dissolve.FIELD) vlayerA = QGisLayers.getObjectFromUri(self.getParameterValue(Dissolve.INPUT)) field = vlayerA.fieldNameIndex(fieldname) vproviderA = vlayerA.dataProvider() fields = vproviderA.fields() writer = self.getOutputFromName(Dissolve.OUTPUT).getVectorWriter(fields, vproviderA.geometryType(), vproviderA.crs() ) outFeat = QgsFeature() nElement = 0 nFeat = vproviderA.featureCount() if not useField: first = True features = QGisLayers.features(vlayerA) for inFeat in features: nElement += 1 progress.setPercentage(int(nElement/nFeat * 100)) if first: attrs = inFeat.attributes() tmpInGeom = QgsGeometry( inFeat.geometry() ) outFeat.setGeometry( tmpInGeom ) first = False else: tmpInGeom = QgsGeometry( inFeat.geometry() ) tmpOutGeom = QgsGeometry( outFeat.geometry() ) try: tmpOutGeom = QgsGeometry( tmpOutGeom.combine( tmpInGeom ) ) outFeat.setGeometry( tmpOutGeom ) except: raise GeoAlgorithmExecutionException("Geometry exception while dissolving") outFeat.setAttributes( attrs ) writer.addFeature( outFeat ) else: unique = utils.getUniqueValues( vlayerA, int( field ) ) nFeat = nFeat * len( unique ) for item in unique: first = True add = True features = QGisLayers.features(vlayerA) for inFeat in features: nElement += 1 progress.setPercentage(int(nElement/nFeat * 100)) atMap = inFeat.attributes() tempItem = atMap[ field ] if tempItem.toString().trimmed() == item.toString().trimmed(): if first: QgsGeometry( inFeat.geometry() ) tmpInGeom = QgsGeometry( inFeat.geometry() ) outFeat.setGeometry( tmpInGeom ) first = False attrs = inFeat.attributes() else: tmpInGeom = QgsGeometry( inFeat.geometry() ) tmpOutGeom = QgsGeometry( outFeat.geometry() ) try: tmpOutGeom = QgsGeometry( tmpOutGeom.combine( tmpInGeom ) ) outFeat.setGeometry( tmpOutGeom ) except: raise GeoAlgorithmExecutionException("Geometry exception while dissolving") if add: outFeat.setAttributes( attrs ) writer.addFeature( outFeat ) del writer
def processAlgorithm(self, progress): vlayerA = QGisLayers.getObjectFromUri(self.getParameterValue(Intersection.INPUT)) vlayerB = QGisLayers.getObjectFromUri(self.getParameterValue(Intersection.INPUT2)) GEOS_EXCEPT = True FEATURE_EXCEPT = True vproviderA = vlayerA.dataProvider() vproviderB = vlayerB.dataProvider() # check for crs compatibility crsA = vproviderA.crs() crsB = vproviderB.crs() if not crsA.isValid() or not crsB.isValid(): SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Intersection. Invalid CRS. Results might be unexpected") else: if not crsA != crsB: SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Intersection. Non-matching CRSs. Results might be unexpected") fields = utils.combineVectorFields(vlayerA, vlayerB) #======================================================================= # longNames = ftools_utils.checkFieldNameLength( fields ) # if not longNames.isEmpty(): # raise GeoAlgorithmExecutionException("Following field names are longer than 10 characters:\n" + longNames.join('\n') ) #======================================================================= writer = self.getOutputFromName(Intersection.OUTPUT).getVectorWriter(fields, vproviderA.geometryType(), vproviderA.crs() ) inFeatA = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() index = utils.createSpatialIndex(vlayerB) nElement = 0 selectionA = QGisLayers.features(vlayerA) nFeat = len(selectionA) for inFeatA in selectionA: nElement += 1 progress.setPercentage(nElement/float(nFeat) * 100) geom = QgsGeometry( inFeatA.geometry() ) atMapA = inFeatA.attributes() intersects = index.intersects( geom.boundingBox() ) for id in intersects: vlayerB.featureAtId( int( id ), inFeatB , True) tmpGeom = QgsGeometry( inFeatB.geometry() ) try: if geom.intersects( tmpGeom ): atMapB = inFeatB.attributes() int_geom = QgsGeometry( geom.intersection( tmpGeom ) ) if int_geom.wkbType() == 7: int_com = geom.combine( tmpGeom ) int_sym = geom.symDifference( tmpGeom ) int_geom = QgsGeometry( int_com.difference( int_sym ) ) try: outFeat.setGeometry( int_geom ) outFeat.setAttributes( atMapA.extend( atMapB ) ) writer.addFeature( outFeat ) except: FEATURE_EXCEPT = False continue except: GEOS_EXCEPT = False break del writer if not GEOS_EXCEPT: SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Geometry exception while computing intersection") if not FEATURE_EXCEPT: SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Feature exception while computing intersection")
def processAlgorithm(self, progress): useField = not self.getParameterValue(Dissolve.DISSOLVE_ALL) fieldname = self.getParameterValue(Dissolve.FIELD) vlayerA = QGisLayers.getObjectFromUri( self.getParameterValue(Dissolve.INPUT)) field = vlayerA.fieldNameIndex(fieldname) vproviderA = vlayerA.dataProvider() fields = vproviderA.fields() writer = self.getOutputFromName(Dissolve.OUTPUT).getVectorWriter( fields, vproviderA.geometryType(), vproviderA.crs()) outFeat = QgsFeature() nElement = 0 nFeat = vproviderA.featureCount() if not useField: first = True features = QGisLayers.features(vlayerA) for inFeat in features: nElement += 1 progress.setPercentage(int(nElement / nFeat * 100)) if first: attrs = inFeat.attributes() tmpInGeom = QgsGeometry(inFeat.geometry()) outFeat.setGeometry(tmpInGeom) first = False else: tmpInGeom = QgsGeometry(inFeat.geometry()) tmpOutGeom = QgsGeometry(outFeat.geometry()) try: tmpOutGeom = QgsGeometry(tmpOutGeom.combine(tmpInGeom)) outFeat.setGeometry(tmpOutGeom) except: raise GeoAlgorithmExecutionException( "Geometry exception while dissolving") outFeat.setAttributes(attrs) writer.addFeature(outFeat) else: unique = utils.getUniqueValues(vlayerA, int(field)) nFeat = nFeat * len(unique) for item in unique: first = True add = True features = QGisLayers.features(vlayerA) for inFeat in features: nElement += 1 progress.setPercentage(int(nElement / nFeat * 100)) atMap = inFeat.attributes() tempItem = atMap[field] if tempItem.toString().trimmed() == item.toString( ).trimmed(): if first: QgsGeometry(inFeat.geometry()) tmpInGeom = QgsGeometry(inFeat.geometry()) outFeat.setGeometry(tmpInGeom) first = False attrs = inFeat.attributes() else: tmpInGeom = QgsGeometry(inFeat.geometry()) tmpOutGeom = QgsGeometry(outFeat.geometry()) try: tmpOutGeom = QgsGeometry( tmpOutGeom.combine(tmpInGeom)) outFeat.setGeometry(tmpOutGeom) except: raise GeoAlgorithmExecutionException( "Geometry exception while dissolving") if add: outFeat.setAttributes(attrs) writer.addFeature(outFeat) del writer
def processAlgorithm(self, progress): settings = QSettings() systemEncoding = settings.value( "/UI/encoding", "System" ).toString() output = self.getOutputValue(Clip.OUTPUT) vlayerA = QGisLayers.getObjectFromUri(self.getParameterValue(Clip.INPUT)) vlayerB = QGisLayers.getObjectFromUri(self.getParameterValue(Clip.INPUT2)) GEOS_EXCEPT = True FEATURE_EXCEPT = True vproviderA = vlayerA.dataProvider() #allAttrsA = vproviderA.attributeIndexes() #vproviderA.select( allAttrsA ) vproviderB = vlayerB.dataProvider() #allAttrsB = vproviderB.attributeIndexes() #vproviderB.select( allAttrsB ) # check for crs compatibility crsA = vproviderA.crs() crsB = vproviderB.crs() if not crsA.isValid() or not crsB.isValid(): SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Intersection. Invalid CRS. Results might be unexpected") else: if crsA != crsB: SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Intersection. Non-matching CRSs. Results might be unexpected") fields = vproviderA.fields() writer = QgsVectorFileWriter( output, systemEncoding,fields, vproviderA.geometryType(), vproviderA.crs() ) inFeatA = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() index = utils.createSpatialIndex(vlayerB) #vproviderA.rewind() nElement = 0 selectionA = QGisLayers.features(vlayerA) nFeat = len(selectionA) for inFeatA in selectionA: nElement += 1 progress.setPercentage(nElement/float(nFeat) * 100) geom = QgsGeometry( inFeatA.geometry() ) int_geom = QgsGeometry( geom ) atMap = inFeatA.attributes() intersects = index.intersects(geom.boundingBox()) found = False first = True for id in intersects: vlayerB.featureAtId(int(id), inFeatB) tmpGeom = QgsGeometry(inFeatB.geometry()) if tmpGeom.intersects(geom): found = True if first: outFeat.setGeometry(QgsGeometry(tmpGeom)) first = False else: try: cur_geom = QgsGeometry( outFeat.geometry() ) new_geom = QgsGeometry( cur_geom.combine( tmpGeom ) ) outFeat.setGeometry( QgsGeometry( new_geom ) ) except: GEOS_EXCEPT = False break if found: try: cur_geom = QgsGeometry( outFeat.geometry() ) new_geom = QgsGeometry( geom.intersection( cur_geom ) ) if new_geom.wkbType() == 7: int_com = QgsGeometry( geom.combine( cur_geom ) ) int_sym = QgsGeometry( geom.symDifference( cur_geom ) ) new_geom = QgsGeometry( int_com.difference( int_sym ) ) try: outFeat.setGeometry( new_geom ) outFeat.setAttributes( atMap ) writer.addFeature( outFeat ) except: FEATURE_EXCEPT = False continue except: GEOS_EXCEPT = False continue if not GEOS_EXCEPT: SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Geometry exception while computing clip") if not FEATURE_EXCEPT: SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Feature exception while computing clip")
def processAlgorithm(self, progress): layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT_LAYER)) fieldName = self.getParameterValue(self.FIELD_NAME) outputFile = self.getOutputValue(self.OUTPUT_HTML_FILE) index = layer.fieldNameIndex(fieldName) sumValue = 0 minValue = 0 maxValue = 0 meanValue = 0 countEmpty = 0 countFilled = 0 isFirst = True values = [] features = QGisLayers.features(layer) count = len(features) total = 100.0 / float(count) current = 0 for ft in features: length = float(len(ft.attributes()[index].toString())) if isFirst: minValue = length maxValue = length isFirst = False else: if length < minValue: minValue = length if length > maxValue: maxValue = length if length != 0.00: countFilled += 1 else: countEmpty += 1 values.append(length) sumValue += length current += 1 progress.setPercentage(int(current * total)) n = float(len(values)) if n > 0: meanValue = sumValue / n uniqueValues = utils.getUniqueValuesCount(layer, index) data = [] data.append("Minimum length: " + unicode(minValue)) data.append("Maximum length: " + unicode(maxValue)) data.append("Mean length: " + unicode(meanValue)) data.append("Filled: " + unicode(countFilled)) data.append("Empty: " + unicode(countEmpty)) data.append("Count: " + unicode(count)) data.append("Unique: " + unicode(uniqueValues)) self.createHTML(outputFile, data) self.setOutputValue(self.MIN_LEN, minValue) self.setOutputValue(self.MAX_LEN, maxValue) self.setOutputValue(self.MEAN_LEN, meanValue) self.setOutputValue(self.FILLED, countFilled) self.setOutputValue(self.EMPTY, countEmpty) self.setOutputValue(self.COUNT, count) self.setOutputValue(self.UNIQUE, uniqueValues)
def processAlgorithm(self, progress): vlayerA = QGisLayers.getObjectFromUri(self.getParameterValue(Union.INPUT)) vlayerB = QGisLayers.getObjectFromUri(self.getParameterValue(Union.INPUT2)) GEOS_EXCEPT = True FEATURE_EXCEPT = True vproviderA = vlayerA.dataProvider() allAttrsA = vproviderA.attributeIndexes() vproviderA.select( allAttrsA ) vproviderB = vlayerB.dataProvider() allAttrsB = vproviderB.attributeIndexes() vproviderB.select( allAttrsB ) # check for crs compatibility crsA = vproviderA.crs() crsB = vproviderB.crs() if not crsA.isValid() or not crsB.isValid(): SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Union. Invalid CRS. Results might be unexpected") else: if not crsA != crsB: SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Union. Non-matching CRSs. Results might be unexpected") fields = utils.combineVectorFields(vlayerA, vlayerB ) #longNames = ftools_utils.checkFieldNameLength( fields ) #if not longNames.isEmpty(): #raise GeoAlgorithmExecutionException("Following field names are longer than 10 characters:\n" + longNames.join('\n') ) writer = self.getOutputFromName(Union.OUTPUT).getVectorWriter(fields, vproviderA.geometryType(), vproviderA.crs() ) inFeatA = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() indexA = utils.createSpatialIndex(vlayerB) indexB = utils.createSpatialIndex(vlayerA) vproviderA.rewind() count = 0 nElement = 0 featuresA = QGisLayers.features(vlayerA) nFeat = len(featuresA) for inFeatA in featuresA: progress.setPercentage(nElement/float(nFeat) * 50) nElement += 1 found = False geom = QgsGeometry( inFeatA.geometry() ) diff_geom = QgsGeometry( geom ) atMapA = inFeatA.attributes() intersects = indexA.intersects( geom.boundingBox() ) if len( intersects ) < 1: try: outFeat.setGeometry( geom ) outFeat.setAttributes( atMapA ) writer.addFeature( outFeat ) except: # this really shouldn't happen, as we # haven't edited the input geom at all FEATURE_EXCEPT = False else: for id in intersects: count += 1 vproviderB.featureAtId( int( id ), inFeatB , True, allAttrsB ) atMapB = inFeatB.attributes() tmpGeom = QgsGeometry( inFeatB.geometry() ) try: if geom.intersects( tmpGeom ): found = True int_geom = geom.intersection( tmpGeom ) if int_geom is None: # There was a problem creating the intersection GEOS_EXCEPT = False int_geom = QgsGeometry() else: int_geom = QgsGeometry(int_geom) if diff_geom.intersects( tmpGeom ): diff_geom = diff_geom.difference( tmpGeom ) if diff_geom is None: # It's possible there was an error here? diff_geom = QgsGeometry() else: diff_geom = QgsGeometry(diff_geom) if int_geom.wkbType() == 0: # intersection produced different geomety types temp_list = int_geom.asGeometryCollection() for i in temp_list: if i.type() == geom.type(): int_geom = QgsGeometry( i ) try: outFeat.setGeometry( int_geom ) outFeat.setAttributes( atMapA.extend( atMapB ) ) writer.addFeature( outFeat ) except Exception, err: FEATURE_EXCEPT = False else: # this only happends if the bounding box # intersects, but the geometry doesn't try: outFeat.setGeometry( geom ) outFeat.setAttributes( atMapA ) writer.addFeature( outFeat ) except: # also shoudn't ever happen FEATURE_EXCEPT = False except Exception, err: GEOS_EXCEPT = False found = False
def processAlgorithm(self, progress): vlayerA = QGisLayers.getObjectFromUri( self.getParameterValue(Union.INPUT)) vlayerB = QGisLayers.getObjectFromUri( self.getParameterValue(Union.INPUT2)) GEOS_EXCEPT = True FEATURE_EXCEPT = True vproviderA = vlayerA.dataProvider() fields = utils.combineVectorFields(vlayerA, vlayerB) names = [field.name() for field in fields] SextanteLog.addToLog(SextanteLog.LOG_INFO, str(names)) writer = self.getOutputFromName(Union.OUTPUT).getVectorWriter( fields, vproviderA.geometryType(), vproviderA.crs()) inFeatA = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() indexA = utils.createSpatialIndex(vlayerB) indexB = utils.createSpatialIndex(vlayerA) count = 0 nElement = 0 featuresA = QGisLayers.features(vlayerA) nFeat = len(featuresA) for inFeatA in featuresA: progress.setPercentage(nElement / float(nFeat) * 50) nElement += 1 found = False geom = QgsGeometry(inFeatA.geometry()) diff_geom = QgsGeometry(geom) atMapA = inFeatA.attributes() intersects = indexA.intersects(geom.boundingBox()) if len(intersects) < 1: try: outFeat.setGeometry(geom) outFeat.setAttributes(atMapA) writer.addFeature(outFeat) except: # this really shouldn't happen, as we # haven't edited the input geom at all raise GeoAlgorithmExecutionException( "Feature exception while computing union") else: for id in intersects: count += 1 request = QgsFeatureRequest().setFilterFid(id) inFeatB = vlayerB.getFeatures(request).next() atMapB = inFeatB.attributes() tmpGeom = QgsGeometry(inFeatB.geometry()) if geom.intersects(tmpGeom): found = True int_geom = geom.intersection(tmpGeom) if int_geom is None: # There was a problem creating the intersection raise GeoAlgorithmExecutionException( "Geometry exception while computing intersection" ) else: int_geom = QgsGeometry(int_geom) if diff_geom.intersects(tmpGeom): diff_geom = diff_geom.difference(tmpGeom) if diff_geom is None: # It's possible there was an error here? diff_geom = QgsGeometry() else: diff_geom = QgsGeometry(diff_geom) if int_geom.wkbType() == 0: # intersection produced different geomety types temp_list = int_geom.asGeometryCollection() for i in temp_list: if i.type() == geom.type(): int_geom = QgsGeometry(i) try: outFeat.setGeometry(int_geom) attrs = [] attrs.extend(atMapA) attrs.extend(atMapB) outFeat.setAttributes(attrs) writer.addFeature(outFeat) except Exception, err: raise GeoAlgorithmExecutionException( "Feature exception while computing union") else: # this only happends if the bounding box # intersects, but the geometry doesn't try: outFeat.setGeometry(geom) outFeat.setAttributes(atMapA) writer.addFeature(outFeat) except: # also shoudn't ever happen raise GeoAlgorithmExecutionException( "Feature exception while computing union") if found: try: if diff_geom.wkbType() == 0: temp_list = diff_geom.asGeometryCollection() for i in temp_list: if i.type() == geom.type(): diff_geom = QgsGeometry(i) outFeat.setGeometry(diff_geom) outFeat.setAttributes(atMapA) writer.addFeature(outFeat) except Exception, err: raise GeoAlgorithmExecutionException( "Feature exception while computing union")
def processAlgorithm(self, progress): layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.POINTS)) weightField = self.getParameterValue(self.WEIGHT) uniqueField = self.getParameterValue(self.UID) provider = layer.dataProvider() weightIndex = layer.fieldNameIndex(weightField) uniqueIndex = layer.fieldNameIndex(uniqueField) if uniqueIndex <> -1: uniqueValues = utils.getUniqueValues(layer, uniqueIndex) single = False else: uniqueValues = [QVariant(1)] single = True fieldList = [QgsField("MEAN_X", QVariant.Double, "", 24, 15), QgsField("MEAN_Y", QVariant.Double, "", 24, 15), QgsField("UID", QVariant.String, "", 255) ] writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fieldList, QGis.WKBPoint, layer.crs()) current = 0 total = 100.0 / float(provider.featureCount() * len(uniqueValues)) outFeat = QgsFeature() for j in uniqueValues: cx = 0.00 cy = 0.00 points = [] weights = [] features = QGisLayers.features(layer) for feat in features: current += 1 progress.setPercentage(current * total) if single: check = j.toString().trimmed() else: check = feat.attributes()[uniqueIndex].toString().trimmed() if check == j.toString().trimmed(): cx = 0.00 cy = 0.00 if weightIndex == -1: weight = 1.00 else: try: weight = float(feat.attributes()[weightIndex].toDouble()[0]) except: weight = 1.00 geom = QgsGeometry(feat.geometry()) geom = utils.extractPoints(geom) for i in geom: cx += i.x() cy += i.y() points.append(QgsPoint((cx / len(geom)), (cy / len(geom)))) weights.append(weight) sumWeight = sum(weights) cx = 0.00 cy = 0.00 item = 0 for item, i in enumerate(points): cx += i.x() * weights[item] cy += i.y() * weights[item] cx = cx / sumWeight cy = cy / sumWeight meanPoint = QgsPoint(cx, cy) outFeat.setGeometry(QgsGeometry.fromPoint(meanPoint)) outFeat.setAttributes([QVariant(cx), QVariant(cy), QVariant(j)]) writer.addFeature(outFeat) if single: break del writer
def processAlgorithm(self, progress): useField = (self.getParameterValue(ConvexHull.METHOD) == 1) fieldName = self.getParameterValue(ConvexHull.FIELD) layer = QGisLayers.getObjectFromUri(self.getParameterValue(ConvexHull.INPUT)) f = QgsField("value") f.setType(QVariant.String) f.setLength(255) if useField: index = layer.fieldNameIndex(fieldName) fType = layer.pendingFields()[index].type() if fType == QVariant.Int: f.setType(QVariant.Int) f.setLength(20) elif fType == QVariant.Double: f.setType(QVariant.Double) f.setLength(20) f.setPrecision(6) else: f.setType(QVariant.String) f.setLength(255) fields = [QgsField("id", QVariant.Int, "", 20), f, QgsField("area", QVariant.Double, "", 20, 6), QgsField("perim", QVariant.Double, "", 20, 6) ] writer = self.getOutputFromName(ConvexHull.OUTPUT).getVectorWriter(fields, QGis.WKBPolygon, layer.dataProvider().crs()) outFeat = QgsFeature() inGeom = QgsGeometry() outGeom = QgsGeometry() current = 0 fid = 0 val = "" if useField: unique = layer.uniqueValues(index) total = 100.0 / float(layer.featureCount() * len (unique)) for i in unique: hull = [] first = True features = QGisLayers.features(layer) for f in features: idVar = f[fieldName] if unicode(idVar).strip() == unicode(i).strip: if first: val = idVar first = False inGeom = QgsGeometry(f.geometry()) points = utils.extractPoints(inGeom) hull.extend(points) current += 1 progress.setPercentage(int(current * total)) if len(hull) >= 3: tmpGeom = QgsGeometry(outGeom.fromMultiPoint(hull)) try: outGeom = tmpGeom.convexHull() (area, perim) = utils.simpleMeasure(outGeom) outFeat.setGeometry(outGeom) outFeat.setAttributes([fid,val,area,perim]) writer.addFeature(outFeat) except: raise GeoAlgorithmExecutionException("Exception while computing convex hull") fid += 1 else: hull = [] total = 100.0 / float(layer.featureCount()) features = QGisLayers.features(layer) for f in features: inGeom = QgsGeometry(f.geometry()) points = utils.extractPoints(inGeom) hull.extend(points) current += 1 progress.setPercentage(int(current * total)) tmpGeom = QgsGeometry(outGeom.fromMultiPoint(hull)) try: outGeom = tmpGeom.convexHull() (area, perim) = utils.simpleMeasure(outGeom) outFeat.setGeometry(outGeom) outFeat.setAttributes([0, "all", area, perim]) writer.addFeature(outFeat) except: raise GeoAlgorithmExecutionException("Exception while computing convex hull") del writer
def processAlgorithm(self, progress): layerA = QGisLayers.getObjectFromUri( self.getParameterValue(Difference.INPUT)) layerB = QGisLayers.getObjectFromUri( self.getParameterValue(Difference.OVERLAY)) GEOS_EXCEPT = True FEATURE_EXCEPT = True writer = self.getOutputFromName(Difference.OUTPUT).getVectorWriter( layerA.pendingFields(), layerA.dataProvider().geometryType(), layerA.dataProvider().crs()) inFeatA = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() index = utils.createSpatialIndex(layerB) selectionA = QGisLayers.features(layerA) current = 0 total = 100.0 / float(len(selectionA)) for inFeatA in selectionA: add = True geom = QgsGeometry(inFeatA.geometry()) diff_geom = QgsGeometry(geom) attrs = inFeatA.attributes() intersections = index.intersects(geom.boundingBox()) for i in intersections: request = QgsFeatureRequest().setFilterFid(i) inFeatB = layerB.getFeatures(request).next() tmpGeom = QgsGeometry(inFeatB.geometry()) try: if diff_geom.intersects(tmpGeom): diff_geom = QgsGeometry(diff_geom.difference(tmpGeom)) except: GEOS_EXCEPT = False add = False break if add: try: outFeat.setGeometry(diff_geom) outFeat.setAttributes(attrs) writer.addFeature(outFeat) except: FEATURE_EXCEPT = False continue current += 1 progress.setPercentage(int(current * total)) del writer if not GEOS_EXCEPT: SextanteLog.addToLog( SextanteLog.LOG_WARNING, "Geometry exception while computing difference") if not FEATURE_EXCEPT: SextanteLog.addToLog( SextanteLog.LOG_WARNING, "Feature exception while computing difference")