ウィキデータで地図を作成して埋め込む


ウィキデータのSPARQL問合せサービス Wikidata Query Service は、実行結果を表形式で出力するほかに、画像のグリッド、棒グラフや折れ線グラフ、マップなどの形式で可視化することができ、それらをWebページに埋め込むための機能も提供しています。そこで、神奈川県にある寺社をウィキデータから検索し、マップにしてWebページに埋め込む方法を解説します。

はじめに、ウィキデータから神奈川県の寺社を取得するSPARQLクエリを作成します。今回は、寺社の名前(ラベル)、位置する行政区画(P131)、位置座標(P625)と、もしあれば画像(P18)を取得します。

#defaultView:Map
SELECT ?item
       (SAMPLE(?iLabel) AS ?i)
       (SAMPLE(?tLabel) AS ?t)
       (SAMPLE(?loc) AS ?l)
       (SAMPLE(?pic) AS ?p)
WHERE {
  { ?item wdt:P31 wd:Q845945. }
  UNION
  { ?item wdt:P31 wd:Q5393308. }
  ?item wdt:P131 ?town;
    wdt:P625 ?loc.
  OPTIONAL { ?item wdt:P18 ?pic. }
  ?town (wdt:P131+) wd:Q127513.
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en".
    ?item rdfs:label ?iLabel.
    ?town rdfs:label ?tLabel.
  }
}
GROUP BY ?item

先頭の

#defaultView:Map

で、実行結果マップ形式で可視化することを指示しています。
最後の行

GROUP BY ?item

で項目毎にグループ化しているのは、位置する行政区画などが複数の値を持っている場合にも、1つの寺社について1行のみ結果が得られるようにするためです。そのため、

SELECT ?item
       (SAMPLE(?iLabel) AS ?i)
       (SAMPLE(?tLabel) AS ?t)
       (SAMPLE(?loc) AS ?l)
       (SAMPLE(?pic) AS ?p)

グループ化の対象以外については、SAMPLE関数を使用して任意の値を返すようにします。

WHERE文では、まずはじめに分類(P31)が神社(Q845945)のものと仏教寺院(Q5393308)のものを結合(UNION)し、

WHERE {
  { ?item wdt:P31 wd:Q845945. }
  UNION
  { ?item wdt:P31 wd:Q5393308. }

次に、位置する行政区画と位置座標、画像(P18)を取得します。

  ?item wdt:P131 ?town;
    wdt:P625 ?loc.
  OPTIONAL { ?item wdt:P18 ?pic. }

画像はなくても構わないので、OPTIONAL としています。
次の

  ?town (wdt:P131+) wd:Q127513.

は、寺社の位置する行政区画が神奈川県(Q127513)に位置するという条件を指定しています。
神奈川県 - 横浜市 - 緑区
のように階層化している場合に、(wdt:P131+) の + は重要です。寺社の位置する行政区画が緑区の場合、+ が付いていればこの条件は成立しますが、+ が付いていないと成立しません。

  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en".
    ?item rdfs:label ?iLabel.
    ?town rdfs:label ?tLabel.
  }

は、項目のラベルを取得しています。

Wikidata Query Serviceで実行するとマップ上に寺社を表す点が表示され、クリックするとその寺社のデータがポップアップ表示されます。

Wikidata Query Service の[リンク]→[実行結果をエンベッド]を選択すると、Webページに実行結果を埋め込むためのHTMLが表示されますので、コピーして使用します。

実際にこのページに埋め込むと以下のようになります。

この記事の執筆時点で得られた結果はたったの103件でした。実際にはもっと多くの寺社が登録されていますが、位置する行政区画や緯度経度が入力されていないためにヒットしませんでした。ウィキデータの寺社データ整備も頑張ろうと思います。

2020.9.21 追記
神社によっては、分類(P31)が神社(Q845945)ではなく、神社を上位クラス(P279)とする 八幡宮(Q11390939) や 稲荷神社(Q514480)になっています。また、仏教寺院(Q5393308)を上位クラスとする尼寺(Q11464930)が分類になっているお寺もいくつかありました。そこで、

WHERE {
  { ?item wdt:P31 wd:Q845945. }
  UNION
  { ?item wdt:P31 wd:Q5393308. }

  { ?item wdt:P31 wd:Q845945. }
  UNION
  { ?item wdt:P31 ?jinja. 
    ?jinja wdt:P279 wd:Q845945. }
  UNION
  { ?item wdt:P31 wd:Q5393308. }
  UNION
  { ?item wdt:P31 ?tera.
    ?tera wdt:P279 wd:Q5393308. }

とするのが良さそうです。