2017-04-05 16 views
3

我希望這不是太平凡,但我真的無法找到一個答案,即時通訊太新的主題,以提出替代我的自我。所以這裏是問題:空間連接兩個簡單功能{sf}超過1密耳。儘可能快的條目

我有兩個形狀文件x和y代表一個Sentinel2衛星圖像的不同處理級別。 x包含大約1.300.000個polygones/Segments完全覆蓋圖像,沒有任何其他重要信息。
y包含大約500個代表圖像無雲區域的polygones(也覆蓋除了少數「雲洞」之外的大部分圖像)以及有關4列中使用圖像的信息(Sensor,Time .. )

即時嘗試將圖像信息添加到x的地方x由y覆蓋。很簡單?我只是無法找到一種方法,讓它開發而不需要花費幾天時間。

我把x讀爲一個簡單的功能{sf},因爲用shapefile讀取它/ readOGR需要很長時間。 我嘗試了不同的東西y

當我嘗試合併(x,y)我只能採取一個sf作爲合併不支持兩個sf的。 (x,y),支持這兩個變量是sf(sf)和y(如shp)給我的錯誤「無法分配大小爲13.0 Gb的向量」

所以我試過sf :: st_join但仍然沒有完成現在的28小時

sf :: st_intersect(x,y)花了大約9分鐘爲一個10.000段的子集,所以可能不會很快整個一塊。

可能將子集x到幾個小碎片解決整個事情還是有另一個簡單的解決方案?我可以用我的工作區做些什麼來完成合並工作,或者是否沒有捷徑可以加入這些多邊形?

非常感謝,我希望我的描述不是太模糊!

我的小工作站:

贏得7 64位 8 GB RAM 英特爾i7-4790 @ 3.6 GHz的

乾杯, 馬蒂亞斯

+0

您可能想通過子集更新shapefile。子集x,其中y存在,然後將所需的信息保存到x中。但是,如果您顯示樣本數據和期望的輸出,則會更容易。 – manotheshark

回答

0

我經常遇到這樣那樣的問題作爲@ manotheshark2的證實,我更喜歡在我的矢量圖層下的循環中工作。這裏是我的建議:

裝入數據

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

分配一個ŸID用於識別X多邊形相交Ÿ多邊形和創建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 @ data $ yID:object'pos.x'找不到' on y給我返回錯誤'[[<< .data.frame'('* tmp *',name,value = numeric(0)): 替換爲0行,數據爲10000「。 另外:可以使用sf :: st_intersect完成相同的操作嗎?作爲sf(簡單功能)的片段文件讀取速度大約快6倍。或者是幾何操作相交/連接的sf結構較慢? 非常感謝! –

+0

哦,對不起。我在代碼中有一個錯誤。請用'posX'改變'pos.x'。關於y層循環中的錯誤,可能存在一些我尚未考慮的數據異常。如果數據不是很重,也許我可以檢查它是否發現錯誤。代碼停止在哪個迭代中?即什麼值有'posY'?關於'sf :: st_intersection()'函數你是很好的。它比光柵功能更快,謝謝!爲了使用這個,x和y應該用'x < - st_read('C:/sentinelCover.shp')加載並用intX < - tryCatch(sf :: st_intersection(pol.x,y) ,finally ='NULL')' –