LoginSignup
6
2

More than 1 year has passed since last update.

データ流通システムの実証実験 オープンデータへのアクセスをElixirでやってみる

Last updated at Posted at 2021-09-29

はじめに

実証環境のご紹介 (PDF)

  • そもそもこれが、一体全体何なのか私に説明を求められても説明はできません(断言します)
  • こちらのPDFの内容がわかりやすいようにおもいましたのでご紹介しておきます
  • FIWAREがポイントのようにおもいます
    • The Open Source Platform for Our Smart Digital Future
  • WireCloudというデータの可視化機能でこんな可視化ができます

スクリーンショット 2021-09-30 3.27.18.png

準備

  • 実証実験申し込みをします
    • 申し込みから3日程度のちに、FIWARE実証実験 アカウント発行のお知らせというメールが届きました
    • 私が申し込んだときは3種類のIDが発行されていました
    • これからつかうものはマーケットプレイスアカウントです
  • 申し込みが済んだらまずは、https://documents.fiware-testbed.jp/ を順にみていくとよさそうです
    • 何度もご紹介しますが、「実証環境のご紹介 (PDF)」がリンクされていますのでまず確認するとよいとおもいます
  • Elixir 1.12をインストールします
    • curlのコマンド例がドキュメントに書いてありますので、Elixirを持ち出す必要はないといえばないのですが私はElixirが好きなのでElixirでやってみます

Let's get started :bangbang::bangbang::bangbang:

opendata_access.exs
# install Hex
Mix.install([
  {:httpoison, "~> 1.8"},
  {:jason, "~> 1.2"}
])

# トークン取得 (マーケットプレイスアカウントを使う)
body = %{
  username: "userXXX@fiware-testbed.jp",
  password: "xxxxxxxxxxxxxxxxx"
} |> Jason.encode!()        

token = 
HTTPoison.post!("https://orion.fiware-testbed.jp/token", body, [{"Content-type", "application/json"}])
|> Map.get(:body)
|> Jason.decode!()
|> Map.get("access_token")

# エンティティの取得
headers = [{"X-Auth-Token", token}, {"Fiware-Service", "NEC"}, {"Fiware-ServicePath", "/fukuoka_aed"}]

HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities?type=PointOfInterest", headers)
|> Map.get(:body)
|> Jason.decode!()
|> Enum.map(& Map.get(&1, "id"))
|> IO.inspect()

# エンティティ件数の取得
HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities?options=count", headers)
|> Map.get(:headers)
|> Enum.filter(fn {key, _} -> key == "fiware-total-count" end)
|> Enum.at(0)
|> elem(1)
|> String.to_integer()
|> IO.puts()

HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities?offset=990&limit=6", headers)
|> Map.get(:body)
|> Jason.decode!()
|> Enum.map(& Map.get(&1, "id"))
|> IO.inspect()

# ジオフィルタリング
HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities/fukuoka-aed-0020", headers)
|> Map.get(:body)
|> Jason.decode!()
|> Map.get("address")
|> IO.inspect()

HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities?georel=near;maxDistance:1000&geometry=point&coords=33.579836,130.294118", headers)
|> Map.get(:body)
|> Jason.decode!()
|> Enum.map(& Map.get(&1, "id"))
|> IO.inspect()

HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities?georel=near;maxDistance:1000&geometry=point&coords=33.579836,130.294118", headers)
|> Map.get(:body)
|> Jason.decode!()
|> Enum.map(& Map.get(&1, "address"))
|> IO.inspect()

# コンパクト表現(Key-Values)
## オプション指定なし

HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities/fukuoka-aed-0001", headers)
|> Map.get(:body)
|> Jason.decode!()
|> IO.inspect()

## オプション指定あり
HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities/fukuoka-aed-0001?options=keyValues", headers)
|> Map.get(:body)
|> Jason.decode!()
|> IO.inspect()

HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities/fukuoka-aed-0001?options=values&attrs=name,description", headers)
|> Map.get(:body)
|> Jason.decode!()
|> IO.inspect()

HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities/fukuoka-aed-0001?options=values&attrs=description,name", headers)
|> Map.get(:body)
|> Jason.decode!()
|> IO.inspect()

Run!!!

# elixir opendata_access.exs

Wrapping Up :lgtm::lgtm::lgtm::lgtm::lgtm:

6
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2