2017-06-06 527 views
1

我需要查找内部和多边形上的所有点。从Python形状多边形中提取多边形内的所有坐标

输入:

from shapely.geometry import Polygon, mapping 
sh_polygon = Polygon(((0,0), (2,0), (2,2), (0,2))) 

输出:

(0,0) , (1,0) , (2,0) , (0,1) , (1,1) , (2,1) , (0,2) , (1,2) , (2,2). 

请建议,如果有不使用shapely一个更好的办法。

我已经写了这段代码,它给出了多边形内的点,但是它没有给出点。也有没有更好的方式做同样的事情:

from shapely.geometry import Polygon, Point 

def get_random_point_in_polygon(poly): 
    (minx, miny, maxx, maxy) = poly.bounds 
    minx = int(minx) 
    miny = int(miny) 
    maxx = int(maxx) 
    maxy = int(maxy) 
    print("poly.bounds:", poly.bounds) 
    a = [] 
    for x in range(minx, maxx+1): 
     for y in range(miny, maxy+1): 
      p = Point(x, y) 
      if poly.contains(p): 
       a.append([x, y]) 
    return a 


p = Polygon([(0,0), (2,0), (2,2), (0,2)]) 
point_in_poly = get_random_point_in_polygon(p) 

print(len(point_in_poly)) 
print(point_in_poly) 

输出:

poly.bounds: (0.0, 0.0, 2.0, 2.0) 
1 
[[1, 1]] 

我简化了我的问题。实际上,我需要找到所有内部和有角的正方形的点:(77,97),(141,101),(136,165),(73,160)。

+0

你可以将你的最大值增加1并减少1吗? – SirParselot

+0

@SirParselot Thansk。我改变了它。但是,我得到完全相同的输出。 – Beginner

+0

这是因为你有'如果poly.contains(p)'。这只有在多边形的内部有点而不是它的情况下才是正确的。如果你的环路在边界之间,你不应该检查它是否在多边形内。忽略我的第一个评论,如果你删除了'if poly.contains(p)' – SirParselot

回答

0

是不是有一个函数可以找到上的一行?那些是你唯一缺少的。它们只是线段定义方程的解决方案。如果没有,自己编写算法很容易,通过强力找到点。

对多边形的每个边(p1,p2)执行以下操作。

p1 = (x1, y1) 
p2 = (x2, y2) 
xdiff = x2 - x1 
ydiff = y2 - y1 

# Find the line's equation, y = mx + b 
m = ydiff/xdiff 
b = y1 - m*x1 

for xval in range(x1+1, x2): 
    yval = m * xval + b 
    if int(yval) == yval: 
     # add (xval, yval) to your list of points 

我离开的细节给你:确保X1 < X2(或以其他方式适应),处理一个垂直段等,这是不是特别优雅,但它的速度快,易于实现,并且易于调试。

+0

那么,您是否建议我使用您的方法来查找多边形上的点并使用我的代码查找多边形内的点? – Beginner

+0

是的。或者,您可以使用我的算法为多边形的每列x值找到边界点),然后简单地沿着每列进行迭代。然而,既然你已经有了一个方便的电话来寻找内部点,为什么要打扰呢? – Prune

+0

如果您决定自己查找所有点,请注意您需要知道哪个方向是多边形的内部,并在该方向上四舍五入计算出的yval。那些yval形成了每列点的界限。 – Prune