Download Sentinel 2 high-resolution optical images with Python

chaipat ncm
Geo Data Science
Published in
4 min readSep 20, 2019

วิธีการดาวน์โหลดข้อมูล Sentinel 2 satellite images จาก Copernicus Open Access Hub

ช่วงนี้ผมทำโปรเจค Smartfarm การใช้ข้อมูลภาพถ่ายดาวเทียมช่วยได้มากในการบริหารจัดการข้อมูลภาพใหญ่ สิ่งสำคัญคือถ้าเราได้ข้อมูลภาพถ่ายดาวเทียมที่มีความ update รอบความถี่ที่เหมาะ ยิ่งติดตามสภาวะการเปลี่ยนแปลงที่เกิดได้อย่างทันถ่วงที

Sentinel-2

Sentinel เป็นโครงการดาวเทียมสำรวจทรัพยากรของ EU Copernicus Programme โดยโครงการ sentinel2 ดำเนินการภายใต้การดูแลของ European Space Agenc yปัจจุบันมีดาวเทียม 2 ดวง( identical)ทำการสำรวจเก็บข้อมูลร่วมกันคือ Sentinel-2A(launch 2015) และ Sentinel-2B(launch 2017)

ระบบบันทึกข้อมูลภาพของ sentinel รองรับ 13 ย่านความถี่แบบ MS จาก visible, near infrared,และ short wave infrared ข้อมูลภาพระดับ High spatial resolution (10-60 m) มีพื้นที่ทำการครอบคลุมทั่วโลก ทั้งภาคพื้นดินและมหาสมุทร มีรองการบันทึกข้อมูลซ้ำทุกๆ 5 วัน

Sentinel ถูกพัฒนาขึ้นเพื่อรองรับ application ต่างๆเช่นการเกษตร , การสำรวจทรัพยกร, การจัดการภัยพิบัติ ,การจัดการทรัพยากรน้ำ และอื่นๆ

Download Sentinel Satellite Imagery Data

ESA เปิดบริการข้อมูล sentinel ฟรี(กรณีไม่ใช่เพื่อการค้า) ทำให้ตรงนี้เป็นโอกาสอย่างมาก ในการนำข้อมูลภาพถ่ายดาวเทียมรายละเอียดสูงระดับ 10 เมตร มาใช้ใน โดย การเข้าถึงข้อมูลสามารถทำได้หลากหลายแบบ เช่น การดาวโหลดผ่านหน้า web application หรือแม้แต่การเข้าถึงจาก Python API ซึ่ง บทความนี้จะสาธิตกระบวนการนี้ เพราะเป้าหมายเราจะทำระบบ RS แบบ automatic นั้นคือใช้ คอมพิวเตอร์ ในการดาวน์โหลด ข้อมูลทุกสัปดาห์ เพื่อเข้าสู่ระบบ ประมวลผลต่อไป

  1. สมัครสมาชิก ลงทะเบียนจาก ESA
    การสมัครสมาชิกเริ่มจากการเข้าสู่ web ของ Copernicus Open Access Hub แล้วลงทะเบียน แจ้งชื่อและ email บวกรายละเอียดอื่นๆ ใช้เวลาไม่ถึง 5 นาที จากนั้น รอรับการยืนยัน accout และ password พร้อมใช้งาน

https://scihub.copernicus.eu/dhus/#/home

2. ติดตั้ง sentinelsat

Sentinelsat เป็น Python Package ที่รองรับ API ของ Copernicus Open Access Hub ซึ่งทำให้การเข้าถึงข้อมูลภาพถ่ายดาวเทียม sentinel จากคลังข้อมูล ง่ายและสะดวกมากขึ้น การติดตั้งใช้คำสั่ง

git clone https://github.com/sentinelsat/sentinelsat.git
cd sentinelsat
pip install -e .[dev]
py.test -v

หรือจะติดตั้งผ่าน pip ด้วยคำสั่ง

pip install sentinelsat

3. การสืบค้นและดาวน์โหลดข้อมูล

การสืบค้นข้อมูลจากคลังข้อมูลภาพของ sentinel ทำได้ไม่ยาก แต่กรณีต้องการเข้าถึงแบบซับซ้อนก็ทำได้เช่นกัน โดย API จะมีหลายพารามิเตอร์ให้ เราสามารถกำหนดได้ ซึ่งบทความนี้จะขอสาธิต การเข้าถึง sentinel 2 แบบเบื้องต้น

  • กำหนด lib ที่จะใช้งานจาก sentinelsat
