การทำงานกับข้อมูล raster

การทำงานกับข้อมูลเชิงพื้นที่ใน Python

Joris Van den Bossche

Open source software developer and teacher, GeoPandas maintainer

ภาพแสดงกริดของค่าข้อมูล

แหล่งที่มา: เอกสาร QGIS

การทำงานกับข้อมูลเชิงพื้นที่ใน Python

ข้อมูล Raster

แผนที่แสดงโอกาสฝนตก

การทำงานกับข้อมูลเชิงพื้นที่ใน Python

ข้อมูล Raster แบบหลายแบนด์

การทำงานกับข้อมูลเชิงพื้นที่ใน Python

แพ็กเกจ rasterio

import rasterio
  • การเชื่อมต่อแบบ "Pythonic" กับ GDAL
  • อ่าน และ เขียน ไฟล์ raster
  • เครื่องมือ ประมวลผล (masking, reprojection, resampling, ..)

https://rasterio.readthedocs.io/en/latest/

การทำงานกับข้อมูลเชิงพื้นที่ใน Python

การเปิดไฟล์ raster

import rasterio

src = rasterio.open("DEM_world.tif")

เมทาดาตา:

src.count
1
src.width, src.height
(4320, 2160)
การทำงานกับข้อมูลเชิงพื้นที่ใน Python

ข้อมูล Raster = numpy array

array = src.read()

อาร์เรย์ numpy มาตรฐาน:

array
array([[[-4290, -4290, -4290, ..., -4290, -4290, -4290],
        [-4278, -4278, -4278, ..., -4278, -4278, -4278],
        [-4269, -4269, -4269, ..., -4269, -4269, -4269],
        ...,
        [ 2804,  2804,  2804, ...,  2804,  2804,  2804],
        [ 2804,  2804,  2804, ...,  2804,  2804,  2804],
        [ 2804,  2804,  2804, ...,  2804,  2804,  2804]]], dtype=int16)
การทำงานกับข้อมูลเชิงพื้นที่ใน Python

การพล็อตชุดข้อมูล raster

ใช้เมธอด rasterio.plot.show():

import rasterio.plot

rasterio.plot.show(src, cmap='terrain')

การทำงานกับข้อมูลเชิงพื้นที่ใน Python

การดึงข้อมูลโดยอิงจากข้อมูลเวกเตอร์

rasterstats: สถิติสรุปของชุดข้อมูล raster เชิงภูมิสารสนเทศโดยอิงตามเรขาคณิตเวกเตอร์ (https://github.com/perrygeo/python-rasterstats)

การทำงานกับข้อมูลเชิงพื้นที่ใน Python

ดึงค่า raster ด้วย rasterstats

  • สำหรับเวกเตอร์แบบจุด:

    rasterstats.point_query(geometries, "path/to/raster", 
                            interpolation='nearest'|'bilinear')
    
  • สำหรับเวกเตอร์แบบพื้นที่:

    rasterstats.zonal_stats(geometries, "path/to/raster",
                            stats=['min', 'mean', 'max'])
    
การทำงานกับข้อมูลเชิงพื้นที่ใน Python

ดึงค่า raster ด้วย rasterstats

result = rasterstats.zonal_stats(countries.geometry, "DEM_gworld.tif", 
                                 stats=['mean'])

countries['mean_elevation'] = pd.DataFrame(result)
countries.sort_values('mean_elevation', ascending=False).head()
            name    continent                     geometry  mean_elevation
157   Tajikistan         Asia  POLYGON ((74.98 37.41, ...      3103.231105
85    Kyrgyzstan         Asia  POLYGON ((80.25 42.34, ...      2867.717142
24        Bhutan         Asia  POLYGON ((91.69 27.77, ...      2573.559846
119        Nepal         Asia  POLYGON ((81.11 30.18, ...      2408.907816
6     Antarctica   Antarctica  (POLYGON ((-59.57 -80.04...     2374.075028
..           ...          ...                          ...             ...
การทำงานกับข้อมูลเชิงพื้นที่ใน Python

มาฝึกกันเถอะ!

การทำงานกับข้อมูลเชิงพื้นที่ใน Python

Preparing Video For Download...