从 Shapely 中的多边形中提取点/坐标

问题描述 投票:0回答:10

如何获取/提取定义

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)
python polygon shapely
10个回答
138
投票

技巧是使用

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))))

77
投票

我花了一段时间才了解到多边形有一个外部边界,可能还有几个内部边界。我在这里发帖是因为有些答案没有反映这种区别,尽管公平地说,原始帖子没有使用具有内部边界的多边形作为示例。

形成外部边界的点排列在坐标序列中,可以通过以下方式获得

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]


36
投票

您可以使用 shapely

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)),)}

14
投票

我用过这个:

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)]

8
投票

如果您确实想要构成多边形的形状良好的点对象,而不仅仅是坐标元组,您可以这样做:

points = MultiPoint(polygon.boundary.coords)

3
投票

更新(2017-06-09):

由于最后一个答案似乎不再适用于最新版本的 shapely,我建议进行此更新。

shapely 提供了 Numpy 数组接口(正如文档所说:http://toblerity.org/shapely/project.html

所以,让

poly
是一个形状优美的多边形几何体:

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)    

2
投票

您可以使用 NumPy.array 将形状多边形转换为 NumPy 数组。我发现使用 NumPy 数组比 coords.xy 返回的数组更有用,因为坐标是成对的,而不是在两个一维数组中。使用对您的应用程序更有用的一个。

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]]

2
投票

您可以使用以下两种方法中的任意一种。

1)

p = Polygon([(1,0),(1,1),(0,1),(0,0)])
for x,y in p.exterior.coords:
   print(x,y)

上面的代码打印以下内容。请注意,(1,0) 被打印两次,因为 external.coords 返回完成多边形的有序序列。

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]))

0
投票

有孔

shell = [(0,0), (0,4), (4,4), (4,0), (0,0)]
holes = [
    [(1,1), (1,2), (2,2), (2,1), (1,1)],
    [(2,2), (2,3), (3,3), (3,2), (2,2)],
]

polygon = Polygon(shell, holes)

shell = list(zip(*polygon.exterior.coords.xy))
holes = [list(zip(*hole.coords.xy)) for hole in polygon.interiors]

assert polygon == Polygon(shell, holes)

-2
投票
d0=[]
for n in range(0,len(gdf1['geometry'])):
    try:
        k=(len(gdf1['geometry'][n].geoms))    
        ce+=1
    except:
        d0.append(n)
© www.soinside.com 2019 - 2024. All rights reserved.