1

gIntersection を使用して、SpatialPolygonsDataFrame から一度に 1 つずつポリゴンで全国的なパス ネットワークをクリップしています。各ポリゴンをループし、パス ネットワークをクリッピングし、クリッピングされたパスの長さを計算し、これを path.lgth というデータ フレームに保存します。

poly<-readShapePoly("C:\\temp\\polygons.shp")
paths<-readShapeLines("C:\\temp\\paths.shp")


#loop through all polygons clipping lines

path.lgth<-data.frame()

for (i in 1:length(poly)){
  clip<-gIntersection(paths,poly[i,])
  lgth<-gLength(clip)
  vid<-poly@data[i,3]
  data<-cbind(vid,lgth)
  path.lgth<-rbind(path.lgth,data)
  print(i)
}

vid 行は、パスの長さとともにデータフレームに保存するポリゴン ID を抽出するだけです。

私の問題は、最初のポリゴンを作成するのに時間がかかりすぎることです (約 12 分!)。これをスピードアップする方法はありますか?gIntersection が数学的に何をするのかわかりません (すべてのパスをチェックして、それらがポリゴンと重なっているかどうかを確認していますか?)。パスを単純化したので、それらは 1 つの機能にすぎません。

ご協力いただきありがとうございます。

4

3 に答える 3

1

私の理解が正しければ、N 個のポリゴンと M 個のパスがありますよね? そして、ポリゴンごとに、パスの合計が必要ですよね?

解決策 1

次に、まずすべてのラインを 1 つのフィーチャにマージします。で一気に交差させますbyid = TRUE。このようにして、ループを取り除きます。

paths2 <- gLineMerge(paths)
path.crop <- gIntersection(poly, paths2, byid = TRUE)
path.lgth <- gLength(path.crop, byid = TRUE)

ポリゴンの ID でマークされた長さを取得する必要があります。そこにあるポリゴンの ID が正しいかどうかはわかりませんpath.cropidそうでない場合は、パラメータをgIntersectionポリゴンの ID に設定する必要があります。

解決策 2

sp::over巧妙なクエリを作成するために使用できるかどうかわかりませんか? これは検討する価値があります。

于 2013-12-03T13:39:56.443 に答える
0

最初にすべきことは、ループを通過するたびにメモリを再割り当てしないようにすることです。
の代わりに path.lgth<-rbind(path.lgth,data)、ループの前に初期化します。

path.lgth<-matrix(nrow=length(poly), ncol=2)

次に、ループ内でcbind(総オーバーキル)をダンプして実行します

path.lgth[i,] <- c(vid,lgth)

全体的な実行時間については、使用可能な CPU (および RAM) については何も言われませんでした。ただしRprof、どの手順に最も時間がかかっているかを確認してください。

于 2013-12-03T13:11:21.290 に答える