def processAlgorithm(self, progress):
     vlayer = QGisLayers.getObjectFromUri(
         self.getParameterValue(SinglePartsToMultiparts.INPUT))
     vprovider = vlayer.dataProvider()
     allAttrs = vprovider.attributeIndexes()
     vprovider.select(allAttrs)
     fields = vprovider.fields()
     geomType = self.singleToMultiGeom(vprovider.geometryType())
     writer = self.getOutputFromName(
         SinglePartsToMultiparts.OUTPUT).getVectorWriter(
             fields, geomType, vprovider.crs())
     inFeat = QgsFeature()
     outFeat = QgsFeature()
     inGeom = QgsGeometry()
     outGeom = QgsGeometry()
     field = self.getParameterValue(SinglePartsToMultiparts.FIELD)
     index = vprovider.fieldNameIndex(field)
     unique = ftools_utils.getUniqueValues(vprovider, int(index))
     nFeat = vprovider.featureCount() * len(unique)
     nElement = 0
     if not len(unique) == vlayer.featureCount():
         for i in unique:
             vprovider.rewind()
             multi_feature = []
             first = True
             vprovider.select(allAttrs)
             while vprovider.nextFeature(inFeat):
                 atMap = inFeat.attributeMap()
                 idVar = atMap[index]
                 if idVar.toString().trimmed() == i.toString().trimmed():
                     if first:
                         atts = atMap
                         first = False
                     inGeom = QgsGeometry(inFeat.geometry())
                     vType = inGeom.type()
                     feature_list = self.extractAsMulti(inGeom)
                     multi_feature.extend(feature_list)
                 nElement += 1
             outFeat.setAttributeMap(atts)
             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):
     vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(SinglePartsToMultiparts.INPUT))
     vprovider = vlayer.dataProvider()
     allAttrs = vprovider.attributeIndexes()
     vprovider.select( allAttrs )
     fields = vprovider.fields()
     geomType = self.singleToMultiGeom(vprovider.geometryType())
     writer = self.getOutputFromName(SinglePartsToMultiparts.OUTPUT).getVectorWriter(fields, geomType, vprovider.crs() )
     inFeat = QgsFeature()
     outFeat = QgsFeature()
     inGeom = QgsGeometry()
     outGeom = QgsGeometry()
     field = self.getParameterValue(SinglePartsToMultiparts.FIELD)
     index = vprovider.fieldNameIndex(field)
     unique = ftools_utils.getUniqueValues( vprovider, int( index ) )
     nFeat = vprovider.featureCount() * len( unique )
     nElement = 0
     if not len( unique ) == vlayer.featureCount():
       for i in unique:
         vprovider.rewind()
         multi_feature= []
         first = True
         vprovider.select(allAttrs)
         while vprovider.nextFeature( inFeat ):
           atMap = inFeat.attributeMap()
           idVar = atMap[ index ]
           if idVar.toString().trimmed() == i.toString().trimmed():
             if first:
               atts = atMap
               first = False
             inGeom = QgsGeometry( inFeat.geometry() )
             vType = inGeom.type()
             feature_list = self.extractAsMulti( inGeom )
             multi_feature.extend( feature_list )
           nElement += 1
         outFeat.setAttributeMap( atts )
         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):
     method = self.getParameterValue(self.METHOD)
     field = self.getParameterValue(RandomSelectionWithinSubsets.FIELD)
     filename = self.getParameterValue(RandomSelectionWithinSubsets.INPUT)
     vlayer = QGisLayers.getObjectFromUri(filename)
     vlayer.removeSelection(True)
     vprovider = vlayer.dataProvider()
     allAttrs = vprovider.attributeIndexes()
     vprovider.select(allAttrs)
     index = vprovider.fieldNameIndex(field)
     unique = ftools_utils.getUniqueValues(vprovider, int(index))
     inFeat = QgsFeature()
     selran = []
     nFeat = vprovider.featureCount() * len(unique)
     nElement = 0
     if not len(unique) == vlayer.featureCount():
         for i in unique:
             vprovider.rewind()
             FIDs= []
             while vprovider.nextFeature(inFeat):
                 atMap = inFeat.attributeMap()
                 if atMap[index] == QVariant(i):
                     FID = inFeat.id()
                     FIDs.append(FID)
                 nElement += 1
                 progress.setPercentage(nElement/nFeat * 100)
             if method == 0:
                 value = int(self.getParameterValue(self.NUMBER))
             else:
                 value = self.getParameterValue(self.PERCENTAGE)
                 value = int(round((value / 100.0000) * len(FIDs), 0))
             if value >= len(FIDs):
                 selFeat = FIDs
             else:
                 selFeat = random.sample(FIDs, value)
             selran.extend(selFeat)
         vlayer.setSelectedFeatures(selran)
     else:
         vlayer.setSelectedFeatures(range(0, vlayer.featureCount()))
     self.setOutputValue(RandomSelectionWithinSubsets.OUTPUT, filename)
