数据:我有两个变量a
和b
的坐标,每个变量长度为100,000,我有一个文本文件,其中包含几个多边形的坐标。
我想删除不同多边形内的a和b的所有点。
为此,我尝试使用THE CODE FROM THIS ANSWER IN STACKOVERFLOW来执行一个点和一个多边形。
我已经制定了解决几个问题以及几个多边形问题的方法:
a and b
点和点运行该函数(如果它们在里面),然后将它们附加到列表中,稍后我可以将其用于与原始a和b进行比较 现在我面临两个问题,我不知道如何继续。
包含多边形坐标的文本文件如下所示:
020241-041200 4 30.83 -3.69 30.82 -3.69 30.82 -3.73 30.83 -3.73
020241-041200 12 30.91 -4.03 30.89 -4.03 30.85 -4.05 30.83 -4.07 30.82 -4.09 30.84 -4.16 30.89 -4.19 30.96 -4.16 30.97 -4.13 30.97 -4.08 30.95 -4.05 30.93 -4.04
此处(020241-041200)是多边形的ID ,(4)是多边形的角数, 30.83是X第一个角落的坐标和 -3.69是第一个角落的Y坐标,依此类推。
我想跳过前两列,这样我才能考虑多边形的X,Y坐标。我怎么做?
多边形的形状不同,如您所见,第二个多边形有12个角,而第一个多边形有4个角。
此
的a and b
看起来有10万个点
如果有任何方便的方法,除了我上面给出的解决方案,它也会有用。
我想要的只是a和b之外的多边形点。
答案 0 :(得分:2)
当你说" a和b的那些点在多边形之外时#34;你的意思是在所有多边形之外或在任何多边形之外?
这是:
point_in_poly
函数一起使用的例程。以下是从文件中读取多边形点的例程:
def readPolygons(path):
polygons = []
with open(path) as f:
for line in f: # (1)
words = [ float(y) for y in (line.split())[2:] ] # (2)
poly = zip (words[::2], words[1::2]) # (3)
if len(poly): # (4)
polygons.append(poly)
return polygons
每个多边形都表示为浮动对的列表,例程返回多边形列表。
注意:
[2:]
删除前两个单词,并将每个单词转换为浮点数。以下是检查点是否在任何多边形中的例程:
def inAnyPolygon(x,y,polygons):
for p in polygons:
if point_in_poly(x,y,p):
return True
return False
如果您的标准是"在所有多边形"中,请使用:
def inAllPolygons(x,y,polygons):
for p in polygons:
if not point_in_poly(x,y,p):
return False
return True
更新:如果你有一个点points
列表,你可以创建另一个列表,其中包含那些不在任何多边形中的点:
outliers = []
for p in points:
(x,y) = p
if not inAnyPolygons(x,y,polygons):
outliers.append(p)
return outliers
如果a
和b
是分别代表100000点的x和y坐标的数字列表,则以下是查找异常值的代码:
outliers = []
for (x,y) in zip(a,b):
if not inAnyPolygons(x,y,polygons):
outliers.append((x,y))
return outliers