オープンデータへのアクセス

ckan.fiware-testbed.jp には、NGSI APIでアクセスできる、さまざまなオープンデータを公開しています。 その中の「福岡市 AED (NGSI)」オープンデータへのアクセスを試してみます。

オープンデータの確認

まず、https://ckan.fiware-testbed.jp/dataset/401307_aed/resource/bb54bdd0-5a7d-4bac-a47a-a6f770d36104 にアクセスして、データのURL、Tenant、Service Pathを確認します。

以下のような内容でした。

URL: https://orion.fiware-testbed.jp/v2/entities?type=PointOfInterest
Tenant: NEC
Service Path: /fukuoka_aed

トークン取得

アクセスの前にトークンを取得します。次にスクリプトで取得できます。

$ curl -s https://orion.fiware-testbed.jp/token \
-H ‘Content-type: application/json’ \
-d @- <<EOF | jq .
{
  "username": "userXXX@fiware-testbed.jp",
  "password": "xxxxxxxxxxxxxxxxx"
}
EOF

実行すると以下のようなレスポンスがあります。

{
  "access_token": "93332fe00032180a6214208d302ae8b8fe0719ff",
  "token_type": "Bearer",
  "expires_in": 3599,
  "refresh_token": "913f4c1795ac9c9645f9cd29826150be313356d7",
  "scope": [
    "bearer"
  ]
}

access_tokenがAPI実行時に必要なトークンです。環境変数に登録します。

$ export TOKEN=93332fe00032180a6214208d302ae8b8fe0719ff

エンティティの取得

どんなエンティティがあるか確認してみます。先ほど、ckanのページで確認した、URL、Tenant、Service Pathを使います。

$ curl -sS -H "X-Auth-Token: $TOKEN" -H "Fiware-Service: NEC" -H "Fiware-ServicePath: /fukuoka_aed" https://orion.fiware-testbed.jp/v2/entities?type=PointOfInterest | jq .[].id
"fukuoka-aed-0001"
"fukuoka-aed-0002"
"fukuoka-aed-0003"
"fukuoka-aed-0004"
"fukuoka-aed-0005"
"fukuoka-aed-0006"
"fukuoka-aed-0007"
"fukuoka-aed-0008"
"fukuoka-aed-0009"
"fukuoka-aed-0010"
"fukuoka-aed-0011"
"fukuoka-aed-0012"
"fukuoka-aed-0013"
"fukuoka-aed-0014"
"fukuoka-aed-0015"
"fukuoka-aed-0016"
"fukuoka-aed-0017"
"fukuoka-aed-0018"
"fukuoka-aed-0019"
"fukuoka-aed-0020"

fukuoka-aed-XXXX というエンティティが多数登録されているようです。orionは、1回のクエリで既定では先頭の最大20件のエンティティを返します。

エンティティ件数の取得

20件以上のエンティティがある場合、countオプションでトータルの件数がわかり、offsetとlimitのオプションで、任意の開始位置から、任意の件数のエンティティを取得できます。

それでは、何件登録されているか、確認してみます。オプション "options=count" をつけて、実行すると、レスポンスヘッダに、fiware-total-countが返されます。

curl -sS -i -H "X-Auth-Token: $TOKEN" -H "Fiware-Service: NEC" -H "Fiware-ServicePath: /fukuoka_aed" https://orion.fiware-testbed.jp/v2/entities?options=count | grep fiware-total-count
fiware-total-count: 996

996 件あるようです。最後の6件を取り出してみます。"offset=990&limit=6″ を指定して実行します。

$ curl -sS -H "X-Auth-Token: $TOKEN" -H "Fiware-Service: NEC" -H "Fiware-ServicePath: /fukuoka_aed" "https://orion.fiware-testbed.jp/v2/entities?offset=990&limit=6" | jq .[].id
"fukuoka-aed-0991"
"fukuoka-aed-0992"
"fukuoka-aed-0993"
"fukuoka-aed-0994"
"fukuoka-aed-0995"
"fukuoka-aed-0996"