Beispiel #4
0
 def processAlgorithm(self, progress):
     method = self.getParameterValue(self.METHOD)
     field = self.getParameterValue(RandomSelectionWithinSubsets.FIELD)
     filename = self.getParameterValue(RandomSelectionWithinSubsets.INPUT)
     vlayer = QGisLayers.getObjectFromUri(filename)
     vlayer.removeSelection(True)
     vprovider = vlayer.dataProvider()
     allAttrs = vprovider.attributeIndexes()
     vprovider.select(allAttrs)
     index = vprovider.fieldNameIndex(field)
     unique = ftools_utils.getUniqueValues(vprovider, int(index))
     inFeat = QgsFeature()
     selran = []
     nFeat = vprovider.featureCount() * len(unique)
     nElement = 0
     if not len(unique) == vlayer.featureCount():
         for i in unique:
             vprovider.rewind()
             FIDs = []
             while vprovider.nextFeature(inFeat):
                 atMap = inFeat.attributeMap()
                 if atMap[index] == QVariant(i):
                     FID = inFeat.id()
                     FIDs.append(FID)
                 nElement += 1
                 progress.setPercentage(nElement / nFeat * 100)
             if method == 0:
                 value = int(self.getParameterValue(self.NUMBER))
             else:
                 value = self.getParameterValue(self.PERCENTAGE)
                 value = int(round((value / 100.0000) * len(FIDs), 0))
             if value >= len(FIDs):
                 selFeat = FIDs
             else:
                 selFeat = random.sample(FIDs, value)
             selran.extend(selFeat)
         vlayer.setSelectedFeatures(selran)
     else:
         vlayer.setSelectedFeatures(range(0, vlayer.featureCount()))
     self.setOutputValue(RandomSelectionWithinSubsets.OUTPUT, filename)
Beispiel #5
0
 def processAlgorithm(self, progress):
     vlayer = QGisLayers.getObjectFromUri(
         self.getParameterValue(MeanCoords.POINTS))
     weightField = self.getParameterValue(MeanCoords.WEIGHT)
     uniqueField = self.getParameterValue(MeanCoords.UID)
     provider = vlayer.dataProvider()
     weightIndex = provider.fieldNameIndex(weightField)
     uniqueIndex = provider.fieldNameIndex(uniqueField)
     feat = QgsFeature()
     allAttrs = provider.attributeIndexes()
     provider.select(allAttrs)
     sRs = provider.crs()
     if uniqueIndex <> -1:
         uniqueValues = ftools_utils.getUniqueValues(
             provider, int(uniqueIndex))
         single = False
     else:
         uniqueValues = [QVariant(1)]
         single = True
     fieldList = {
         0: QgsField("MEAN_X", QVariant.Double),
         1: QgsField("MEAN_Y", QVariant.Double),
         2: QgsField("UID", QVariant.String)
     }
     writer = self.getOutputFromName(MeanCoords.OUTPUT).getVectorWriter(
         fieldList, QGis.WKBPoint, sRs)
     outfeat = QgsFeature()
     points = []
     weights = []
     nFeat = provider.featureCount() * len(uniqueValues)
     nElement = 0
     for j in uniqueValues:
         provider.rewind()
         provider.select(allAttrs)
         cx = 0.00
         cy = 0.00
         points = []
         weights = []
         while provider.nextFeature(feat):
             nElement += 1
             progress.setPercentage(nElement / nFeat * 100)
             if single:
                 check = j.toString().trimmed()
             else:
                 check = feat.attributeMap()[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.attributeMap()[weightIndex].toDouble()[0])
                     except:
                         weight = 1.00
                 geom = QgsGeometry(feat.geometry())
                 geom = ftools_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.addAttribute(0, QVariant(cx))
         outfeat.addAttribute(1, QVariant(cy))
         outfeat.addAttribute(2, QVariant(j))
         writer.addFeature(outfeat)
         if single:
             break
     del writer
