2

The following Python code is very helpful to reverse the direction of lines in QGIS:

layer = qgis.utils.iface.mapCanvas().currentLayer()
for feature in layer.selectedFeatures():
   geom = feature.geometry()
   nodes = geom.asPolyline()
   nodes.reverse() 
   newgeom = QgsGeometry.fromPolyline(nodes)
   layer.changeGeometry(feature.id(),newgeom)

(see https://gis.stackexchange.com/a/9285/77061)

Unfortunately, the code doesn't work for polygons. Replacing asPolyline() and fromPolyline(nodes) with asPolygon() and fromPolygon(nodes) hasn't helped. Is there a Python code that works for polygons?

if layer.geometryType() == 2:
    # ?

Edit:

For PostGIS and most likely some other data providers it's possible to digitize polygons clockwise and counter-clockwise. Creating a marker line symbology (e.g. triangle) for such layer may result in inward and outward rotated markers. So I want to reverse the direction of the anti-clockwise digitized polygons through the Python console.

enter image description here

closed as unclear what you're asking by Vince, whyzar, Midavalo Mar 19 '17 at 16:18

Please clarify your specific problem or add additional details to highlight exactly what you need. As it's currently written, it’s hard to tell exactly what you're asking. See the How to Ask page for help clarifying this question. If this question can be reworded to fit the rules in the help center, please edit the question.

  • 1
    There is no such thing as reversed polygon. Outer ring vertices go clockwise. – FelixIP Mar 19 '17 at 9:00
  • 1
    As far as I know, this depends on the data provider. In PostGIS it's possible to create polygon vertices clockwise and anti-clockwise. – eclipsed_by_the_moon Mar 19 '17 at 9:05
  • Internal handling of polygons in QGIS is uniform as far as I know. Drivers turn direction when data are saved if needed. – user30184 Mar 19 '17 at 9:27
  • 2
    Is it please possible to tell us why you want it? – Miro Mar 19 '17 at 11:10
  • Shapefile outer rings are clockwise; other data formats use left hand rule. If you succeed in flipping polygons to the incorrect orientation, you will likely cause random geometry manipulation failures. This goal is self-defeating. – Vince Mar 19 '17 at 11:17
2

This code works for polygons but, 'changeGeometry' method has no effect even in edit mode. It's necessary to create a new geometry as memory layer.

layer = iface.mapCanvas().currentLayer()

new_geom = []

for feature in layer.getFeatures():
    geom = feature.geometry()
    nodes = geom.asPolygon()
    print nodes
    nodes[0].reverse()
    print nodes
    new_geom.append(QgsGeometry.fromPolygon(nodes).asPolygon())
    print layer.changeGeometry(feature.id(), newgeom)

epsg = layer.crs().postgisSrid()

uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           'polygon',
                           'memory')

prov = mem_layer.dataProvider()

feats = [ QgsFeature() for i in range(len(new_geom)) ]

for i, feat in enumerate(feats):
    feat.setAttributes([i])
    feat.setGeometry(QgsGeometry.fromPolygon(new_geom[i]))

prov.addFeatures(feats)

polygon_memlayer = [ feat.geometry().asPolygon() 
                     for feat in mem_layer.getFeatures() ]

print polygon_memlayer

After running the code at the Python Console of QGIS with this shapefile:

enter image description here

it could be observed, at Python Console, that the node order was effectively reversed.

enter image description here

Not the answer you're looking for? Browse other questions tagged or ask your own question.