Xử lý giá trị -9999 khi xuất chỉ số đánh giá từ ArcGIS

Khi thực hiện trích xuất các chỉ số đánh giá (evaluation metrics) trong ArcGIS, việc gặp giá trị -9999 trong tập dữ liệu đầu ra là hiện tượng phổ biến — thường phản ánh sự hiện diện của ô dữ liệu không hợp lệ hoặc giá trị NoData. Nguyên nhân chủ yếu bắt nguồn từ cách ArcGIS xử lý các vùng thiếu thông tin trong dữ liệu raster, đặc biệt trong các quy trình phân tích không gian, mô hình hóa môi trường hoặc tính toán chỉ số như NDVI, độ dốc, hay khả năng xói mòn.

Kiểm tra bản chất của giá trị -9999 trong dữ liệu gốc

Trước tiên, cần xác định liệu -9999 có tồn tại ngay trong dữ liệu đầu vào hay chỉ xuất hiện sau quá trình xử lý. Một số bộ dữ liệu vệ tinh hoặc DEM công cộng sử dụng -9999 làm mã chuẩn cho ô rỗng (NoData). Để kiểm tra, bạn có thể dùng công cụ Raster Properties trong ArcMap/ArcGIS Pro hoặc chạy đoạn mã Python sau:

import arcpy
from arcpy import sa

# Thiết lập đường dẫn và tên lớp raster
input_raster = r"C:\data\index.tif"
desc = arcpy.Describe(input_raster)

# In ra các thuộc tính thống kê cơ bản
print(f"Giá trị nhỏ nhất: {getattr(desc, 'minimum', 'N/A')}")
print(f"Giá trị lớn nhất: {getattr(desc, 'maximum', 'N/A')}")
print(f"Giá trị NoData: {getattr(desc, 'noDataValue', 'N/A')}")

# Kiểm tra phân bố giá trị bằng histogram (nếu khả dụng)
if hasattr(desc, 'histogram'):
    print("Dữ liệu có histogram — có thể phân tích phân bố giá trị chi tiết.")

Nếu kết quả trả về -9999 ở thuộc tính noDataValue, đây chính là giá trị biểu thị thiếu dữ liệu — không phải lỗi mà là hành vi thiết kế.

Chuyển đổi NoData thành giá trị hợp lệ hoặc giữ nguyên nhưng kiểm soát đầu ra

Khi xuất dữ liệu sang định dạng như GeoTIFF hoặc CSV, một số công cụ hoặc cài đặt xuất mặc định sẽ chuyển NoData thành -9999. Để kiểm soát điều này, bạn có thể:

  • Dùng hàm Con kết hợp IsNull để thay thế NoData bằng giá trị cụ thể (ví dụ: 0, -1, hoặc giá trị trung bình lân cận):
# Thay thế NoData bằng giá trị trung bình cục bộ (3x3)
raster_obj = sa.Raster(input_raster)
filtered = sa.FocalStatistics(raster_obj, sa.NbrRectangle(3, 3, "CELL"), "MEAN", "DATA")
out_clean = sa.Con(sa.IsNull(raster_obj), filtered, raster_obj)
out_clean.save(r"C:\output\clean_index.tif")
  • Hoặc cấu hình môi trường xuất để tránh ghi đè NoData thành -9999:
arcpy.env.nodata = "NONE"  # Ngăn ArcGIS tự động gán -9999 khi không có giá trị NoData rõ ràng
arcpy.env.compression = "LZW"  # Giảm rủi ro mất mát kiểu dữ liệu khi nén
arcpy.env.pyramid = "PYRAMIDS 0 BILINEAR NONE"  # Đảm bảo không làm biến dạng giá trị gốc khi tạo pyramid

Tối ưu hóa cài đặt xuất dữ liệu

Khi sử dụng công cụ Raster to ASCII, Extract Values to Points, hoặc Table To Excel, hãy chú ý:

  • Trong Environment SettingsRaster Storage, thiết lập NoData value thành None hoặc giá trị mong muốn (ví dụ: -9999.0 nếu dùng làm placeholder).
  • Khi xuất sang CSV qua Attribute Table, đảm bảo chọn tùy chọn "Export all records" và vô hiệu hóa "Use field alias as column header" để tránh sai lệch định dạng số.
  • Với dữ liệu dạng điểm, nên dùng Extract Multi Values to Points thay vì Extract Values to Points để giảm khả năng trả về -9999 do không chồng lấn với ô raster.

Thẻ: arcgis raster-processing nodata python-arcpy geospatial-analysis

Đăng vào ngày 23 tháng 6 lúc 08:31