Beispiel #6
0
 def processAlgorithm(self, progress):
     vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(MeanCoords.POINTS))
     weightField = self.getParameterValue(MeanCoords.WEIGHT)
     uniqueField = self.getParameterValue(MeanCoords.UID)
     provider = vlayer.dataProvider()
     weightIndex = provider.fieldNameIndex(weightField)
     uniqueIndex = provider.fieldNameIndex(uniqueField)
     feat = QgsFeature()
     allAttrs = provider.attributeIndexes()
     provider.select(allAttrs)
     sRs = provider.crs()
     if uniqueIndex <> -1:
         uniqueValues = ftools_utils.getUniqueValues(provider, int( uniqueIndex ) )
         single = False
     else:
         uniqueValues = [QVariant(1)]
         single = True
     fieldList = { 0 : QgsField("MEAN_X", QVariant.Double), 1 : QgsField("MEAN_Y", QVariant.Double), 2 : QgsField("UID", QVariant.String)  }
     writer = self.getOutputFromName(MeanCoords.OUTPUT).getVectorWriter(fieldList, QGis.WKBPoint, sRs)
     outfeat = QgsFeature()
     points = []
     weights = []
     nFeat = provider.featureCount() * len(uniqueValues)
     nElement = 0
     for j in uniqueValues:
         provider.rewind()
         provider.select(allAttrs)
         cx = 0.00
         cy = 0.00
         points = []
         weights = []
         while provider.nextFeature(feat):
             nElement += 1
             progress.setPercentage(nElement/nFeat * 100)
             if single:
                 check = j.toString().trimmed()
             else:
                 check = feat.attributeMap()[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.attributeMap()[weightIndex].toDouble()[0])
                     except:
                         weight = 1.00
                 geom = QgsGeometry(feat.geometry())
                 geom = ftools_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.addAttribute(0, QVariant(cx))
         outfeat.addAttribute(1, QVariant(cy))
         outfeat.addAttribute(2, QVariant(j))
         writer.addFeature(outfeat)
         if single:
             break
     del writer
