Ein Programm, das NDVI (Vegetationsindex) mit einem GIS-Tool namens Arcgis berechnet Der Vegetationsindex ist ein Index, der lediglich die Menge und Aktivität von Pflanzen unter Verwendung der Eigenschaften der Lichtreflexion von Pflanzen anzeigt. Der verwendete Editor war Jupyter und die Sprache war Python.
Registrieren Sie sich für die Verwendung der Arcgis Rest-API unter der folgenden URL Client ID Client Secret Ich werde später zwei davon verwenden.
https://developers.arcgis.com/labs/rest/get-an-access-token/
import pandas as pd
import requests
import urllib.request
#Stellen Sie so ein, dass die Anzeige in Pandas nicht ausgelassen wird
pd.set_option("max_columns", 100)
pd.set_option('max_rows',1000)
pd.set_option('max_info_columns',100)
Importieren Sie zunächst die Bibliothek
ARCGIS_CLIENT_ID = ''
ARCGIS_CLIENT_SECRET = ''
Registrieren Sie CLIENT_ID und CLIENT_SECRET, die zum Zeitpunkt der Registrierung als Umgebungsvariablen erhalten wurden
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
Definieren Sie eine Funktion, um access_token zu erhalten Erforderlich beim Zugriff auf die API
field_center =[[120.095415,40.345695]]
satellite_date = '2019/05/20'
arcgis_token = get_arcgis_token()
・ Field_center Koordinaten des Landes, in dem Sie den NDVI messen möchten Es ist auch möglich, mehrere Koordinaten zu übergeben
・ Satellitendatum Wenn Sie Daten wollen
・ Arcgis_token Token für den Zugriff auf die API
#points
#Wird verwendet, wenn Sie Satellitenwellenlängendaten an mehreren Punkten erfassen möchten
#Hier verwenden wir einen europäischen Satelliten namens 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
・ "Punkte": field_center, 'räumliche Referenz': {'wkid': 4326}} Zuvor angegebene Koordinaten Es gibt verschiedene Koordinatensysteme beim Ausdrücken von Positionsinformationen, aber wkid definiert, welches Koordinatensystem verwendet werden soll. 4326 ist ein geografisches Koordinatensystem und ein durch GPS erhaltenes Koordinatensystem.
・ 'Kategorie = 1 UND Wolkendecke <= 0,10' Gelegentlich wird ein graues Bild zurückgegeben, bei dem es sich um ein Hintergrundbild handelt. Geben Sie daher die Kategorie an, damit nur Satellitenbilder zurückgegeben werden. Geben Sie die Wolkendecke und ein Satellitenbild mit weniger als 10% Wolke an
・ 'SortValue': Satellitendatum, Das zuvor angegebene Datum
・ Token ': arcgis_token,' returnFirstValueOnly ':' true ', Das Zeichen, das ich früher bekommen habe Da die API sehr schwer ist, geben Sie hier an, dass nur der erste Wert zurückgegeben wird
Detaillierte API-Spezifikationen finden Sie in der offiziellen Dokumentation (ziemlich verwirrend). 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 ist ein Rückgabewert und gibt eine neue Instanz zurück
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'])
Formatieren Sie die zurückgegebenen Daten, machen Sie sie zu einem Pandas-Datenrahmentyp, berechnen Sie den NDVI und fügen Sie ihn der Spalte hinzu Im Fall von Sentinel ist Band 4 der rote Wellenlängenbereich und Band 8 der Wellenlängenbereich im nahen Infrarot.
Sie können den NDVI so berechnen
Verweise https://developers.arcgis.com/rest/services-reference/get-samples.htm https://qiita.com/boiledorange73/items/b98d3d1ef3abf7299aba
Recommended Posts