Suite

Quel est l'inverse de QgsGeometry.asGeometryCollection() dans qgis python ?

Quel est l'inverse de QgsGeometry.asGeometryCollection() dans qgis python ?


Quelle est l'opération inverse de QgsGeometry.asGeometryCollection() comme documenté ici : http://qgis.org/api/classQgsGeometry.html#a7cb1cbf8cfa441456067a66ad3a25a94

J'aimerais faire quelque chose comme :

depuis qgis.core import (QgsFeature, QgsGeometry, QgsVectorLayer, QgsMapLayerRegistry, QgsField) depuis PyQt4.QtCore import QVariant depuis qgis.utils import iface import math def myFunction(arg) : return arg layer=iface.mapCanvas feature().current = layer.selectedFeatures()[0] geom = feature.geometry() if geom.isMultipart() : newgeom=QgsGeometry.INVERSE([myFunction(part) pour une partie dans geom.asGeometryCollection ()]) else : newgeom=myFunction( geom) changeGeometry(feature.id(),newgeom)

Choses qui ne fonctionnent pas :

# ne fonctionne pas : newgeom=QgsGeometry.combine([partie pour partie dans geom.asGeometryCollection ()]) # ne fonctionne pas : newgeom=([partie pour partie dans geom.asGeometryCollection ()]) # ne fonctionne pas : newgeom = [partie pour partie dans geom.asGeometryCollection()] # ne fonctionne pas : l'argument 1 a un type inattendu 'list' newgeom = QgsGeometry.fromPolyline([partie pour partie dans geom.asGeometryCollection()]) # QgsGeometry n'a pas attribut 'MultiPolyline' : newgeom = QgsGeometry.MultiPolyline([partie pour partie dans geom.asGeometryCollection()]) # MuliPolyline n'est pas définie : newgeom = MultiPolyline([partie pour partie dans geom.asGeometryCollection()]) newgeom = QgsGeometry.fromMultiPolyline ([partie pour partie dans geom.asGeometryCollection()]) newgeom = QgsGeometry.fromMultiPolyline([partie.asPolyline pour partie dans geom.asGeometryCollection()]) newgeom = QgsGeometry.fromMultiPolyline([part.asPolyline pour partie dans geom]) newgeom = QgsGeometry.fromMultiPolyline([part.asPolyline pour la partie dans geom.asMultiPolyline()])

Fonctionne avec les polylignes/chaînes de lignes :

newgeom = QgsGeometry.fromMultiPolyline([partie pour partie dans geom.asMultiPolyline()]) newgeom = QgsGeometry.fromMultiPolyline([userFunction(partie,*args).asPolyline() pour partie dans geom.asGeometryCollection()])

http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/geometry.html contient de la documentation sur l'accès et la création des différents types. http://qgis.org/api/classQGis.html répertorie les énumérations des types WKB* et des types de géométrie simple.

Il semble que chaque type multipart doit être traité séparément, et les types multi-* ne peuvent pas être désassemblés et réassemblés généralement. En d'autres termes, vous devez épeler et traiter les géométries individuelles séparément, comme :

parts = ([userFunction(part,*args) for part in geom.asGeometryCollection()]) if geom.wkbType() == Qgis.WKBMultiLineString: newgeom= QgsGeometry.fromMultiPolyline([x.asPolyline() for x in parts] ) elif geom.wkbType() == QGis.WKBMultiPolygon: newgeom= QgsGeometry.fromMultiPolygon([x.asPolygon() pour x en parties]) elif geom.wkbType() == QGis.WKBLineString25D: newgeom= QgsGeoline.from( x.asPolyline25D() pour x en parties]) elif geom.wkbType() == QGis.WKBMultiPolygon25D: newgeom= QgsGeometry.fromMultiPolygon25D([x.asPolygon25D() pour x en parties])… layer.changeGeometry(feature.id( ),nouveau)

Existe-t-il une fonction ou une combinaison de fonctions qui simplifierait ce qui précède ? Quelque chose comme:

newgeom = CAST_AS_GEOMETRY_TYPE([partie pour partie dans geom.asGeometryCollection()],geom.WKBType())

QgsVectorLayer.changeGeometry La fonction peut être utilisée pour mettre à jour la géométrie après avoir combiné les géométries manipulées pour former une géométrie unique.

if geom.isMultipart() : geomColl = geom.asGeometryCollection() tempGeom = QgsGeometry() pour g dans geomColl : #g est QgsGeometry g2 = reverseDirection(g) # votre fonction pour manipuler la géométrie tempGeom = tempGeom.combine(g2); layer.changeGeometry(feature.id(),tempGeom)

Voir la vidéo: QGIS - Clipper - Clip Raster with shapefile boundary