Beispiel #7
0
 def processAlgorithm(self, progress):
     
         currentPath = os.path.dirname(os.path.abspath(__file__))
         
         perc=self.getParameterValue(href.PERCENT)
         if perc > 100:
             perc=100
         res=50
         
         field = self.getParameterValue(href.FIELD)
         vlayerA = QGisLayers.getObjectFromUri(self.getParameterValue(href.INPUT))
         self.epsg = vlayerA.crs().srsid()
         GEOS_EXCEPT = True
         FEATURE_EXCEPT = True
         vproviderA = vlayerA.dataProvider()
         name = vlayerA.name()
         allAttrsA = vproviderA.attributeIndexes()
         try:
             vproviderA.select(allAttrsA)
         except:
             pass
         try:
             fields = { 0 : QgsField("ID", QVariant.String),
                         1 : QgsField("Area",  QVariant.Double),
                         2 : QgsField("Perim", QVariant.Double)  
                          }
             writer = self.getOutputFromName(href.OUTPUT).getVectorWriter(fields, QGis.WKBPolygon, vproviderA.crs())
         except:
             fields = [QgsField("ID", QVariant.String),
                      QgsField("Area",  QVariant.Double),
                      QgsField("Perim", QVariant.Double) 
                      ]
             writer = self.getOutputFromName(href.OUTPUT).getVectorWriter(fields, QGis.WKBPolygon, vproviderA.crs())
         inFeat = QgsFeature()
         outFeat = QgsFeature()
         inGeom = QgsGeometry()
         outGeom = QgsGeometry()
         index = vproviderA.fieldNameIndex(field)
         features = QGisLayers.features(vlayerA)
         nFeat = len(features)
         unique = ftools_utils.getUniqueValues(vproviderA, index)
         nFeat = nFeat * len(unique)
         progress_perc= 100/len(unique)
         n = 0
         outID = 0
         
         
         
         for i in unique:
               nElement=0
               xPoints = []
               yPoints = []
               first = True
               try:
                   vproviderA.select(allAttrsA)
               except:
                   pass
               features = QGisLayers.features(vlayerA)
               for inFeat in features:
                   
                 try:
                     atMap = inFeat.attributeMap()
                 except:
                     atMap = inFeat.attributes()
                 idVar = atMap[ index ]
                 if idVar.toString().trimmed() == i.toString().trimmed():
                     nElement += 1
                     inGeom = QgsGeometry( inFeat.geometry() )
                     points = ftools_utils.extractPoints( inGeom )
                     xPoints.append(points[0].x())
                     yPoints.append(points[0].y())
               if len(xPoints) == 0: #number of selected features
                   continue    
               xmin = min(xPoints) - 0.5*(max(xPoints)-min(xPoints))
               xmax = max(xPoints) + 0.5*(max(xPoints)-min(xPoints))
               ymin = min(yPoints) - 0.5*(max(yPoints)-min(yPoints))
               ymax = max(yPoints) + 0.5*(max(yPoints)-min(yPoints))
               X,Y = np.mgrid[xmin:xmax:complex(res), ymin:ymax:complex(res)]
               positions = np.vstack([X.ravel(), Y.ravel()])  
               values = np.vstack([xPoints,yPoints])
               # scipy.stats.kde.gaussian_kde -- 
               # Representation of a kernel-density estimate using Gaussian kernels.
               kernel = stats.kde.gaussian_kde(values)
               Z = np.reshape(kernel(positions).T, X.T.shape)
               
               raster_name = str(name)+'_'+str(perc)+'_'+str(i.toString())+ '_'+str(datetime.date.today())
               int = str(((100.0-perc)/2))
              
               self.to_geotiff(currentPath+'/raster_output/'+raster_name, xmin,xmax,ymin,ymax,X,Y, Z) 
               
               if SextanteUtils.isWindows():
                   os.system("gdal_contour.exe "+currentPath+"/raster_output/" +raster_name+" -a values -fl " + int + " " + currentPath+"/c"+str(n)+".shp")
               else:
                   os.system("gdal_contour "+currentPath+"/raster_output/" +raster_name+" -a values -fl " + int + " " + currentPath+"/c"+str(n)+".shp")
               layer = QgsVectorLayer(currentPath+"/c"+str(n)+".shp", "c"+str(n), "ogr")
                  
               
               provider = layer.dataProvider()
 
               feat = QgsFeature()
               allAttrs = provider.attributeIndexes()
               try:
                   provider.select(allAttrs)
               except:
                   pass
               caps = layer.dataProvider().capabilities()
               fldDesc = provider.fieldNameIndex("values")
               arrayid=[]
               polyGeom = []
               feature_list = []
               multi_feature = []
               area = 0
               perim = 0
               measure = QgsDistanceArea()
               try:
                   while provider.nextFeature( feat ):
                 
                         id = feat.id()
                         attrs = feat.attributeMap()
                         outGeom = feat.geometry().asPolyline()
                         perim=perim + measure.measurePerimeter(QgsGeometry.fromPolygon([outGeom]))
                         area=area + measure.measure(QgsGeometry.fromPolygon([outGeom]))
                         polyGeom.append(outGeom) 
               except:
                     features = QGisLayers.features(layer)
                     for feat in features:
                         id = feat.id()
                         attrs = feat.attributes()
                         outGeom = feat.geometry().asPolyline()
                         perim=perim + measure.measurePerimeter(QgsGeometry.fromPolygon([outGeom]))
                         area=area + measure.measure(QgsGeometry.fromPolygon([outGeom]))
                         polyGeom.append(outGeom)
        
               outFeat.setGeometry(QgsGeometry.fromPolygon(polyGeom))
               try:
                   outFeat.addAttribute( 0, QVariant( i.toString() ) )
                   outFeat.addAttribute( 1, QVariant( area ) )
                   outFeat.addAttribute( 2, QVariant( perim ) )
                  
               
               except:
                  
                   outFeat.setAttributes([QVariant(i.toString()),QVariant(area),QVariant(perim)])
               writer.addFeature(outFeat)
               outID+=1
               layer.dataProvider().deleteFeatures(arrayid)                     
               if SextanteUtils.isWindows():
                   os.system('del '+currentPath+'/c'+str(n)+'.*')
               else:
                   os.system('rm '+currentPath+'/c'+str(n)+'.*')
               
               
               n+=1
               progress.setPercentage(progress_perc*n)  
               
         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")
