Un programme qui calcule le NDVI (indice de végétation) à l'aide d'un outil SIG appelé Arcgis L'indice de végétation est un indice qui montre simplement la quantité et l'activité des plantes en utilisant les caractéristiques de réflexion de la lumière des plantes. L'éditeur utilisé était Jupyter et le langage était Python.
Inscrivez-vous pour utiliser l'API Arcgis Rest en vous référant à l'URL ci-dessous Client ID Client Secret J'en utiliserai deux plus tard.
https://developers.arcgis.com/labs/rest/get-an-access-token/
import pandas as pd
import requests
import urllib.request
#Réglez pour que l'affichage dans Pandas ne soit pas omis
pd.set_option("max_columns", 100)
pd.set_option('max_rows',1000)
pd.set_option('max_info_columns',100)
Tout d'abord, importez la bibliothèque
ARCGIS_CLIENT_ID = ''
ARCGIS_CLIENT_SECRET = ''
Enregistrer CLIENT_ID et CLIENT_SECRET obtenus au moment de l'enregistrement en tant que variables d'environnement
def get_arcgis_token():
response = requests.get('https://www.arcgis.com/sharing/rest/oauth2/token/',
params = {'client_id' : ARCGIS_CLIENT_ID,
'client_secret': ARCGIS_CLIENT_SECRET,
'grant_type': 'client_credentials'})
arcgis_token = response.json()['access_token']
return arcgis_token
Définir une fonction pour obtenir access_token Obligatoire lors de l'accès à l'API
field_center =[[120.095415,40.345695]]
satellite_date = '2019/05/20'
arcgis_token = get_arcgis_token()
・ Field_center Coordonnées du terrain où vous souhaitez mesurer le NDVI Il est également possible de passer plusieurs coordonnées
・ Satellite_date Quand vous voulez des données
・ Arcgis_token Jeton pour accéder à l'API
#points
#Utilisé lorsque vous souhaitez collecter des données de longueur d'onde satellite en plusieurs points
#Ici, nous utilisons un satellite européen appelé Sentinel
def get_sentinel_sample(arcgis_token):
response = requests.get('https://sentinel.arcgis.com/arcgis/rest/services/Sentinel2/ImageServer/getSamples',
params = urllib.parse.urlencode({'geometryType' : 'esriGeometryMultiPoint',
'geometry': { "points":field_center, 'spatialReference': { 'wkid': 4326}},
'mosaicRule': {'mosaicMethod': 'esriMosaicAttribute',
'where': 'category = 1 AND cloudcover <= 0.10',
'sortField': 'acquisitionDate',
'sortValue': satellite_date,
'ascending': 'true'
},
'token': arcgis_token,
'returnFirstValueOnly': 'true',
'f': 'json' }))
sent_sample = response.json()
return sent_sample
・ "Points": field_center, 'spatialReference': {'wkid': 4326}} Coordonnées spécifiées précédemment Il existe différents systèmes de coordonnées lors de l'expression des informations de position, mais wkid définit le système de coordonnées à utiliser. 4326 est un système de coordonnées géographiques et est un système de coordonnées obtenu par GPS.
・ 'Catégorie = 1 ET couverture nuageuse <= 0,10' Parfois, une image grise, qui est une image d'arrière-plan, est renvoyée, spécifiez donc la catégorie de sorte que seules les images satellite soient renvoyées. Spécifiez la couverture nuageuse et spécifiez une image satellite avec moins de 10% de nuages
・ 'SortValue': date_ satellite, La date que vous avez spécifiée précédemment
・ Jeton ': arcgis_token,' returnFirstValueOnly ':' true ', Le jeton que j'ai eu plus tôt Puisque l'API est très lourde, spécifiez ici pour ne renvoyer que la première valeur
Consultez la documentation officielle pour les spécifications détaillées de l'API (assez déroutantes) https://developers.arcgis.com/rest/services-reference/get-samples.htm
sent_sample = get_sentinel_sample(arcgis_token)
sat_val = sent_sample['samples'][0][('value')]
df_sat_band = pd.DataFrame(columns=['band1','band2','band3','band4','band5','band6','band7','band8','band8a','band9','band10','band11','band12'])
band_val = pd.Series([int(strip_num.strip()) for strip_num in sat_val.split()],index=df_sat_band.columns)
#append est une valeur de retour et renvoie une nouvelle instance, alors réaffectez
df_sat_band = df_sat_band.append(band_val, ignore_index=True)
df_sat_band['NDVI'] = (df_sat_band['band8'] - df_sat_band['band4']) /(df_sat_band['band8'] + df_sat_band['band4'])
Formatez les données renvoyées, faites-en un type de trame de données pandas, calculez le NDVI et ajoutez-le à la colonne Dans le cas de Sentinel, la bande 4 est la plage de longueurs d'onde rouge et la bande 8 est la plage de longueurs d'onde du proche infrarouge.
Vous pouvez calculer le NDVI comme ceci
Les références https://developers.arcgis.com/rest/services-reference/get-samples.htm https://qiita.com/boiledorange73/items/b98d3d1ef3abf7299aba
Recommended Posts