How do you get/extract the points that define a shapely polygon?
Thanks!
Example of a shapely polygon
from shapely.geometry import Polygon
# Create polygon from lists of points
x = [list of x vals]
y = [list of y vals]
polygon = Polygon(x,y)
How do you get/extract the points that define a shapely polygon?
Thanks!
Example of a shapely polygon
from shapely.geometry import Polygon
# Create polygon from lists of points
x = [list of x vals]
y = [list of y vals]
polygon = Polygon(x,y)
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].
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)]
If you really want the shapely point objects that make up the polygon, and not just tuples of coordinates, you can do that this way:
points = MultiPoint(polygon.boundary.coords)
You can use any of the two following methods.
1)
p = Polygon([(1,0),(1,1),(0,1),(0,0)])
for x,y in p.exterior.coords:
print(x,y)
The above code prints the following. Note that (1,0) is printed twice, since exterior.coords returns an ordered sequence that completes the polygon.
1.0 0.0
1.0 1.0
0.0 1.0
0.0 0.0
1.0 0.0
2)
p.exterior.coords.xy
It outputs the following
(array('d', [1.0, 1.0, 0.0, 0.0, 1.0]), array('d', [0.0, 1.0, 1.0, 0.0, 0.0]))
d0=[]
for n in range(0,len(gdf1['geometry'])):
try:
k=(len(gdf1['geometry'][n].geoms))
ce+=1
except:
d0.append(n)