Supervisor needed: Get feature where mouseclick and reshape

المشرف العام

Administrator
طاقم الإدارة
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:

  1. Indentify polygon where i clicked
  2. Take polygon from 1.) intersects with rest.
  3. Transform result from 2.) to multistring and reshape geometry 1) with that
  4. Use geometry from 3.) to modify geometry from 1.)
I did a lot of Coding. For me python is a new challange:After all i tried to use spatial index. But with this approach likeindex.nearestNeighbor(layerPoint, 1) or index.intersects(QgsGeometry.fromPoint( layerPoint).boundingBox() )i always getting feautres next by the point. Maybe someone can give me some usefull hints.Thanks.

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 )

أكثر...
 
أعلى