ジオフィルタリング

NGSIv2 APIには、ジオロケーション機能があり、ある場所の中心から15km近くに位置するすべてのエンティティなど、地理的な場所でフィルタリングすることができます。

これをためしてみます。

エンティティのロケーションは、location属性が保持しています。fukuoka-aed-0020エンティティのlocationを確認してみます。

 $ curl -s https://orion.fiware-testbed.jp/v2/entities/fukuoka-aed-0020 -H "X-Auth-Token: $TOKEN" -H "Fiware-Service: NEC" -H "Fiware-ServicePath: /fukuoka_aed" | jq .location
{
  "type": "geo:json",
  "value": {
    "type": "Point",
    "coordinates": [
      130.294118,
      33.579836
    ]
  },
  "metadata": {}
}

住所は、address属性にあります。

$ curl -s https://orion.fiware-testbed.jp/v2/entities/fukuoka-aed-0020 -H "X-Auth-Token: $TOKEN" -H "Fiware-Service: NEC" -H "Fiware-ServicePath: /fukuoka_aed" | jq .address
{
  "type": "StructuredValue",
  "value": {
    "addressLocality": "福岡市",
    "addressCountry": "JP",
    "addressRegion": "福岡県",
    "streetAddress": "西区生の松原1丁目33番1号",
    "@type": "PostalAddress"
  },
  "metadata": {}
}

次にこのロケーションを中心として、1km以内にあるAEDの設置場所を検索してみます。

以下のようなクエリ・パラメータを指定して実行します。

georel=near;maxDistance:1000&geometry=point&coords=33.579836,130.294118
$ curl -sS -H "X-Auth-Token: $TOKEN" -H "Fiware-Service: NEC" -H "Fiware-ServicePath: /fukuoka_aed" "https://orion.fiware-testbed.jp/v2/entities?georel=near;maxDistance:1000&geometry=point&coords=33.579836,130.294118" | jq .[].id
"fukuoka-aed-0020"
"fukuoka-aed-0341"
"fukuoka-aed-0499"
"fukuoka-aed-0634"

中心の"fukuoka-aed-0020″を含め、4件のエンティティが見つかりました。住所を確認してみます。

$ curl -sS -H "X-Auth-Token: $TOKEN" -H "Fiware-Service: NEC" -H "Fiware-ServicePath: /fukuoka_aed" "https://orion.fiware-testbed.jp/v2/entities?georel=near;maxDistance:1000&geometry=point&coords=33.579836,130.294118" | jq .[].address
{
  "type": "StructuredValue",
  "value": {
    "addressLocality": "福岡市",
    "addressCountry": "JP",
    "addressRegion": "福岡県",
    "streetAddress": "西区生の松原1丁目33番1号",
    "@type": "PostalAddress"
  },
  "metadata": {}
}
{
  "type": "StructuredValue",
  "value": {
    "addressLocality": "福岡市",
    "addressCountry": "JP",
    "addressRegion": "福岡県",
    "streetAddress": "西区生の松原3丁目9番1号",
    "@type": "PostalAddress"
  },
  "metadata": {}
}
{
  "type": "StructuredValue",
  "value": {
    "addressLocality": "福岡市",
    "addressCountry": "JP",
    "addressRegion": "福岡県",
    "streetAddress": "西区生の松原3丁目9番2号",
    "@type": "PostalAddress"
  },
  "metadata": {}
}
{
  "type": "StructuredValue",
  "value": {
    "addressLocality": "福岡市",
    "addressCountry": "JP",
    "addressRegion": "福岡県",
    "streetAddress": "西区上山門3-5-1",
    "@type": "PostalAddress"
  },
  "metadata": {}
}

4件とも西区にあるAED設置場所が取得できました。

コンパクト表現(Key-Values)

エンティティを取得する際、オプションにkeyValuesやvaluesを指定することで、コンパクトで簡単な表現でレスポンスを取得できます。

