Python 删除多个多边形内的点

Python 删除多个多边形内的点,python,text-files,polygon,Python,Text Files,Polygon,数据:我有两个变量的坐标a和b,每个变量的长度为100000,我有一个包含多个多边形坐标的文本文件 我现在想删除不同多边形内的所有a和b点。 为了做到这一点,我试着用它来表示一个点和一个多边形 我为解决几个点和几个多边形的问题而制定的方法是: 取第一个多边形的坐标 对a和b和的所有100000个点(如果它们在内部)运行该函数,然后将它们附加到列表中,稍后我可以使用该列表与原始的a和b进行比较 使用第二个多边形的坐标执行上述两个步骤,依此类推…… 现在我面临着两个问题,我不知道如何处理 包含多

数据:我有两个变量的坐标
a
b
,每个变量的长度为100000,我有一个包含多个多边形坐标的文本文件


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

为了做到这一点,我试着用它来表示一个点和一个多边形

我为解决几个点和几个多边形的问题而制定的方法是:

  • 取第一个多边形的坐标
  • a和b
    的所有100000个点(如果它们在内部)运行该函数,然后将它们附加到列表中,稍后我可以使用该列表与原始的a和b进行比较
  • 使用第二个多边形的坐标执行上述两个步骤,依此类推……
现在我面临着两个问题,我不知道如何处理

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

    020241-041200 430.83-3.69 30.82-3.69 30.82-3.73 30.83-3.73

    020241-041200 1230.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和b的100000个点如下所示

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


    我想要的是a和b中位于多边形外部的点。

    当你说“a和b中位于多边形外部的点”时,你是指所有多边形外部还是任何多边形外部

    这是:

  • 读取多边形点并创建适当数据结构的例程,用于
    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:][/code>删除前两个单词,并将每个单词转换为浮点
  • 创建一个配对列表,将第1、3、5等作为x坐标,将第2、4、6等作为y坐标
  • 忽略空白行
  • 以下是检查点是否位于任何多边形中的例行程序:

    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
    
    更新:如果您有一个点列表
    ,则可以创建另一个列表,其中包含不在任何多边形中的点,具有:

    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
    

    “a和b中位于多边形外部的点”:我希望所有这些点位于所有多边形外部。我将立即执行您的代码并检查!!!我有
    a和b
    ,这两个变量各有100000分。你的
    readPolygons
    现在给我一个多边形坐标的元组!!!现在我需要得到
    a_-outside
    b_-outside
    ,即多边形外的点。顺便说一句,
    ,你是指我的
    a和b
    ?给我一个
    a
    b
    的例子。它们在问题的图中
    a
    是一个包含100000个点的列表,范围在30.0-38.0之间,
    b
    是一个包含100000个点的列表,范围在-11.0到-3.7之间。多个多边形的坐标也在此范围内。
    readPolygons
    返回一个“多边形”列表,其中每个“多边形”都是一组数字,这是因为在
    point\u in\u polygon
    函数中,多边形由一组数字表示。请查看扫描线算法。