我有几个多边形,实际上是一个点的联合。我想要一个相当快速的方法去除不是陆地的点(但在河流,湖泊,海洋等)。
所以我到目前为止我已经提出了以下方法,它将我从左图片转到右图:
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;
我使用了三个形状文件,这些文件可以用于我的目的(湖泊有点粗糙):coast,lakes,small 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)最后,我意识到我应该使用墨卡托投影作为聚合物测试中的点,但是对于我来说粗略切割是好的(不管水形状文件是否超级精确)。
谢谢