거대한 XYZ CSV를 GeoTIFF로 변환


11

I는 CSV 같이 UTM 좌표를 포함하는 형태로 대량의 데이터가 XY등의 고도 값 Z정보. 추가 분석을 위해 이러한 데이터를 GeoTIFF로 DEM으로 변환해야합니다. 이 경우 엄청난 양은 16m를 의미합니다. 선, 원 포인트에서와 X, Y그리고 Z줄에. 점이 균등하게 분포되므로 보간이 필요하지 않습니다. 각 포인트는 래스터 셀로 변환되어야합니다.

원래 데이터에는 고정 너비가있는 구분 기호가 없었습니다. 스트림 텍스트 편집기 sed를 사용하여 고정 너비 대신 구분 기호를 사용하고 모든 공백 문자를 제거하도록 파일 구문을 변환하는 방법을 이미 알아 냈습니다 . 이제부터는 일반적으로 워크 플로는 X, YZ데이터 에서 피쳐 클래스를 생성 하고 두 번째 단계로 Point to Raster 도구 사용하여 포인트 모양 파일을 GeoTIFF로 변환하여 ArcGIS로 데이터를 가져 오는 것 입니다. 그러나 현재 가지고있는 파일은이 프로세스에 비해 너무 큽니다.

위에서 설명한 워크 플로 대신 효율적인 대안을 찾고 GDAL을 발견했습니다. 그러나에서 gdal_translate지원되는 파일 형식 목록에서 찾을 수있는 가장 가까운 지원 형식은 ASCII 표이지만 쉼표로 구분 된 XYZ는 없습니다. 또 다른 어려움은 UTM 좌표를 가지고 있지만 대부분의 예제는 십진수 좌표를 사용하는 것 같습니다. 그러나 UTM 시스템 내에 있어야합니다 (또는 적어도 출력 GeoTIFF는 UTM 좌표 시스템에 있어야합니다).

그래서 GDAL을 사용하여 CSV XYZ를 GeoTIFF로 변환 하는 방법을 찾고 있지만 지금 까지이 정확한 문제를 다루는 예제를 찾을 수 없었습니다. 힌트 나 코드 예제에 매우 만족합니다.


GDAL 방법이 Esri 방법보다 더 효율적이라고 생각하는 이유는 무엇입니까?
artwork21

tiff에 xyz-csv를 사용하는 정확한 예는 다음 문서에 있습니다. gdal.org/gdal_grid.html
Matte

질문은 정확히 무엇입니까? 지금 대답은 "예, GDAL을 사용하여 변환 할 수 있습니다"입니다. :}
bugmenot123

문제는 변환을 적용하는 방법입니다. Matt의 의견은 해결책을 제시하는 것 같습니다. 이것을 시도하겠습니다.
Arne

확인! 최소한의 데이터 사례를 제공 할 수 있습니까? GDAL로 답변을 원하십니까? 아니면 다른 무료 도구 (예 : GMT)도 괜찮습니까?
bugmenot123

답변:


16

GDAL을 사용하여이 작업을 수행 할 수 있으며 XYZ 형식을 직접 지원 합니다 . 좌표가 UTM인지 여부는 중요하지 않습니다. gdal_translate는 동일한 좌표계로 출력됩니다.

따라서 GeoTIFF로 변환하는 것은 다음과 같이 간단합니다.

gdal_translate test.xyz test.tif

출력 옵션 (예 : 압축) 은 GeoTIFF 문서와 자세한 사용법 정보 는 gdal_translate 문서를 참조하십시오. 특히, 좌표계가 -a_srs매개 변수로 무엇인지 지정해야합니다 .

-a_srs srs_def :

출력 파일의 투영을 재정의합니다. srs_def는 일반적인 GDAL / OGR 형식, 완전한 WKT, PROJ.4, EPSG : n 또는 WKT를 포함하는 파일 중 하나 일 수 있습니다.

gdal_translate -a_srs EPSG:12345 test.xyz test.tif

머리글 행이 있거나없는 쉼표 / ​​공백으로 구분되고 고정 된 열 너비가 지원됩니다.

지원되는 열 구분 기호는 공백, 쉼표, 세미콜론 및 표입니다.

$ head -n 2 test_space.xyz 
x y z
146.360047076550984 -39.0631214488636616 0.627969205379486084

$ gdalinfo test_space.xyz
Driver: XYZ/ASCII Gridded XYZ
Files: test_space.xyz
Size is 84, 66
Coordinate System is `'
Origin = (146.359922066953317,-39.062997159090934)
Pixel Size = (0.000250019195332,-0.000248579545455)
Corner Coordinates:
Upper Left  ( 146.3599221, -39.0629972) 
Lower Left  ( 146.3599221, -39.0794034) 
Upper Right ( 146.3809237, -39.0629972) 
Lower Right ( 146.3809237, -39.0794034) 
Center      ( 146.3704229, -39.0712003) 
Band 1 Block=84x1 Type=Float32, ColorInterp=Undefined
  Min=0.336 Max=0.721 

$ head -n 2 test_commas.xyz 
x, y, z
146.360047076550984, -39.0631214488636616, 0.627969205379486084

$ gdalinfo test_commas.xyz
Driver: XYZ/ASCII Gridded XYZ
etc...

$ head -n 2 test_formatted.xyz
x                       y                       z
146.3600471            -39.06312145             0.627969205

$ gdalinfo test_formatted.xyz
Driver: XYZ/ASCII Gridded XYZ
etc...

유일한 개는 제가 알고 있습니다 :

  1. 드라이버가 전체 파일을 스캔하여 데이터 세트 크기와 공간 해상도를 결정해야하므로 큰 데이터 세트를 여는 속도가 느려질 수 있습니다. 과
  2. 파일을 올바르게 정렬해야합니다 (Y, X).

    Y 좌표가 동일한 셀은 연속 된 선에 배치해야합니다. 동일한 Y 좌표 값의 경우 X 값을 증가시켜 데이터 세트의 선을 구성해야합니다. 그러나 Y 좌표의 값은 증가 또는 감소 할 수 있습니다.

    $ head -n 5 test.csv
    x,y,z
    146.3707979,-39.07778764,0.491866767
    146.3787985,-39.07157315,0.614820838
    146.3637974,-39.07132457,0.555555582
    146.3630473,-39.07579901,0.481217861
    
    $ gdalinfo test.csv
    ERROR 1: Ungridded dataset: At line 3, too many stepY values
    gdalinfo failed - unable to open 'test.csv'.
    
    $ tail -n +2 test.csv| sort -n -t ',' -k2 -k1 > test_sorted.xyz
    
    $ head -n 5 test_sorted.xyz 
    146.3600471,-39.07927912,0.606096148
    146.3602971,-39.07927912,0.603663027
    146.3605471,-39.07927912,0.603663027
    146.3607971,-39.07927912,0.589507282
    146.3610472,-39.07927912,0.581049323
    
    $ gdalinfo test_sorted.xyz
    Driver: XYZ/ASCII Gridded XYZ
    etc...

2
좌표가 무엇인지 명확하게하기 위해 CRS를 출력에 할당하는 것이 좋습니다.-a_srs EPSG:12345
bugmenot123

1
좋은 점 @bugmenot
user2856

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.