from sentinelsat.sentinel import SentinelAPI, read_geojson, geojson_to_wkt
from datetime import date
  • ทำการกำหนดรายละเอียดการเชื่อมต่อ เพื่อเข้าถึง data hub จะทำการใส่ user และ password ที่ลงทะเบียนไว้ในตอนแรก
# connect to the API
api = SentinelAPI(‘user’, ‘password’, ‘https://scihub.copernicus.eu/dhus')
  • สร้าง foot print หรือกรอบพื้นที่ ที่ต้องการสืบค้นและดาวน์โหลด โดยสร้างเป็น geojson file จากขอบเขต bbox ระบบพิกัดแบบ Geographic coordinate system WGS84
footprint = geojson_to_wkt(read_geojson(‘./map_aoi.geojson’))
  • ทำการประกอบรายละเอียด สำหรับการส่งคำสั่งสืบค้น สำคัญคือ date วันที่ต้องการ, ประเภท ดาวเทียมและ Sensor นอกจากนี้ยังระบุผลลัพธ์ของ product เช่น ปริมาณเมฆ ได้ด้วย
products = api.query(footprint,date = ('20180101', '20190826'),
platformname = 'Sentinel-2',cloudcoverpercentage=(0, 30))
  • ส่งคำสั่งสืบค้น แล้วรอผลลัพธ์ โดยสามารถแปลง result ให้อยู่ใน dataframe เพื่อง่ายต่อการวิเคราะห์และแสดงผลได้ด้วย
# convert to Pandas DataFrame
products_df = api.to_dataframe(products)
  • นอกจากผลลัพธ์ที่เป็น table ดังภาพ ยังสามารถสกัด geometry ของขอบเขตภาพถ่ายแต่ละซีนที่ได้กลับมา เพื่อตรวจสอบได้ด้วยจาก
api.to_geojson(products)
  • เมื่อได้ข้อมูลภาพ ที่ต้องการ ก็จะทำการ download ข้อมูลโดยใช้คำสั่งดังต่อไปนี้
# download single scene by known product id
api.download(<product_id>)
  • ข้อมูลที่ได้ มีขนาดใหญ่พอควร อาจจะใช้เวลาในการดาวน์โหลด เมื่อได้ข้อมูลมาแล้ว ทำการแตก zip
  • เราสามารถเข้าถึงไฟล์ภาพ sentinel 2 ได้ ตามโครงสร้างแผนผันในภาพด้านล่าง โดยข้อมูลภาพจะแยกเป็นแต่ละ band อยู่รูปแบบ .jp2 พร้อมไฟล์ meta data
  • ข้อมูลภาพจะมี spatial resolution ระดับ 10 m กลุ่ม MS-NIR และกลุ่มรายละเอียดต่ำ แตกต่างกันไปตามชุดการตรวจวัดเชิงคลื่นต่างๆ
  • ทดสอบเปิดภาพเพื่อทำการตรวจสอบ สามารถใช้ gdal หรือ rasterio ในการเปิดภาพได้
with rio.open(‘sentinel2B_june2019.tif’) as src :
fig, ax = plt.subplots()
rio.plot.show(src, ax=ax, title=’Stack Bands’)
  • ทดลองสร้าง NDVI Image โดยใช้ข้อมูล B4 และB8

เรียบร้อยพร้อมใช้งาน กรณีต้องการข้อมูลหลายช่วงเวลา multi temporal สามารถเขียน script ให้ทำการ download ข้อมูลซ้ำได้ทันที

ส่วนการวิเคราะห์และประมวลผล ข้อมูลจากภาพถ่ายดาวเทียมด้วย python สามารถอ่านได้จาก บทความใน link ด้านล่างครับ

https://medium.com/geo-datascience/python-rs/home

อ้างอิงจาก

--

--

chaipat ncm
Geo Data Science

GIS Developer , Data Scientist (Machine Learning &Deep Learning) at Ayutthaya-GIS Co., Ltd. ,Contract Me >> chaipat.ayutthaya.gis@gmail.com