11

Given a shapefile with polygons, how do I convert the polygons to individual lines instead? I know how to do this in QGIS, but I'm looking for a Shapely function which does the same thing.

nmtoken
  • 13,355
  • 5
  • 38
  • 87

2 Answers2

13

bugmenot123 is ok but I find easier use the boundary of the polygons. If you have a multipolygon or a polygon with holes the boundary returns a multilinestrig, if you have a polygon without holes the boundary returns a linestring.

Here is a simple example so you can see how it works:

import shapely
from shapely.geometry import MultiPolygon, Point

pol1 = MultiPolygon([Point(0, 0).buffer(2.0), Point(1, 1).buffer(2.0)]) pol2 = Point(7, 8).buffer(1.0) pols = [pol1, pol2]

lines = [] for pol in pols: boundary = pol.boundary if boundary.type == 'MultiLineString': for line in boundary: lines.append(line) else: lines.append(boundary)

for line in lines: print line.wkt

Georgy
  • 158
  • 7
César Argul García
  • 2,440
  • 20
  • 32
2

According to https://shapely.readthedocs.io/en/stable/manual.html#polygons:

  • You can get the outer ring of a Polygon via its exterior property.
  • You can get a list of the inner rings via its interior property.

According to https://shapely.readthedocs.io/en/stable/manual.html#collections-of-polygons:

  • For a MultiPolygon you can iterate over its Polygon members via iterating via in or list() or explicitely using its geoms property.

Collect all the rings and you have the lines.

bugmenot123
  • 11,011
  • 3
  • 34
  • 69