久しぶりの Python
久しぶりすぎて忘れてる。特に配列の使いかた。
VMWareの ubuntu で試して,大丈夫そうなら本番環境へ。
ほとんど宙畑のコードのままだけど,Sentinel-1に関するところはもちろん変更。
本職ではないので,間違っているところがあればご容赦ください。
結局は自分メモなので。
環境の準備から
注意点の説明。独自仕様があるので要確認。
ユーザーディレクトリにいれるか,いつも通りの /usr/local/lib にいれるか,ですね。
pip: Python環境構築ガイド - python.jp
sentinelhub のインストール方法を確認してみた。pip でいれるので,注意点は上記の通り。
Installation — Sentinel Hub 3.7.0 documentation
anaconda をつかうことにしたので,conda install であることに注意。
Conda と Pip: Python環境構築ガイド - python.jp
結局,下記の通りなので仮想マシンを再構成して,apt でいれることにした。
pip は極力使わないほうがいいみたいだし。
また,anaconda の conda で geopands いれようと思ったら入らないし。
pip: Python環境構築ガイド - python.jp
sentinelsat,geopandas,folium を python3-? でいれた。
anaconda で spyder をつかったので,どうせならと apt で spyder もいれた。
コードの説明
参考した宙畑ではimportがたくさんあったけど,結局使ってない。
注意点というかメモを列挙。
- よくわかってないのがダメなんだけど, orbitnumber で指定できるのかと思ったけどできなかった。
- 場所を AREA で指定するけど,重なる場合もあるので relativeorbitnumber で指定すればよいと思った。
- products の中身は,Open Access Hub を参考に。
- S1AとS1Bをどう区別すればよいのかわからなかった。Search Keywords にも無いし。そこで,orbitdirection と relativeorbitnumber で指定してみた。
- 日付が新しい順にsort して,最も新しい日付だけを download することにした。毎日 cron でまわすなら,1個とればよいかと。
import folium
from sentinelsat import SentinelAPI, read_geojson, geojson_to_wkt
import geopandas as gpd
import sys
import datetime
dt_now = datetime.datetime.now()
AREA = [ [ x1, y1 ], [ x2, y2 ], [ x3, y3 ], [ x4, y4 ], [ x5, y5] ]
for i in range(len(AREA)):
AREA[i][0] = AREA[i][0] +360
from geojson import Polygon
m=Polygon([AREA])
object_name = 'NAME'
import json
with open(str(object_name) +'.geojson', 'w') as f:
json.dump(m, f)
footprint_geojson = geojson_to_wkt(read_geojson(str(object_name) +'.geojson'))
user = 'USER'
password = 'PASS'
api = SentinelAPI(user, password, 'https://scihub.copernicus.eu/dhus')
m = folium.Map([(AREA[0][1]+AREA[len(AREA)-1][1])/2,(AREA[0][0]+AREA[len(AREA)-1][0])/2], zoom_start=10)
folium.GeoJson(str(object_name) +'.geojson').add_to(m)
m
products = api.query(footprint_geojson,
platformname = 'Sentinel-1',
producttype = 'SLC',
orbitdirection = 'Ascending',
polarisationmode = 'VV VH',
sensoroperationalmode = 'IW',
relativeorbitnumber = '83',
date = (dt_now.strftime('%Y%m%d'), dt_now.strftime('%Y%m%d'))
)
if len(products) == 0:
sys.exit()
else:
products_gdf = api.to_geodataframe(products)
products_gdf_sorted = products_gdf.sort_values(['beginposition'], ascending=[False])
index = products_gdf_sorted.index[0]
api.download(index)
リンク関係
APIなど
Sentinelsat — Sentinelsat 1.1.1 documentation
Getting Started — GeoPandas 0.11.0+0.g1977b50.dirty documentation
衛星に関すること
User Guides - Sentinel-1 SAR - Sentinel Online - Sentinel Online
Sentinel-1A / 1B / 1C / 1D | 一般財団法人リモート・センシング技術センター
プログラムの参考
【コード付き】Sentinelの衛星データをAPI経由で取得してみた | 宙畑