Beispiel #8
0
    def processAlgorithm(self, progress):
        useSelection = self.getParameterValue(ConvexHull.USE_SELECTED)
        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 = {
            0: QgsField("ID", QVariant.Int),
            1: QgsField("Area", QVariant.Double),
            2: 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)
        # there is selection in input layer
        if useSelection:
            nFeat = vlayerA.selectedFeatureCount()
            selectionA = vlayerA.selectedFeatures()
            if useField:
                unique = ftools_utils.getUniqueValues(vproviderA, index)
                nFeat = nFeat * len(unique)
                for i in unique:
                    hull = []
                    first = True
                    outID = 0
                    for inFeat in selectionA:
                        atMap = inFeat.attributeMap()
                        idVar = atMap[index]
                        if idVar.toString().trimmed() == i.toString().trimmed(
                        ):
                            if first:
                                outID = idVar
                                first = False
                            inGeom = QgsGeometry(inFeat.geometry())
                            points = ftools_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 = []
                for inFeat in selectionA:
                    inGeom = QgsGeometry(inFeat.geometry())
                    points = ftools_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)
                    writer.addFeature(outFeat)
                except:
                    GEOS_EXCEPT = False
        # there is no selection in input layer
        else:
            rect = vlayerA.extent()
            nFeat = vproviderA.featureCount()
            if useField:
                unique = ftools_utils.getUniqueValues(vproviderA, index)
                nFeat = nFeat * len(unique)
                for i in unique:
                    hull = []
                    first = True
                    outID = 0
                    vproviderA.select(allAttrsA)  #, rect )
                    #vproviderA.rewind()
                    while vproviderA.nextFeature(inFeat):
                        atMap = inFeat.attributeMap()
                        idVar = atMap[index]
                        if idVar.toString().trimmed() == i.toString().trimmed(
                        ):
                            if first:
                                outID = idVar
                                first = False
                            inGeom = QgsGeometry(inFeat.geometry())
                            points = ftools_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.rewind()
                vproviderA.select(allAttrsA)
                while vproviderA.nextFeature(inFeat):
                    inGeom = QgsGeometry(inFeat.geometry())
                    points = ftools_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)
                    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")
