My goal is a Plugin, which selects the feature where i have clicked. Moreover it takes all features (rings(other polygones), and lines) which are inside.The results should be following:Reshape the polygone where i have click in according its sub-features.
What is the smartest sollution?I try a lot. An request with spatial indices and without.
My strategy:
def canvasReleaseEvent(self, mouseEvent): layerData = [] #resultl = QgsVectorLayer("Polygon", "result", "memory") #resultpr = resultl.dataProvider() #QgsMapLayerRegistry.instance().addMapLayer(resultl) #listpoint = [] #listpoly = [] for layer in self.canvas.layers(): if layer.type() != QgsMapLayer.VectorLayer: # Ignore this layer as it's not a vector continue if layer.featureCount() == 0: # There are no features - skip continue layer.removeSelection() # Determine the location of the click in real-world coords layerPoint = self.toLayerCoordinates( layer, mouseEvent.pos() ) #shortestDistance = float("inf") #polypointgeometry = -1 #foo = geometry() # spatial # Create a dictionary of all features #feature_dict = {f.id(): f for f in layer.getFeatures()} # Build a spatial index # for f in feature_dict.values(): # index.insertFeature(f) # Select all features along with their attributes #allAttrs = layer.pendingAllAttributesList() #layer.select(allAttrs) #polygons = [feature for feature in layer.getFeatures()] #index = QgsSpatialIndex() for poly in layer.getFeatures(): if QgsGeometry.fromPoint( layerPoint).intersects(poly.geometry()): layerData.append(poly.geometry()) #print layerData[::2] abc = layerData[::2] for poly in layer.getFeatures(): if poly.geometry().intersects(layerData[::2]): intersection=poly.geometry().intersection(abc) #print len(layerData) #for poly in layer.getFeatures(): # if poly.geometry().intersects(listpoint[0]): # listpoly.append(poly.geometry()) # len(listpoly) #for poly in polygons: #index.insertFeature(poly) # Loop through all features in the layer #for f in feature_dict.values(): #print 'Working on %s' % f.id() #if f.geometry().intersects( QgsGeometry.fromPoint( layerPoint) ): #if dist < shortestDistance: # shortestDistance = dist #point_id=f.id() #foo = index.nearestNeighbor(layerPoint,10) #print len(foo) #print polygons[x].geometry().area() # Plot Attributes #print foo[0] #print foo #print polygons[359].geometry() #print polygons[0].geometry() #featureId = foo[0] #print polygons[featureId].geometry #fit2 = layer.getFeatures(QgsFeatureRequest().setFilterFid(featureId)) #ftr = QgsFeature() #fit2.nextFeature(ftr) # print test.geometry() #print ftr.attributes() #print ftr.geometry() #print layer.dataProvider().capabilitiesString() #foo2 = index.intersects(ftr.geometry().boundingBox()) #editpoly = ftr.geometry().intersection(polygons.geometry()) #index.intersects(QgsRectangle( layerPoint,layerPoint) ) #if index.intersects(QgsGeometry.fromPoint( layerPoint).boundingBox() ): # print in_id # foo=index.nearestNeighbor(layerPoint, 1) #print foo #for i in index.intersects(QgsGeometry.fromPoint( layerPoint).boundingBox() ): # print polygons.geometry().area() ##print point_poly_id #for poly in polygons: # for id in point_poly_id: # f = polygons[id] # if f == poly: continue # if f.geometry().intersects(QgsGeometry.fromPoint(layerPoint)): # print f.id() #for id in point_poly_ids: #f = polygons[id] #if f == feature: continue #touches = f.geometry().touches(feature.geometry()) #for i in point_poly_id: # a = feature_dict # if a == f: continue # puppi= a.geometry().intersection(f.geometry()) #info = (layer, closestFeatureId, shortestDistance) #layerData.append(info) #self.canvas.layers.setSelectedFeatures(test) #for f in layer.get Features() # f.geometry().intersection(f.setSelectedFeatures(point_id) # namesi= f.names() #print(closestFeatureId) #for f in layer getFeatures(): # if f.geometry().intersects(layer.getFeatures[listpoint[1]].geometry() ): #listpoly.append(f.geometry()) #print len(listpoint) #print layers[0].selectedFeatureCount() #It was selected #print layers[1].featureCount() #for i in layer.getFeatures(): # if listpoint[0].intersects(i.geometry()): # listpoly.append(i.geometry()) #info = (layer, closestFeatureId) #layerData.append(info) #if not len(layerData) > 0: # Looks like no vector layers were found - do nothing # return #print listpoly[1].geometry() # Sort the layer information by shortest distance #layerData.sort( key=lambda element: element[2] ) # Select the closest feature #layerWithClosestFeature, closestFeatureId=layerData[0] #layerWithClosestFeature.select( closestFeatureId )
أكثر...
What is the smartest sollution?I try a lot. An request with spatial indices and without.
My strategy:
- Indentify polygon where i clicked
- Take polygon from 1.) intersects with rest.
- Transform result from 2.) to multistring and reshape geometry 1) with that
- Use geometry from 3.) to modify geometry from 1.)
def canvasReleaseEvent(self, mouseEvent): layerData = [] #resultl = QgsVectorLayer("Polygon", "result", "memory") #resultpr = resultl.dataProvider() #QgsMapLayerRegistry.instance().addMapLayer(resultl) #listpoint = [] #listpoly = [] for layer in self.canvas.layers(): if layer.type() != QgsMapLayer.VectorLayer: # Ignore this layer as it's not a vector continue if layer.featureCount() == 0: # There are no features - skip continue layer.removeSelection() # Determine the location of the click in real-world coords layerPoint = self.toLayerCoordinates( layer, mouseEvent.pos() ) #shortestDistance = float("inf") #polypointgeometry = -1 #foo = geometry() # spatial # Create a dictionary of all features #feature_dict = {f.id(): f for f in layer.getFeatures()} # Build a spatial index # for f in feature_dict.values(): # index.insertFeature(f) # Select all features along with their attributes #allAttrs = layer.pendingAllAttributesList() #layer.select(allAttrs) #polygons = [feature for feature in layer.getFeatures()] #index = QgsSpatialIndex() for poly in layer.getFeatures(): if QgsGeometry.fromPoint( layerPoint).intersects(poly.geometry()): layerData.append(poly.geometry()) #print layerData[::2] abc = layerData[::2] for poly in layer.getFeatures(): if poly.geometry().intersects(layerData[::2]): intersection=poly.geometry().intersection(abc) #print len(layerData) #for poly in layer.getFeatures(): # if poly.geometry().intersects(listpoint[0]): # listpoly.append(poly.geometry()) # len(listpoly) #for poly in polygons: #index.insertFeature(poly) # Loop through all features in the layer #for f in feature_dict.values(): #print 'Working on %s' % f.id() #if f.geometry().intersects( QgsGeometry.fromPoint( layerPoint) ): #if dist < shortestDistance: # shortestDistance = dist #point_id=f.id() #foo = index.nearestNeighbor(layerPoint,10) #print len(foo) #print polygons[x].geometry().area() # Plot Attributes #print foo[0] #print foo #print polygons[359].geometry() #print polygons[0].geometry() #featureId = foo[0] #print polygons[featureId].geometry #fit2 = layer.getFeatures(QgsFeatureRequest().setFilterFid(featureId)) #ftr = QgsFeature() #fit2.nextFeature(ftr) # print test.geometry() #print ftr.attributes() #print ftr.geometry() #print layer.dataProvider().capabilitiesString() #foo2 = index.intersects(ftr.geometry().boundingBox()) #editpoly = ftr.geometry().intersection(polygons.geometry()) #index.intersects(QgsRectangle( layerPoint,layerPoint) ) #if index.intersects(QgsGeometry.fromPoint( layerPoint).boundingBox() ): # print in_id # foo=index.nearestNeighbor(layerPoint, 1) #print foo #for i in index.intersects(QgsGeometry.fromPoint( layerPoint).boundingBox() ): # print polygons.geometry().area() ##print point_poly_id #for poly in polygons: # for id in point_poly_id: # f = polygons[id] # if f == poly: continue # if f.geometry().intersects(QgsGeometry.fromPoint(layerPoint)): # print f.id() #for id in point_poly_ids: #f = polygons[id] #if f == feature: continue #touches = f.geometry().touches(feature.geometry()) #for i in point_poly_id: # a = feature_dict # if a == f: continue # puppi= a.geometry().intersection(f.geometry()) #info = (layer, closestFeatureId, shortestDistance) #layerData.append(info) #self.canvas.layers.setSelectedFeatures(test) #for f in layer.get Features() # f.geometry().intersection(f.setSelectedFeatures(point_id) # namesi= f.names() #print(closestFeatureId) #for f in layer getFeatures(): # if f.geometry().intersects(layer.getFeatures[listpoint[1]].geometry() ): #listpoly.append(f.geometry()) #print len(listpoint) #print layers[0].selectedFeatureCount() #It was selected #print layers[1].featureCount() #for i in layer.getFeatures(): # if listpoint[0].intersects(i.geometry()): # listpoly.append(i.geometry()) #info = (layer, closestFeatureId) #layerData.append(info) #if not len(layerData) > 0: # Looks like no vector layers were found - do nothing # return #print listpoly[1].geometry() # Sort the layer information by shortest distance #layerData.sort( key=lambda element: element[2] ) # Select the closest feature #layerWithClosestFeature, closestFeatureId=layerData[0] #layerWithClosestFeature.select( closestFeatureId )
أكثر...