オプションを指定しないで、fukuoka-aed-0001のエンティティ情報を取得してみます。

$ curl "https://orion.fiware-testbed.jp/v2/entities/fukuoka-aed-0001" -sS -H "X-Auth-Token: $TOKEN" -H "Fiware-Service: NEC" -H "Fiware-ServicePath: /fukuoka_aed" | jq .
{
  "id": "fukuoka-aed-0001",
  "type": "PointOfInterest",
  "address": {
    "type": "StructuredValue",
    "value": {
      "addressLocality": "福岡市",
      "addressCountry": "JP",
      "addressRegion": "福岡県",
      "streetAddress": "博多区博多駅前四丁目19-7",
      "@type": "PostalAddress"
    },
    "metadata": {}
  },
  "category": {
    "type": "StructuredValue",
    "value": [
      "41"
    ],
    "metadata": {}
  },
  "description": {
    "type": "Text",
    "value": "AED設置場所:1階玄関付近\n使用時間:24時間使用可能",
    "metadata": {}
  },
  "location": {
    "type": "geo:json",
    "value": {
      "type": "Point",
      "coordinates": [
        130.419087,
        33.584888
      ]
    },
    "metadata": {}
  },
  "name": {
    "type": "Text",
    "value": "博多消防署",
    "metadata": {}
  },
  "source": {
    "type": "URL",
    "value": "https://ckan.open-governmentdata.org/dataset/aed",
    "metadata": {}
  },
  "subCategory": {
    "type": "Text",
    "value": "AED",
    "metadata": {}
  }
}

次に、keyValuesオプションを指定して、fukuoka-aed-0001のエンティティ情報を取得してみます。 オプションなしのレスポンスと比べ、簡単な表現になりました。

$ curl "https://orion.fiware-testbed.jp/v2/entities/fukuoka-aed-0001?options=keyValues" -s -H "X-Auth-Token: $TOKEN" -H "Fiware-Service: NEC" -H "Fiware-ServicePath: /fukuoka_aed" | jq .
{
  "id": "fukuoka-aed-0001",
  "type": "PointOfInterest",
  "address": {
    "addressLocality": "福岡市",
    "addressCountry": "JP",
    "addressRegion": "福岡県",
    "streetAddress": "博多区博多駅前四丁目19-7",
    "@type": "PostalAddress"
  },
  "category": [
    "41"
  ],
  "description": "AED設置場所:1階玄関付近\n使用時間:24時間使用可能",
  "location": {
    "type": "Point",
    "coordinates": [
      130.419087,
      33.584888
    ]
  },
  "name": "博多消防署",
  "source": "https://ckan.open-governmentdata.org/dataset/aed",
  "subCategory": "AED"
}

次に、valuesオプションを指定して、fukuoka-aed-0001のエンティティ情報を取得してみます。

valuesオプションには、取得したい属性とその順番を指定できます。 AEDの設置場所の名前(name)と説明(description)を取得してみます。

$ curl "https://orion.fiware-testbed.jp/v2/entities/fukuoka-aed-0001?options=values&attrs=name,description" -sS -H "X-Auth-Token: $TOKEN" -H "Fiware-Service: NEC" -H "Fiware-ServicePath: /fukuoka_aed" | jq .
[
  "博多消防署",
  "AED設置場所:1階玄関付近\n使用時間:24時間使用可能"
]

上記のようにname,descriptionの値のみを取得できました。

次に、属性の順序を逆にして、説明、名前の順で取得してみます。

$ curl "https://orion.fiware-testbed.jp/v2/entities/fukuoka-aed-0001?options=values&attrs=description,name" -sS -H "X-Auth-Token: $TOKEN" -H "Fiware-Service: NEC" -H "Fiware-ServicePath: /fukuoka_aed" | jq .
[
  "AED設置場所:1階玄関付近\n使用時間:24時間使用可能",
  "博多消防署"
]


© NEC Corporation 2019-2021