Beispiel #9
0
    def processAlgorithm(self, progress):
       
        
        perc=self.getParameterValue(mcp.PERCENT)
        field = self.getParameterValue(mcp.FIELD)
        vlayerA = QGisLayers.getObjectFromUri(self.getParameterValue(mcp.INPUT))
        GEOS_EXCEPT = True
        FEATURE_EXCEPT = True
        vproviderA = vlayerA.dataProvider()
        allAttrsA = vproviderA.attributeIndexes()
        try:
                vproviderA.select(allAttrsA)
        except:
                pass
        try:
                fields = { 0 : QgsField("ID", QVariant.String),
                            1 : QgsField("Area",  QVariant.Double),
                            2 : QgsField("Perim", QVariant.Double)  
                          }
                writer = self.getOutputFromName(mcp.OUTPUT).getVectorWriter(fields, QGis.WKBPolygon, vproviderA.crs())
        except:
                fields = [QgsField("ID", QVariant.String),
                         QgsField("Area",  QVariant.Double),
                         QgsField("Perim", QVariant.Double) 
                         ]
                writer = self.getOutputFromName(mcp.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)
        unique = ftools_utils.getUniqueValues(vproviderA, index)
        nFeat = nFeat * len(unique)
        progress_perc=100/len(unique)
        n = 0
        for i in unique:
             
              nElement=0
              hull = []
              cx = 0.00 #x of mean coodinate
              cy = 0.00 #y of mean coordinate
              first = True
              nf = 0
              try:
                  vproviderA.select(allAttrsA)
              except:
                  pass
              try:
                  while vproviderA.nextFeature(inFeat):
                      atMap = inFeat.attributeMap()
                      idVar = atMap[ index ]
                      if idVar.toString().trimmed() == i.toString().trimmed():
                         inGeom = QgsGeometry( inFeat.geometry() )
                         points = ftools_utils.extractPoints( inGeom )
                         cx += points[0].x()
                         cy += points[0].y()
                         nf+=1
              except:
                  features = QGisLayers.features(vlayerA)
                  for feat in features:
                      atMap = feat.attributes()
                      idVar = atMap[ index ]
                      if idVar.toString().trimmed() == i.toString().trimmed():
                         inGeom = QgsGeometry( feat.geometry() )
                         points = ftools_utils.extractPoints( inGeom )
                         cx += points[0].x()
                         cy += points[0].y()
                         nf+=1
                      
              cx=(cx / nf)
              cy=(cy / nf)
              meanPoint = QgsPoint(cx, cy)
              distArea = QgsDistanceArea()
              dist={}
              features = QGisLayers.features(vlayerA)
              for inFeat in features:
                try:  
                    atMap = inFeat.attributeMap()
                except:
                    atMap = inFeat.attributes()
                idVar = atMap[ index ]
                if idVar.toString().trimmed() == i.toString().trimmed():
                  if first:
                    first = False
                  nElement += 1
                  inGeom = QgsGeometry( inFeat.geometry() )
                  dis_meas = distArea.measureLine(meanPoint, inGeom.asPoint())
                  dist[dis_meas]= inGeom
                  if perc == 100:
                      points = ftools_utils.extractPoints( inGeom )
                      hull.extend( points )
              if perc <> 100:
                  if perc > 100:
                      perc = 100
                      SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Please insert a valid percentage (0-100%)")
             
                  hull=self.percpoints(perc,dist,nElement)
                  
              if len( hull ) >= 3:
                nfeat = len(hull) * perc / 100
                tmpGeom = QgsGeometry( outGeom.fromMultiPoint( hull ) )
                try:
                  outGeom = tmpGeom.convexHull()
                  outFeat.setGeometry( outGeom )
                  measure = QgsDistanceArea()
                  perim=measure.measurePerimeter(outGeom)
                  area=measure.measure(outGeom)
                  try:
                      outFeat.addAttribute( 0, QVariant( i.toString() ) )
                      outFeat.addAttribute( 1, QVariant( area ) )
                      outFeat.addAttribute( 2, QVariant( perim ) )
                  except:
                      outFeat.setAttributes([QVariant(i.toString()),QVariant(area),QVariant(perim)])
                  writer.addFeature( outFeat )
                  
                  
                except:
                  GEOS_EXCEPT = False
                  continue
              n+=1
              progress.setPercentage(progress_perc*n)
            
        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")
Beispiel #10
0
    def processAlgorithm(self, progress):
        useSelection = self.getParameterValue(ConvexHull.USE_SELECTED)
        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 = { 0 : QgsField("ID", QVariant.Int),
                    1 : QgsField("Area",  QVariant.Double),
                    2 : 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)
        # there is selection in input layer
        if useSelection:
          nFeat = vlayerA.selectedFeatureCount()
          selectionA = vlayerA.selectedFeatures()
          if useField:
            unique = ftools_utils.getUniqueValues( vproviderA, index )
            nFeat = nFeat * len( unique )
            for i in unique:
              hull = []
              first = True
              outID = 0
              for inFeat in selectionA:
                atMap = inFeat.attributeMap()
                idVar = atMap[ index ]
                if idVar.toString().trimmed() == i.toString().trimmed():
                  if first:
                    outID = idVar
                    first = False
                  inGeom = QgsGeometry( inFeat.geometry() )
                  points = ftools_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 = []
            for inFeat in selectionA:
              inGeom = QgsGeometry( inFeat.geometry() )
              points = ftools_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 )
              writer.addFeature( outFeat )
            except:
              GEOS_EXCEPT = False
        # there is no selection in input layer
        else:
          rect = vlayerA.extent()
          nFeat = vproviderA.featureCount()
          if useField:
            unique = ftools_utils.getUniqueValues( vproviderA, index )
            nFeat = nFeat * len( unique )
            for i in unique:
              hull = []
              first = True
              outID = 0
              vproviderA.select( allAttrsA )#, rect )
              #vproviderA.rewind()
              while vproviderA.nextFeature( inFeat ):
                atMap = inFeat.attributeMap()
                idVar = atMap[ index ]
                if idVar.toString().trimmed() == i.toString().trimmed():
                  if first:
                    outID = idVar
                    first = False
                  inGeom = QgsGeometry( inFeat.geometry() )
                  points = ftools_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.rewind()
            vproviderA.select(allAttrsA)
            while vproviderA.nextFeature( inFeat ):
              inGeom = QgsGeometry( inFeat.geometry() )
              points = ftools_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 )
              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")