宙畑 Sorabatake

衛星データ

【ゼロからのTellusの使い方】Jupyter Notebookで空間データ(GeoJSON)を保存/取得する

TellusのJupyter Notebookで空間データ(GeoJSON)を保存/取得する方法をご紹介します。

本記事ではTellusのJupyter Notebookを使って空間データを保存する方法と保存された空間データを取得する方法を紹介します。

TellusでJupyter Notebookを使う方法は、「【ゼロからのTellusの使い方】Tellusの開発環境でAPI引っ張ってみた」をご覧ください。

(1)Tellus上で空間データ(GeoJSON)を表示しよう

「国土数値情報(行政区域データ)」をTellus OSで表示した例 Credit : 国土交通省国土政策局 / Tellus

まずは、Tellus OS上で、空間データを表示します。宙畑でご紹介してきた、「【ゼロからのTellusの使い方】衛星データ上に好きな図形(GeoJSON)を重ねてみよう」や「【ゼロからのTellusの使い方】GeoJSONのオープンデータをTellusに表示する」の記事を参考に、GeoJSONファイルを読み込みTellus OS上に空間データを表示してみましょう。

図形の種類は画面上部のアイコンから線、多角形、円、矩形、マーカー(点)から選べます

次に、Tellus OSの機能で、マウスで地図上に図形を描きGeoJSONとして保存してみましょう。操作方法は「【ゼロからのTellusの使い方】衛星データプラットフォームTellus OSでできることと基本操作」にて詳しく説明が書かれています。

Tellus OSで読み込んだり作成したりした空間データは、APIを使ってJupyter Notebook上で呼び出すことができます。反対に、Jupyter Notebookで読み込んだり作成したりした空間データを、Tellus OS上で表示させることも可能です。

では実際に、Jupyter Notebookで空間データを扱ってみましょう。

(2)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]
        ]
    ]
}

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

https://api.tellusxdp.com/v1/geojson-files

APIリファレンス

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)

トークンはマイページのAPIアクセス設定(要ログイン)から取得してください。

「Run」をクリックしコードを実行すると、TellusにアップロードしたGeoJSONファイルに関する情報(ID、ファイル名、アップされた日時やTellus OS上で表示する際の透過率など)のリストを取得できます。

ここで取得したIDを使ってGeoJSONファイルの中身を呼び出します。

APIはGeoJSONをstr型として返却します。このままではデータを扱いにくいため、dict型に変換しましょう。

sample_polygon = get(geojsons["items"][-1]["id"])
print(type(sample_polygon["data"]))
polygon_dict = json.loads(sample_polygon["data"])
print(type(polygon_dict))
print(polygon_dict)

sample.geojsonと同じ内容が表示されているのがわかるかと思います。

Jupyter Notebookから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))

登録に成功すると、GeoJSONファイル登録時のIDが返却されます。

この状態でTellus OSを開いてみると(既に開いた状態であった方ままの人はリロードが必要です)、APIで登録したGeoJSONファイルの内容が表示されます。

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

geojsons = get()
print(geojsons)

登録した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())
2つ登録されていたGeoJSONファイルが1つに減っていることが確認できます

(3)APIで図形を読み込む/保存する

次にTellus OSで図形を作成します。例では多角形を作成しました。

Jupyter Notebookでこの図形を取得するには次のAPIを使います。

https://api.tellusxdp.com/v1/shapes

APIリファレンス

import json, requests, urllib.parse

TOKEN = "ここには自分のアカウントのトークンを貼り付ける"
URL = "https://api.tellusxdp.com/v1/shapes"

def get(id=""):
    headers = {
        "Authorization": "Bearer " + TOKEN
    }
    
    r = requests.get(URL + "/" + id , headers=headers)
    return r.json()

shapes = get()
print(shapes)

実行するとTellusに登録した図形をリストで取得できます。

返却された図形はstr型なので、扱うときはdict型に変換します。

shape0 = get(shapes["items"][0]["id"])
shapes0_dict = json.loads(shape0["data"])
print(type(shapes0_dict))
print(shapes0_dict)

Jupyter Notebookから図形を登録することも可能です。

図形のフォーマットはGeoJSONですが、図形として登録するにはpropertiesにdrawtypeを指定する必要があることに注意してください。

drawtypeはmarker, rectangle, circle, polygon, polylineのいずれかを指定してます。

def post(data):
    headers = {
        "Authorization": "Bearer " + TOKEN,
        "Content-Type": "application/json"
    }
    
    r = requests.post(URL, headers=headers, json=data)
    return r.json()

shape = {
    "type": "FeatureCollection",
    "features": [
        {
            "type": "Feature",
            "geometry": {
                "type": "LineString",
                "coordinates": [
                    [139.74242019561643,35.644379544571805],
                    [139.74708938716506,35.660448389482596],
                    [139.7571144105314,35.65118687984331],
                    [139.7698860185483,35.664576669380274]
                ]
            },
            "properties": {
                "drawtype":"polyline"
            }
        }
    ]
}

data = {
    "name": "test",
    "transparency": 0.5,
    "windowNumber": 1,
    "data": shape
}
print(post(data))

登録に成功すると、図形登録時のIDが返却されます。

Tellus OS上でもAPIで登録した図形が表示されます。

再度リストを取得すると、新しく登録した図形が含まれているのを確認できます。

shapes = get()
print(shapes)

登録した図形を削除することもできます。

def delete(id):
    url = URL + "/" + id
    headers = {
        "Authorization": "Bearer " + TOKEN
    }
    
    r = requests.delete(url, headers=headers)
    return r.json()

delete(shapes['items'][-1]['id'])
# # すべて消したい場合
# shapes = get()
# for id in map(lambda item: item['id'], shapes['items']):
#     delete(id)

print(get())

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

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

皆さんがデータ処理を行う上でも、良く利用することになる作業ですので、ぜひこの機会に覚えて作業効率の向上を図ってみてください。

Tellus参考記事