删除多个多边形内的点

时间:2014-11-19 10:18:47

标签: python text-files polygon

数据:我有两个变量ab的坐标,每个变量长度为100,000,我有一个文本文件,其中包含几个多边形的坐标。

我想删除不同多边形内的a和b的所有点。

为此,我尝试使用THE CODE FROM THIS ANSWER IN STACKOVERFLOW来执行一个点和一个多边形。

我已经制定了解决几个问题以及几个多边形问题的方法:

  • 采用第一个多边形的坐标
  • 为所有100,000个a and b点和点运行该函数(如果它们在里面),然后将它们附加到列表中,稍后我可以将其用于与原始a和b进行比较
  • 使用第二个多边形的坐标执行以上两个步骤,依此类推......

现在我面临两个问题,我不知道如何继续。

  1. 包含多边形坐标的文本文件如下所示:

    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坐标。我怎么做?

  2. 多边形的形状不同,如您所见,第二个多边形有12个角,而第一个多边形有4个角。

  3. THE 100,000 POINTS OF a AND b LOOK LIKE THIS

    a and b看起来有10万个点

    如果有任何方便的方法,除了我上面给出的解决方案,它也会有用。

    我想要的只是a和b之外的多边形点。

1 个答案:

答案 0 :(得分:2)

当你说" a和b的那些点在多边形之外时#34;你的意思是在所有多边形之外或在任何多边形之外?

这是:

  1. 读取多边形点并创建适当的数据结构以与point_in_poly函数一起使用的例程。
  2. 检查点是否在任何多边形中的例程。
  3. 以下是从文件中读取多边形点的例程:

    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
    

    每个多边形都表示为浮动对的列表,例程返回多边形列表。

    注意:

    1. 迭代文件中的所有行。
    2. 将该行拆分为单词,使用[2:]删除前两个单词,并将每个单词转换为浮点数。
    3. 创建一对对象列表,将第1,第3,第5等作为x坐标,将第2,第4,第6等作为y坐标。
    4. 忽略空行。
    5. 以下是检查点是否在任何多边形中的例程:

      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
      

      如果ab是分别代表100000点的x和y坐标的数字列表,则以下是查找异常值的代码:

      outliers = []
      for (x,y) in zip(a,b):
        if not inAnyPolygons(x,y,polygons):
          outliers.append((x,y))
      return outliers