NeoMap Fukuoka

November 16, 2021

NeoMapを使って福岡を見てみよう


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

Fukuoka Map Shortest Path

今回使ったソフトウェア


  • Neo4j Desktop 1.4.9
  • Neo4j 4.3.7
  • neomap 0.5.1
  • APOC library 4.3.0.4
  • Graph Data Science Library 1.7.2

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

データのダウンロード


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

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

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


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

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

<neo4j-home>/import/fukuoka.graphml

データベースの起動


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

DB Start

Neo4j Browserをオープンする


Neo4j Browserをオープンします。

Open with Neo4j Browser

データの読み込み


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

CALL apoc.import.graphml("fukuoka.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: Fukuoka Street Network (自由です)
  • Layer type: Lat/Lon
  • Node label(s): 何も選択しません
  • Latitude property: y
  • Longitude property: x
  • Tooltip property: osmid
  • Max. nodes: 10000
  • Rendering: Markers
  • Color: 好きな色で

Fukuoka Street Network

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

Fukuoka MAP

博多駅駅とキャナルシティで最短距離を表示してみましょう


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

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

  • Name: Shortest Map (自由です)
  • Layer type: Advanced (cypher query)
  • Query:
MATCH (startNode:Node) 
WHERE startNode.x = "130.4189761" AND startNode.y = "33.5902449"
MATCH (endNode:Node) 
WHERE endNode.x = "130.4120761" AND endNode.y = "33.5898374"
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データの取得(おまけ)


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

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

import osmnx as ox
G = ox.graph_from_point((33.590188, 130.420685), dist=1500, network_type='all')
ox.save_graphml(G, "fukuoka.graphml")

Profile picture

Written by Koji Annoura who lives and works in Fukuoka Japan. You should follow them on Twitter