【问题标题】:Extract points/coordinates from a polygon in Shapely从 Shapely 中的多边形中提取点/坐标
【发布时间】:2013-12-26 19:03:28
【问题描述】:

如何获取/提取定义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


    【解决方案1】:

    所以,我发现诀窍是使用Polygon 类方法的组合来实现这一点。

    如果您需要测地坐标,则需要将这些坐标转换回 WGS84(通过 pyprojmatplotlibbasemap 或其他方式)。

    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
    

    【讨论】:

      【解决方案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]]
      

      【讨论】:

      • 好主意。谢谢!我想当我有一组无序的点时我正在使用它,并且通过使用coords.xy 我能够拉出一个有序的外部点列表,或者可能是网格的外部点......我会当我有时间并报告时玩这个:)
      • 以上代码不适用于 shapely=1.5.13=py35_0。 Polygon(x,y) 不被接受。 np.array(some_actual_polygon) 的行为也不如所示。
      【解决方案3】:

      您可以使用匀称的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)),)}
      

      【讨论】:

      • 不错。这很好,因为它可以轻松概括需要这个的例程。
      • 如果你需要它,这也会给出边界框
      【解决方案4】:

      更新(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)
      

      提示:
      必须需要为多边形提供 external.coords,因为提供直接几何似乎也不起作用:

      In [4]: coordinates_array = np.asarray(poly)
      Out[4]: array(<shapely.geometry.polygon.Polygon object at 0x7f627559c510>, dtype=object)    
      

      【讨论】:

        【解决方案5】:

        我用过这个:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

          • 这两个方法是一样的,和2013-12-09的my answer一样。
          • @ryanjdillon 是的,第二个和你的一样。虽然我觉得第一个是解开 xy 对的更直观的方法。
          • 问题是如何获取坐标,而不是如何解包元组。我正在对此做出回应,因为这确实没有添加有关如何获取坐标的其他信息,并且它不是第一个重复已经存在的答案,例如this one。您的建议最好以对现有答案的评论形式提出。像这样的答案为人们寻找关键信息造成了不必要的麻烦。
          【解决方案7】:

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

          points = MultiPoint(polygon.boundary.coords)
          

          【讨论】:

            【解决方案8】:

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

            形成外边界的点排列成一个CoordinateSequence,可以得到

            polygon.exterior.coords
            

            您可以使用len(polygon.exterior.coords) 找到该对象的长度 并且可以像列表一样索引对象。例如,要获取第一个顶点,请使用polygon.exterior.coords[0]。注意第一个点和最后一个点是一样的;如果您想要一个由没有该重复点的顶点组成的列表,请使用polygon.exterior.coords[:-1]

            您可以将 CoordinateSequence(包括重复的顶点)转换为点列表:

            list(polygon.exterior.coords)
            

            类似地,由形成第一个内部边界的顶点组成的 CoordinateSequence 获得为polygon.interiors[0].coords,这些顶点的列表(不含重复点)获得为polygon.interiors[0].coords[:-1]

            【讨论】:

            • 如何获得多边形对向的所有坐标?那么多边形内的任何点,如何获得这些坐标?
            猜你喜欢
            • 1970-01-01
            • 2014-03-16
            • 1970-01-01
            • 1970-01-01
            • 2015-08-22
            • 2022-01-22
            • 1970-01-01
            • 2011-12-05
            • 2020-09-02
            相关资源
            最近更新 更多