【发布时间】:2014-02-15 20:19:53
【问题描述】:
我搜索了很多,但找不到任何实用的答案。我有一个多边形。例如:
[(86, 52), (85, 52), (81, 53), (80, 52), (79, 48), (81, 49), (86, 53),
(85, 51), (82, 54), (84, 54), (83, 49), (81, 52), (80, 50), (81, 48),
(85, 50), (86, 54), (85, 54), (80, 48), (79, 50), (85, 49), (80, 51),
(85, 53), (82, 49), (83, 54), (82, 53), (84, 49), (79, 49)]
我想得到这个边界多边形内所有点的列表。我听说了很多关于多边形三角测量技术或线性/洪水/交叉/...填充算法。但我真的想不出一种有效的方法来实现这一点。这个多边形很小,想象一个有 10 亿个点的多边形。我现在使用 PIL 绘制多边形用红色填充多边形并在其中循环以找到红点。这是一个非常缓慢的技术:
def render(poly, z):
xs = [i[0] for i in poly]
ys = [i[1] for i in poly]
minx, maxx = min(xs), max(xs)
miny, maxy = min(ys), max(ys)
X = maxx - minx + 1
Y = maxy - miny + 1
newPoly = [(x - minx, y - miny) for (x, y) in polygons]
i = Image.new("RGB", (X, Y))
draw = ImageDraw.Draw(i)
draw.polygon(newPoly, fill="red")
# i.show()
tiles = list()
w, h = i.size
print w, h
for x in range(w):
for y in range(h):
data = i.getpixel((x, y))
if data != (0, 0, 0):
tiles.append((x + minx, y + miny))
return tiles
我正在寻找解决这个问题的 Pythonic 方法。 谢谢大家。
【问题讨论】:
-
shapely有什么可以提供给您的吗? pypi.python.org/pypi/Shapely -
我使用了 shapely,但找不到任何解决此问题的方法。谢谢,我会搜索的。
-
您可能正在寻找这个:rosettacode.org/wiki/Ray-casting_algorithm.
-
好吧,链接中的函数给出并指向和一个多边形来检查它是否在里面。这不是我需要的。我可以为所有项目手动创建一个网格和循环。但我正在寻找一种更直接的方法。谢谢顺便说一句。
-
@Farsheed 您找到问题的答案了吗?我现在正在寻找类似的解决方案,我有 100,000 个点的坐标和几个多边形的坐标。我需要删除这些多边形内的那些点
标签: python algorithm gis polygon fill