在陆地上保持积分并在水上掉落

时间:2016-01-04 11:45:55

标签: python gis shapely point-in-polygon fiona

我有几个多边形,实际上是一个点的联合。我想要一个相当快速的方法去除不是陆地的点(但在河流,湖泊,海洋等)。

所以我到目前为止我已经提出了以下方法,它将我从左图片转到右图:

enter image description here

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])

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

<?php
$doc = array(
   array(
        "header1",
        "header2",
        "header3"
   ),

   array(
        "value11",
        "value12",
        "value13"
   ),

   array(
        "value21",
        "value22",
        "value23"
   ),

   array(
        "value31",
        "value32",
        "value43"
   )
);

ob_start();

$df = fopen( "php://output", 'w' );
foreach ( $doc as $docLine )
{
    fputcsv( $df, $docLine );
}
fclose( $df );

$output = ob_get_clean();

$now = gmdate( "D, d M Y H:i:s" );
header( "Expires: Tue, 012 Jan 1970 00:00:00 GMT" );
header( "Cache-Control: max-age=0, no-cache, must-revalidate" );
header( "Last-Modified: {$now} GMT" );

// force download
header( "Content-Type: text/csv; charset=utf-8" );
header( "Content-Disposition: attachment; filename=\"report.csv\"");
header( "Content-Transfer-Encoding: binary" );

echo $output;

我使用了三个形状文件,这些文件可以用于我的目的(湖泊有点粗糙):coastlakessmall lakes

然而,对于10,000点,代码有点慢(我有大约30个文件,所以300,000点要检查)。

我想知道以下任何一种情况是否可行:

1)我循环遍历形状并检查shape.contains(point)而不是循环遍历点并检查point.within(shape) - &gt;我不确定是否会有改进?

2)使用空间索引可能会加快这一速度,但我认为RTree不再适用于Python 3.4

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

4)有没有一种方法可以一次矢量化并传递所有点,而不是通过点循环?

5)将形状多边形转换为路径可能会更快,以便我可以使用matpotlib的path.contains_point?

6)最后,我意识到我应该使用墨卡托投影作为聚合物测试中的点,但是对于我来说粗略切割是好的(不管水形状文件是否超级精确)。

谢谢

0 个答案:

没有答案