NeoMap Hiroshima

September 19, 2021

NeoMapを使って広島を見てみよう


NeoMapはNeo4j Desktopで使うGraphAppsの1つです。 Open Street Mapのデータを使って地図データを表示します。

Hiroshima Map Shortest Path

今回使ったソフトウェア


  • Neo4j Desktop 1.4.8
  • Neo4j 4.3.3
  • neomap 0.5.1
  • APOC library 4.3.0.1
  • Graph Data Science Library 1.6.5

Neo4j Desktopを立ち上げます


まずは、Neo4j Desktopを立ち上げます。

NeoMapのインストール


NeoMap Map Visualizerをインストールします。

Neo4j Developer Graph Apps Gallery

NeoMap

データベースの作成


ローカルにデータベースを作成します。 Add Local DBMS

プラグインのインストール


作成されたデータベースの名前をクリックすると右に詳細(Details)のウィンドウが出てきます。 インストールするプラグインは、APOCとGDSです。 インストールは、それぞれの▶︎を開いてからInstallをクリックします。 Plugins

Confの設定


それから、ファイルが読めるようにneo4j.confにおまじないを追加しましょう。 設定の場所は、Openの右にある「…」をクリックするとメニューがプルダウンしますので、Settingsを選択してください。 Settings... confの編集画面が出てきますので、最後の行に追加します。

neo4j.conf

apoc.import.file.enabled=true

データのダウンロード


hiroshima.graphml.zipをダウンロードします。

https://annoura.com/openstreetmap/hiroshima.graphml.zip

データをimportフォルダーに移動


hiroshima.graphml.zip を解凍すると hiroshima.graphml ファイルになりますので、Importフォルダーに追加します。

設定の場所は、Openの右にある「…」をクリックするとメニューがプルダウンしますので、Open FolderからImportを選択してください。

<neo4j-home>/import/hiroshima.graphml

データベースの起動


データベースをスタートさせます。

DB Start

Neo4j Browserをオープンする


Neo4j Browserをオープンします。

Open with Neo4j Browser

データの読み込み


Neo4j Browserをオープンします。 hiroshima.graphml を読み込むコマンドを入力してください。

CALL apoc.import.graphml("hiroshima.graphml", {})

ノードにラベルを付けます。


取り込んだだけでラベルが付いてないので付加します。

MATCH (n) SET n:Node

グラフを作ります


GDS shortest path algorithmsを使うために、projected graphを作ります。

CALL gds.graph.create.cypher(
"projected_graph", 
"MATCH (n:Node) RETURN id(n) AS id", 
"MATCH (n)-[r:RELATED]->(m) RETURN id(n) AS source, id(m) AS target, toFloat(r.length) AS length"
)

NeoMapをOpenします


  • 左の四角が4つになっているGraph Appsをクリックして、NeoMapをOpenします。

Neomap Open

NeoMapで見てみましょう


パラメータを設定します。

  • Name: Hiroshima Street Network (自由です)
  • Layer type: Lat/Lon
  • Node label(s): 何も選択しません
  • Latitude property: y
  • Longitude property: x
  • Tooltip property: osmid
  • Max. nodes: 10000
  • Rendering: Markers
  • Color: 好きな色で

Hiroshima Street Network

実行すると広島が出てきます。 ちょっと見てみましょう。

Hiroshima MAP

広島駅近辺で最短距離を表示してみましょう


NeoMapで新しくQueryを追加します。

パラメータを設定します。

  • Name: Shortest Map (自由です)
  • Layer type: Advanced (cypher query)
  • Query:

    MATCH (startNode:Node) 
    WHERE startNode.x = "132.47315" AND startNode.y = "34.3979106"
    MATCH (endNode:Node) 
    WHERE endNode.x = "132.475658" AND endNode.y = "34.3962284"
    CALL gds.shortestPath.dijkstra.stream(
    "projected_graph", 
    {
    sourceNode: startNode, 
    targetNode: endNode, 
    relationshipWeightProperty: "length"
    }
    ) 
    YIELD index, sourceNode, targetNode, totalCost, nodeIds, costs, path
    WITH gds.util.asNodes(nodeIds) AS nodes
    UNWIND nodes AS node
    RETURN node.x AS longitude, node.y AS latitude
  • Rendering: Polyline
  • Color: 先程の地図上の色とは別な赤などの目立つ色で

Shortest Path

実行すると赤い線が小さく中央に表示されているのが分かります。 地図を拡大しましょう。

開始のマーカー(ノード)から終了のマーカーまで最短経路で線が引かれているのが分かります。

Shortest Path Map

簡単でしたか?


少し前のロンドンのNeoMapの記事をもとに広島版を作成しました。

Visualizing shortest paths with neomap ≥ 0.4.0 and the Neo4j Graph Data Science plugin

この記事はあちこち古いので、このままでは動作させることができませんでした。思いのほか苦労しました。

Open Street MapのGraphMLデータの取得(おまけ)


これは地図データの取得の方法です。

今回は事前に取得した、hiroshima.graphmlを使いましたので記載しなかったのですが、他の地域の地図を取得したい人のためにPythonのソースを載せておきますので参考にしてください。 これも、OSMnx 1.1.1を使ったので引数の記述が、distance= ではなく dist= でした。

import osmnx as ox
G = ox.graph_from_point((34.3977, 132.4753), dist=1500, network_type='all')
ox.save_graphml(G, "hiroshima.graphml")

Profile picture

Written by Koji Annoura who lives and works in Fukuoka Japan. Please follow me on Twitter

© 2021, Koji Annoura, Built with Gatsby