R 또는 Python을 사용하여 큰 래스터를 폴리 라인으로 변환하는 가장 빠른 방법은 무엇입니까?


14

전역 수역 (1 비트 값 0 및 1)이있는 큰 래스터 파일 (129600 x 64800 픽셀)을 가지고 바다와 내륙 수 해안선을 추출하려고합니다.

래스터에서 폴리 라인으로 변환하기 위해 ArcGIS 및 QGIS를 사용해 보았지만 시간이 오래 걸립니다.

누구 든지이 작업에 더 나은 / 빠른 방법 (Python 또는 R) 또는 더 나은 도구를 알고 있습니까?

최신 정보

  • R : rasterToContour는 빠르고 정확할 수 있지만 광산과 같은 매우 큰 데이터 세트 (8,398,080,000 픽셀)가있는 경우 매우 많은 양의 RAM (16GB 이상)이 필요하거나 R이 하드 드라이브에서 더 많은 처리를 수행하도록 강요합니다. 또한 나이가 걸릴 것입니다.
  • Python / GDAL : gdal_poligonize는 폴리 라인 대신 다각형을 만듭니다.

업데이트 2

  • R rasterToContour : rasterToContour는 원하는 결과를 제공하지 않습니다. ArcGIS (래스터-다각형, 피처-라인)와 비교하면 아래 예제와 같이 정확한 픽셀 외곽선을 추출하지 않습니다.

rasterToContour 결과 rasterToContour 결과

ArcGIS 결과 ArcGIS 결과

업데이트 3

파이썬 / GDAL : 테스트 데이터 세트에서 ArcGIS에 대해 명령 줄에서 gdal_polygonize를 실행했으며 결과가 매우 명확했습니다.

  • 페달 : 49 초
  • ArcGIS : 1.84 초

업데이트 3을 참조하십시오.
Generic Wevers

해당 테스트 데이터 세트를 제공 할 수 있으므로 제안 된 대안이 더 빠른지 또는 필요한 결과를 얻을 수 있는지 확인할 수 있습니까?
Kersten

이러한 거대한 래스터의 경우 gdal 라이브러리와 함께 C / C ++를 사용하는 것이 좋습니다.
로드리고

답변:


8

나는 R과 함께 일하고 과거 rasterToPolygons에는 raster패키지에서 사용 했지만 이제는 gdal_polygonizeRJohn Baumgartner가 선호 합니다. 그것은 기초 gdal_polygonize.py이며 훨씬 빠릅니다. John Baumgartner는이 코드를 게시하고 블로그 에서 사용하는 예제를 제공했습니다 .

파이썬에 익숙하다면 gdal_polygonize.py물론 직접 사용할 수 있습니다 .


1
나는 그것을 시도 줄 것이다. 지난번에 gdal_polygonize.py를 사용했을 때 ArcGIS가 더 빨랐습니다.
Generic Wevers

ArcGis가 그 속도보다 빠를 것이라고 기대하지 않았습니다. @Generic Militzer
Iris

아 잠깐, 다각형을 만들지 만 폴리 라인이 필요합니다.
Generic Wevers

데이터를 파일 지오 데이터베이스에 넣으면 꽤 빠릅니다. 그러나 여전히 충분히 빠르지 않습니다. 그래서 대안을 찾고 있습니다.
Generic Wevers

2
다각형을 얻는 것이 반드시 문제가되는 것은 아니며 항상 다각형을 폴리 라인으로 변환 할 수 있습니다 (물론 많은 시간이 소요될 수는 있지만).
Martin

7

후손을 위해, 나는 이러한 유형의 작업을 신속하게 수행하기 위해 stars::패키지로 성공했습니다 R.

library(raster)
library(stars)
library(sf)
library(magrittr)

f <- system.file("external/test.grd", package="raster")
r <- raster(f)
r[r[] < 750] <- 0
r[r[] >= 750] <- 1

x <- st_as_stars(r) %>% 
  st_as_sf() %>% # this is the raster to polygons part
  st_cast("MULTILINESTRING") # cast the polygons to polylines

plot(x)

여기에 이미지 설명을 입력하십시오

plot(r)
plot(x, add = TRUE)

여기에 이미지 설명을 입력하십시오


5

시도 rasterToContour로부터 래스터 패키지로 제공된다.

f <- system.file("external/test.grd", package="raster")
r <- raster(f)
r[r[] < 750] <- 0
r[r[] >= 750] <- 1

x <- rasterToContour(r)
class(x)
> [1] "SpatialLinesDataFrame"
> attr(,"package")
> [1] "sp"

plot(r)
plot(x, add=TRUE)

여기에 이미지 설명을 입력하십시오

그런 다음 아래 코드를 사용하여 파일을 로컬 폴더 (예 : 'ESRI Shapefile'(. shp))에 쉽게 쓸 수 있습니다. 한 번 봐 가지고 ogrDrivers에서 rgdal는 시스템과 호환되는 드라이버를 발견 할 수 있습니다.

library(rgdal)
writeOGR(x, dsn = getwd(), layer = "coastlines", driver = "ESRI Shapefile")

RAM을 죽이지 않을 것입니다. 16GB가 있기는하지만 R이 큰 래스터 파일로는 그다지 효율적이지 않은 경우가 있습니다. 그러나 보자.
Generic Wevers

어떻게 든 변환이 이루어졌지만 세부 사항을 확인할 수 없었습니다. 일반적으로 래스터 데이터 처리에 더 익숙해지면 SpatialLineDataFrame을 모양 파일 또는 이와 유사한 것으로 변환하는 방법을 알려줄 수 있습니까? 레이어 이름 (OGRwrite)을 알지 못하기 때문에 Google을 검색했지만 여전히 어려움을 겪고 있습니다.
Generic Wevers

하하, 분명히 요점을 봅니다. 위 업데이트를 참조하십시오.
fdetsch

2
또 다른 힌트 : 'maxpixels'를 rasterToContour더 높은 값으로 설정하십시오 (예 : 1e + 9). 그러면 더 자세한 내용을 알 수 있습니다. 기본 설정은 상당히 일반화 된 등고선을 만듭니다.
fdetsch

1
resample더 넓은 공간 해상도로 데이터를 기꺼이 원하지 않는다면 상상할 수있는 유일한 해결책은 데이터를 여러 타일 (예 : 16 개의 하위 래스터)로 분할 한 다음 rasterToContour반복적으로 각 타일에서 개별적으로 수행 하는 것입니다. 마지막으로 merge결과 모양 파일을 하나의 거대한 모양 파일로 만듭니다. 관심이 있으시다면 , 실무 그룹의 패키지 RsenalsplitRaster하나의 거대한 래스터에서 여러 개의 하위 래스터를 생성 하는 기능을 제공합니다 .
fdetsch

2

내가 GDAL을 좋아하지만 다각형 화 도구는 응용 프로그램에 너무 느 렸습니다.

빠른 대안이다 gdal_trace_outline에서 하건데 GDAL 스크립트 도 더 많은 옵션에 대한 내성을 가지고, 도넛 등

마찬가지로 gdal_polygonize이 또한 당신이 나중에 변환해야 것 다각형을 생성합니다 ogr2ogr -nlt MULTILINESTRING.

단점은 Linux 또는 Mac OsX 시스템을 사용하지 않는 한 직접 컴파일해야한다는 것입니다.


불행히도 "세그먼트 결함 (코어 덤프)"오류 메시지와 함께 실패했습니다. 내 파일이 너무 크거나 더 정확하여 너무 많은 작은 다각형을 생성한다고 생각합니다.
Generic Wevers
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.