如何获取/提取定义shapely polygon
的点?谢谢!
shapely 多边形的示例
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)
Polygon
类的方法组合:from shapely.geometry import Polygon
# Create polygon from lists of points
x = [0.0, 0.0, 1.0, 1.0, 0.0]
y = [0.0, 1.0, 1.0, 0.0, 0.0]
poly = Polygon(zip(x,y))
# Extract the point values that define the perimeter of the polygon
xx, yy = poly.exterior.coords.xy
# Note above return values are of type `array.array`
assert x == xx.tolist()
assert y == yy.tolist()
assert tuple(poly.exterior.coords) == tuple(zip(x,y))
numpy
数组返回assert np.array_equal(np.array(poly.exterior.coords), np.asarray(tuple(zip(x,y))))
我花了一些时间才学会多边形有一个外部边界和可能有几个内部边界。我在这里发帖是因为一些答案没有反映出这种区别,虽然公告的原始贴子并没有使用具有内部边界的多边形作为示例。
形成外部边界的点排列在CoordinateSequence中,可以通过以下方式获得:
polygon.exterior.coords
使用len(polygon.exterior.coords)
可以找到此对象的长度,并且可以像列表一样索引该对象。例如,要获得第一个顶点,请使用polygon.exterior.coords[0]
。请注意,第一个和最后一个点是相同的;如果您想要一个由没有重复点的顶点组成的列表,请使用polygon.exterior.coords[:-1]
。
您可以将坐标序列(包括重复的顶点)转换为点列表,如下所示:
list(polygon.exterior.coords)
类似地,由形成第一个内部边界的顶点组成的坐标序列可通过polygon.interiors[0].coords
获得,而不含重复点的顶点列表可通过polygon.interiors[0].coords[:-1]
获得。
mapping
函数:
>>> 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)),)}
我用了这个:
list(zip(*p.exterior.coords.xy))
使用以下代码创建多边形:p = Polygon([(0,0),(1,1),(1,0),(0,0)])
,返回结果如下:
[(0.0, 0.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)]
points = MultiPoint(polygon.boundary.coords)
由于最新版本的shapely似乎不再与上一个答案兼容,因此我提出了这个更新。
shapely提供了Numpy数组接口(如文档所述:http://toblerity.org/shapely/project.html)
因此,让poly
成为一个shapely多边形几何体:
In [2]: type(poly)
Out[2]: shapely.geometry.polygon.Polygon
这个命令将把内容转换成numpy数组:
In [3]: coordinates_array = np.asarray(poly.exterior.coords)
提示:
对于多边形,必须提供外部坐标,因为直接提供几何图形似乎也行不通:
In [4]: coordinates_array = np.asarray(poly)
Out[4]: array(<shapely.geometry.polygon.Polygon object at 0x7f627559c510>, dtype=object)
import numpy as np
x = [1, 2, 3, 4]
y = [9, 8, 7, 6]
polygon = Polygon(x,y)
points = np.array(polygon)
# points is:
[[ 1 9]
[ 2 8]
[ 3 7]
[ 4 6]]
coords.xy
,我能够提取出一个外部点的有序列表,或者可能是网格的外部点... 我会在有时间的时候尝试一下并回报 :) - ryanjdillonPolygon(x,y)
被拒绝。np.array(some_actual_polygon)
的行为也不如所示。 - Masterfoolp = Polygon([(1,0),(1,1),(0,1),(0,0)])
for x,y in p.exterior.coords:
print(x,y)
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
(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)
DataFrame.apply()
,就像这个SO问题线程中所建议的那样。 - ryanjdillon
poly.exterior.coords
,如下面@pnklein的答案所示,或者使用sh.get_coordinates(poly)
获取数组的数组[x,y]。 - Robbes