ユーザー定義APIを使用する

Tag

はじめに

本記事ではTellusのJupyterLabを使って空間データを保存する方法と保存された空間データを取得する方法を紹介します。APIの詳細についてはこちらをご覧ください。

APIでGeoJSONファイルを読み込む/保存する

以下のサンプルをテキストエディタでsample.geojsonとして保存し、Tellus OSで読み込みます。

{
    "type": "Polygon",
    "coordinates": [
        [
            [139.72659302176908,35.657491515138794],
            [139.72659302176908,35.673223047495064],
            [139.74787903251126,35.673223047495064],
            [139.74787903251126,35.657491515138794],
            [139.72659302176908,35.657491515138794]
        ]
    ]
}

Tellus OSでは多角形ツールを使用してGeoJSONファイルを作成することができます。作成したファイルはそのままダウンロードすることができますが、APIを使用してこのファイルを取得することができます。

devGoeJSON_api1_20200220_1.png

JupyterLabでこのGeoJSONファイルを取得するには、次のAPIを使います。

https://api.tellusxdp.com/v1/geojson-files
import json, requests, urllib.parse
TOKEN = "ここには自分のアカウントのトークンを貼り付ける"
URL = "https://api.tellusxdp.com/v1/geojson-files"
def get(id=""):
    headers = {
        "Authorization": "Bearer " + TOKEN
    }
    r = requests.get(URL + "/" + id , headers=headers)
    return r.json()
geojsons = get()
print(geojsons)

関数を実行すると、TellusにアップロードしたGeoJSONファイルに関する情報(ID、ファイル名、アップされた日時やTellus OS上で表示する際の透過率など)のリストを取得できます。 devGoeJSON_api1_20200220_2.png ここで取得したID(2a0cab31-3032-4f51-8d68-26491675e82b、この値は変化します)を使ってGeoJSONファイルの中身を呼び出します。

sample_polygon = get(geojsons["items"][0]["id"])
polygon_dict = json.loads(sample_polygon["data"]) #strをdict型へ
print(polygon_dict)

devGoeJSON_api1_20200220_5.png 作成したsample.geojsonと同じ内容が表示されているのがわかるかと思います。また、JupyterLabからTellus OSへGeoJSONファイルを登録することも可能です。

def post(data):
    headers = {
        "Authorization": "Bearer " + TOKEN,
        "Content-Type": "application/json"
    }
    r = requests.post(URL, headers=headers, json=data)
    return r.json()
geojson = {
    "type": "Point",
    "coordinates": [139.74543, 35.65858]
}
data = {
    "originalName": "test",
    "transparency": 0.5,
    "windowNumber": 1,
    "data": geojson
}
print(post(data))

図形として登録するにはpropertiesにdrawtypeを指定する必要があることに注意してください。drawtypeはmarker, rectangle, circle, polygon, polylineのいずれかを指定してます。

登録に成功すると、GeoJSONファイル登録時のIDが返却されます。この状態でTellus OSを開いてみると(既に開いた状態であった方はリロードが必要です)、APIで登録したGeoJSONファイルの内容が表示されます(図形の名前はoriginalNameで指定します)。

devGoeJSON_api1_20200220_6.png

再度リストを取得すると、新しく登録したGeoJSONファイルの情報が含まれていることを確認できます。

geojsons = get()
print(geojsons)

devGoeJSON_api1_20200220_3.png count数が1から2になっていることが確認できます。さらに、登録したGeoJSONファイルを削除することもできます。

def delete(id):
    url = URL + "/" + id
    headers = {
        "Authorization": "Bearer " + TOKEN
    }
    r = requests.delete(url, headers=headers)
    return r.json()
delete(geojsons['items'][-1]['id']) #新しく登録したものを消す
## すべて消したい場合
# geojsons = get()
# for id in map(lambda item: item['id'], geojsons['items']):
#     delete(id)
print(get())

devGoeJSON_api1_20200220_4.png

今度は2つ登録されていたGeoJSONファイルが1つに減っていることが確認できます。

以上がTellusのJupyterLabを使って空間データを保存する方法と、保存された空間データを取得/消去する方法でした。

空間データを保存/取得することで、特定領域の情報を抽出したりマスキングするのに利用することができます。これは雲や影など、障害物が映り込んでしまう衛星データを扱う上で必要なものです。

さらに、対象物の座標が判明していれば、ある範囲の中にその対象物がどのくらい含まれているかもわかります。例えば、公衆トイレの場所の緯度経度を取り込み、市町村区域のgeojson(またはshape)ファイルも取り込めば、各市町村のポリゴン内に登録したポイント(トイレ座標)の情報が含まれるか否かで、その個数を調べることもできます。

import json, requests, urllib.parse
TOKEN = "ここには自分のアカウントのトークンを貼り付ける"
URL = "https://api.tellusxdp.com/v1/geojson-files"
def get(id=""):
    headers = {
        "Authorization": "Bearer " + TOKEN
    }
    r = requests.get(URL + "/" + id , headers=headers)
    return r.json()
geojsons = get()
print(geojsons)
type(geojsons)
type(get(geojsons["items"][0]["id"]))
sample_polygon = get(geojsons["items"][-1]["id"])
print(type(sample_polygon))
print(sample_polygon["data"])
print(type(sample_polygon["data"]))
# sample_polygonは図形の形に関係なく、ファイルに登録された全てを読み込む
type(json.loads(sample_polygon["data"]))
polygon_dict = json.loads(sample_polygon["data"])
print(type(polygon_dict))
print(polygon_dict)
def post(data):
    headers = {
        "Authorization": "Bearer " + TOKEN,
        "Content-Type": "application/json"
    }
    r = requests.post(URL, headers=headers, json=data)
    return r.json()
geojson = {
    "type": "Point",
    "coordinates": [139.74543, 35.65858]
}
data = {
    "originalName": "test",
    "transparency": 0.5,
    "windowNumber": 1,
    "data": geojson
}
print(post(data))
geojsons = get()
print(geojsons)
def delete(id):
    url = URL + "/" + id
    headers = {
        "Authorization": "Bearer " + TOKEN
    }
    r = requests.delete(url, headers=headers)
    return r.json()
delete(geojsons['items'][-1]['id'])
## すべて消したい場合
# geojsons = get()
# for id in map(lambda item: item['id'], geojsons['items']):
#     delete(id)