Python 在陆地上保留点,在水上放置点

Python 在陆地上保留点,在水上放置点,python,gis,shapely,point-in-polygon,fiona,Python,Gis,Shapely,Point In Polygon,Fiona,我有几个多边形,它们实际上是点的并集。我想要一个相当快速的方法来移除不是陆地(而是河流、湖泊、海洋等)上的点 到目前为止,我已经想出了以下方法,将我从左图带到右图: 然后在循环中测试我的点: with open(in_csv) as f: for x in csv.reader(f): # Lat, Lng, Mins, Mode if not point_in_water(float(x[0]), float(x[1])): co

我有几个多边形,它们实际上是点的并集。我想要一个相当快速的方法来移除不是陆地(而是河流、湖泊、海洋等)上的点

到目前为止,我已经想出了以下方法,将我从左图带到右图:

然后在循环中测试我的点:

with open(in_csv) as f:
    for x in csv.reader(f):
        # Lat, Lng, Mins, Mode
        if not point_in_water(float(x[0]), float(x[1])):
           coords.append([x[0], x[1])
我使用了三个形状文件,这对我来说是可以的(其中一个有点粗糙):

然而,对于10000点来说,代码有点慢(我有大约30个文件,所以需要检查300000点)

我想知道是否有以下任何一种可能:

1) 我正在循环通过形状并检查形状。包含(点)而不是循环通过点和检查点。在(形状)->我不确定是否会有改进

2) 使用空间索引可能会加快速度,但是我认为RTree在Python3.4中不再有效

3) 也许有一个更快的函数(一个粗略的包含),它只检查边界,我可以将它作为第一步使用,然后作为第二步使用包含

4) 是否有一种方法可以同时矢量化和传递所有点,而不是循环通过点

5) 也许将形状优美的多边形转换为路径会更快,这样我就可以使用matpotlib的path.contains_点了

6) 最后,我意识到我可能应该对多边形测试中的点使用墨卡托投影,但是粗糙的切割对我来说很好(无论如何,水的形状文件并不是超精确的)


<谢谢>

免责声明,我没有用Saby或菲奥娜说过,你需要边界内的界线还是边界?如果只是边界,那么简化事情的一种方法可能是使用@DrBwts。不幸的是,我确实需要保留这些点,因为我只是在水中添加点
rtree
0.8版引入了对Python3.x的支持,所以尝试一下吧。空间索引将极大地提高您的性能。为了加快这一过程,我将尝试首先获得所有“水”多边形的并集,然后根据此多多边形检查每个点。我的意思是,这将是一个巨大的多边形,联合行动可能需要一段时间,但我认为如果你有很多观点,这将真正加快进程。
with open(in_csv) as f:
    for x in csv.reader(f):
        # Lat, Lng, Mins, Mode
        if not point_in_water(float(x[0]), float(x[1])):
           coords.append([x[0], x[1])