2017-04-05 2 views
3

나는 이것이 너무 사소한 것은 아니지만 정말로 답변을 찾을 수 없다는 것과 나의 새로운 대안을 생각해내는 주제가 너무 새롭기를 바랍니다. 그래서 여기에 문제가 있습니다 :1mil 이상의 두 가지 간단한 기능 {sf}에 대한 공간 조인. 가능한 한 빨리 항목

저는 Sentinel2 위성 이미지의 다른 처리 레벨을 나타내는 두 개의 shapefile x와 y를 가지고 있습니다. x 약 1.300.000 개의 폴리곤/이미지를 완전히 덮는 세그먼트가 더 이상 중요한 정보없이 확장됩니다.
y에는 이미지의 구름이없는 영역을 나타내는 약 500 개의 폴리곤이 있고 (또한 "구름 구멍"을 제외한 대부분의 이미지를 포함 함) 사용 된 이미지에 대한 정보는 4 개의 열 (센서, 시간 .. .)

메신저가 장소 x에서 이미지 정보를 x에 추가하려고 시도하는 것이 y로 덮여 있습니다. 꽤 간단 해요? 난 그냥 일을하지 않고 그것을 hapen하게하는 방법을 찾을 수 없습니다.

x 파일을 shapefile/readOGR로 읽으면서 xink를 간단한 기능 {sf}으로 읽습니다. 나는 병합 (x, y)을 시도 할 때 병합이 두 sf를 지원하지 않기 때문에 오직 하나의 sf만을 취할 수있다. x (sf)와 y (shp)를 병합하면 "크기 13.0 Gb의 벡터를 할당 할 수 없습니다"라는 오류 메시지가 나타납니다. sf :: st_join (x, y)를 시도 했으므로 sf가되도록 변수를 지원합니다.

그러나 여전히 28 시간 동안 끝나지 않았습니다.

10.90 세그먼트 하위 집합에 대해 sf :: st_intersect (x, y)가 약 9 분이 걸렸으므로 전체 조각에서 훨씬 빠르지 않을 수 있습니다.

x를 몇 개의 작은 조각으로 분할하여 전체를 해결할 수 있습니까? 아니면 다른 간단한 해결책이 있습니까? 병합 작업을 수행하기 위해 내 작업 공간으로 뭔가를 할 수 있습니까? 아니면 그 양의 폴리곤에 합류하기위한 바로 가기가 있습니까?

미리 감사드립니다. 내 설명이 너무 희미하지 않기를 바랍니다.

내 작은 워크 스테이션 : i7-4790 GHz의 3,6 @

승리 7 64 비트 8기가바이트 RAM 인텔은

건배, 마티아스

+0

아마도 하위 집합을 통해 모양 파일을 업데이트하려고합니다. x가있는 부분 집합 x 다음에 원하는 정보를 x에 저장합니다.그러나 샘플 데이터와 원하는 출력을 보여 주면 더 쉬울 것입니다. – manotheshark

답변

0

나는 종종 문제의이 종류를 직면 그리고 @ manotheshark2 afirms처럼, 나는 루프 내 벡터 레이어를 부분 집합으로 작업하는 것을 선호한다. Y 다각형 교차하는 다각형을 X를 식별하기위한

library(raster) 
library(rgdal) 
x <- readOGR('C:/', 'sentinelCovers') 
y <- readOGR('C:/', 'cloudHoles') 

y를 ID를 할당하여 데이터로드 및 X 테이블

x$xyID <- NA # Answer col 
y$yID <- 1:nrow([email protected]) # ID col 

실행 루프 subseting X의 열을 생성

: 여기 내 충고

for (posX in 1:nrow([email protected])){ 
    pol.x <- x[posX, ] 
    intX <- raster::intersect(pol.x, y) 
    # x$xyID[posX] <- [email protected]$yID ## Run this if there's unique y polygons 
    # x$xyID[posX] <- paste0([email protected]$yID, collapse = ',') ## Run this if there's multiple y polygons 
} 

xoy 레이어에서 루프를 실행하는 것이 더 나은지 확인하실 수 있습니다.

x$xyID <- NA # Answer col 
x$xID <- 1:nrow([email protected]) # ID Col 

for (posY in 1:nrow([email protected])){ 
    pol.y <- y[posY, ] 
    intY <- tryCatch(raster::intersect(pol.y, x), finally = 'NULL') 
    if (is.null(intY)) next 
    x$xyID[[email protected]$xID %in% [email protected]$xID] <- pol.y$yID 
} 
+0

답변과 도움에 감사드립니다. x에서 루프를 실행하면 "x $ xyID 오류 [pos.x] <- intX @ 데이터 $ yID : 'pos.x'객체를 찾을 수 없음"에 y가 표시됩니다. "[[<- - .data.frame' ('* tmp *', name, value = numeric (0)) : 대체 행이 0이고 데이터에 10000이 있습니다. 또한 : sf :: st_intersect를 사용하여 동일하게 수행 할 수 있습니까? 세그먼트 파일에서 sf (단순 기능)로 읽는 것이 약 6 배 빠릅니다. 또는 sf 구조가 기하학적 연산 교차/결합에서 더 느린가? 감사합니다. –

+0

오, 죄송합니다. 코드에 실수가 있습니다. 'pos.x'를'posX'로 변경하십시오. y 레이어 루프의 오류에 대해서는 아직 고려하지 않은 데이터 예외가있을 수 있습니다. 데이터가 너무 무겁지 않으면 오류를 찾기 위해 데이터를 검사 할 수 있습니다. 어떤 반복에서 코드가 멈 춥니 까? 즉 'posY' 값은 무엇입니까? 'sf :: st_intersection()'함수에 관해서는 당신이 능숙하다. 래스터 함수보다 빠릅니다. 감사합니다! 이것을 사용하기 위해서는 x와 y는'x <- st_read ('C : /sentinelCover.shp')'를 사용하여로드되어야하고 intersect 명령은'intX <- tryCatch (sf :: st_intersection (pol.x, y) , finally = 'NULL')' –

관련 문제