Chuyển đổi CSV XYZ lớn sang GeoTIFF


11

Tôi có một số lượng lớn các dữ liệu dưới dạng CSV chứa tọa độ UTM như XYvà một giá trị cao như Zthông tin. Tôi cần chuyển đổi các dữ liệu này thành DEM dưới dạng GeoTIFF để phân tích thêm. Trong trường hợp này, một lượng lớn có nghĩa là 16 m. dòng, với một điểm trong X, YZtrên mỗi dòng. Các điểm được phân bổ đều, do đó không cần phải nội suy; mỗi điểm chỉ cần được chuyển đổi thành một ô raster.

Dữ liệu gốc không có dấu phân cách, với độ rộng cột cố định. Tôi đã tìm ra cách chuyển đổi cú pháp tệp để sử dụng dấu phân cách thay vì độ rộng cố định và loại bỏ tất cả các ký tự khoảng trắng, sử dụng trình soạn thảo văn bản dòng sed . Từ đây trở đi, thông thường quy trình làm việc của tôi sẽ là nhập dữ liệu vào ArcGIS bằng cách tạo một lớp tính năng từ X, YZdữ liệu và như bước thứ hai, chuyển đổi shapefile điểm thành GeoTIFF, sử dụng công cụ Point to Raster . Tuy nhiên, tập tin tôi hiện đang có quá lớn cho quá trình này.

Thay vì quy trình công việc được mô tả ở trên, tôi đã tìm kiếm một giải pháp thay thế hiệu quả và phát hiện ra GDAL. Tuy nhiên, trong gdal_translateđịnh dạng được hỗ trợ gần nhất mà tôi có thể tìm thấy trong danh sách filetype được hỗ trợ, là lưới ASCII nhưng không có XYZ được phân tách bằng dấu phẩy. Một khó khăn khác là tôi có tọa độ UTM , trong khi hầu hết các ví dụ dường như sử dụng tọa độ độ thập phân. Tuy nhiên, tôi cần ở lại trong hệ thống UTM (hoặc ít nhất, GeoTIFF đầu ra của tôi cần nằm trong hệ tọa độ UTM).

Vì vậy, tôi đang tìm cách chuyển đổi XYZ CSV thành GeoTIFF, sử dụng GDAL , nhưng cho đến nay vẫn không thể tìm thấy các ví dụ xử lý vấn đề chính xác này. Tôi sẽ rất vui cho một số gợi ý hoặc thậm chí các ví dụ mã.


Tại sao bạn nghĩ phương pháp GDAL sẽ hiệu quả hơn phương pháp Esri?
nghệ thuật21

Ví dụ chính xác về việc sử dụng xyz-csv cho một tiff có trong tài liệu ở đây: gdal.org/gdal_grid.html
Mờ

Chính xác câu hỏi là gì? Ngay bây giờ câu trả lời là "có, bạn có thể sử dụng GDAL để chuyển đổi". :}
bugmenot123

Câu hỏi là làm thế nào để áp dụng chuyển đổi. Nhận xét của Matte dường như cung cấp giải pháp - Tôi sẽ thử điều này.
Arne

Đồng ý! Bạn có thể cung cấp một trường hợp ví dụ tối thiểu của dữ liệu? Bạn có muốn có câu trả lời trong GDAL không hoặc các công cụ miễn phí khác (ví dụ GMT) cũng ổn chứ?
bugmenot123

Câu trả lời:


16

Bạn có thể làm điều này bằng cách sử dụng GDAL, nó hỗ trợ trực tiếp định dạng XYZ . Sẽ không có vấn đề gì nếu tọa độ của bạn là UTM, gdal_translate sẽ xuất ra trong cùng một hệ tọa độ.

Vì vậy, để chuyển đổi sang GeoTIFF đơn giản như:

gdal_translate test.xyz test.tif

Xem tài liệu GeoTIFF để biết các tùy chọn đầu ra (như nén) và tài liệu gdal_translate để biết thêm thông tin sử dụng. Cụ thể, bạn nên chỉ định hệ tọa độ là gì với -a_srstham số.

-a_srs srs_def:

Ghi đè hình chiếu cho tệp đầu ra. Srs_def có thể là bất kỳ biểu mẫu GDAL / OGR thông thường nào, WKT hoàn chỉnh, PROJ.4, EPSG: n hoặc một tệp chứa WKT.

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

Độ rộng cột được phân tách bằng dấu phẩy / dấu cách và không gian, có và không có hàng tiêu đề được hỗ trợ.

Các dấu tách cột được hỗ trợ là dấu cách, dấu phẩy, dấu chấm phẩy và bảng.

$ 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...

Các vấn đề duy nhất tôi biết là:

  1. Việc mở một tập dữ liệu lớn có thể chậm vì trình điều khiển phải quét toàn bộ tệp để xác định kích thước tập dữ liệu và độ phân giải không gian; và
  2. Các tập tin phải được sắp xếp chính xác (theo Y, sau đó X).

    Các ô có cùng tọa độ Y phải được đặt trên các dòng liên tiếp. Đối với cùng một giá trị tọa độ Y, các dòng trong bộ dữ liệu phải được tổ chức bằng cách tăng giá trị X. Tuy nhiên, giá trị của tọa độ Y có thể tăng hoặc giảm.

    $ 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
Tôi đặc biệt khuyên bạn nên gán CRS cho đầu ra để làm rõ tọa độ là gì:-a_srs EPSG:12345
bugmenot123

1
Điểm hay @ormsmenot
user2856

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.