Extract points/coordinates from a polygon in Shapely
Solution 1:
So, I discovered the trick is to use a combination of the Polygon
class methods to achieve this.
If you want geodesic coordinates, you then need to transform these back to WGS84 (via pyproj
, matplotlib
's basemap
, or something).
from shapely.geometry import Polygon
#Create polygon from lists of points
x = [list of x vals]
y = [list of y vals]
some_poly = Polygon(x,y)
# Extract the point values that define the perimeter of the polygon
x, y = some_poly.exterior.coords.xy
Solution 2:
It took me a while to learn that a Polygon has an exterior boundary and possibly several interior boundaries. I am posting here because some of the answers don't reflect that distinction, though to be fair the original post did not use as an example a polygon with interior boundaries.
The points forming the exterior boundary are arranged in a CoordinateSequence, which can be obtained as
polygon.exterior.coords
You can find the length of this object using len(polygon.exterior.coords)
and can index the object like a list. To get the first vertex, for example, use polygon.exterior.coords[0]
. Note that the first and last points are the same; if you want a list consisting of the vertices without that repeated point, use polygon.exterior.coords[:-1]
.
You can convert the CoordinateSequence (including the repeated vertex) to a list of points thus:
list(polygon.exterior.coords)
Similarly, the CoordinateSequence consisting of the vertices forming the first interior boundary is obtained as polygon.interiors[0].coords
, and the list of those vertices (without the repeated point) is obtained as polygon.interiors[0].coords[:-1]
.
Solution 3:
You can use the shapely mapping
function:
>>> from shapely.geometry import Polygon, mapping
>>> sh_polygon = Polygon(((0,0), (1,1), (0,1)))
>>> mapping(sh_polygon)
{'type': 'Polygon', 'coordinates': (((0.0, 0.0), (1.0, 1.0), (0.0, 1.0), (0.0, 0.0)),)}
Solution 4:
I used this:
list(zip(*p.exterior.coords.xy))
Polygon created with: p = Polygon([(0,0),(1,1),(1,0),(0,0)])
returns:
[(0.0, 0.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)]