はじめに
ServiceNow のレポート機能には様々な種類がありますが、その一つにマップ(Map)が存在します。Map レポートではデータを地理的なヒートマップとして表示したり、緯度経度をもとにしてデータポイントを表示したりすることができます。
この Map レポート、OOTB だとアメリカなどの一部の国では国→州→郡のレベルまで可視化できるのですが、日本の場合は国→都道府県レベルまでしか可視化できません。
市区町村レベルでのより詳細な分析を行いたい場合には、独自に地理情報データを用意して ServiceNow に組み込む必要があります。
今回は、国土交通省が公開している国土数値情報の行政区域データを利用して、ServiceNow の Map レポートで市区町村レベルのヒートマップを実現するためのデータを作成してみたいと思います。
元データの入手
以下のページから「ダウンロードしたい都道府県」にチェックを入れ、「年度で絞り込み」で年度を指定し、ダウンロードボタンをクリックします。なお、データの利用に当たって使用許諾条件には目を通しておくようにしましょう。
以降は、北海道の国土数値情報 行政区域データ 2025年(令和7年)を参考に説明していきます。
ダウンロードされたzipファイルを展開すると様々なファイルが含まれていますが、その中にある GeoJSON ファイル N03-20250101_01.geojson
を加工していきます。
GeoJSON ファイルの加工
Python の GeoPandas ライブラリを使って、先ほど展開した GeoJSON ファイルを加工していきます。
- 利用した環境:Jupyter Notebook
GeoJSON ファイルの読み込みと確認
GeoPandas ライブラリがない場合は以下を実行してインストールしてください。
!pip install geopandas
まずはファイルを読み込みます。GeoPandas はその名のとおり、地理情報データを Pandas のような感覚で操作することができるライブラリです。
plot()
メソッドを使うと地図を描画することができます。
import geopandas as gpd
in_path = "N03-20250101_01.geojson"
# GeoJSON を読み込み
gdf = gpd.read_file(in_path)
# 地図を描写
gdf.plot()
属性の追加・削除
ServiceNow のマップで利用するために必要な name
属性および hc-key
属性を追加します。name
はレポート上での市区町村名の表示に、hc-key
は各市区町村の地物と ServiceNow のロケーション [cmn_location] テーブルとのマッピングに利用されます。
ダウンロードした GeoJSON には以下のような属性が存在します。
各属性の説明は行政区域データのページを参照していただくとして、今回は N03_003(郡名)、N03_004(市区町村名)、 N03_005(政令指定都市の行政区名) を連結した文字列を name
、N03_007(全国地方公共団体コード)に jp-
という prefix をつけた文字列を hc-key
として属性を追加します。
# N03_003 〜 N03_005 までを連結した文字列を name 列として追加
gdf["name"] = gdf["N03_003"].fillna("") + gdf["N03_004"].fillna("") + gdf["N03_005"].fillna("")
# N03_007 列に "jp-" を付与した値を hc-key 列として追加
gdf["hc-key"] = "jp-" + gdf["N03_007"].astype(str)
これ以降 N03_001 〜 N03_007 の属性は不要ですので、除去してしまいます。
gdf = gdf[["name", "hc-key", "geometry"]]
gdf
ここまで完了したら、GeoJSON ファイルを一旦保存します。
# 属性変更済みのGeoJSONデータを保存
out_path = "Hokkaido.geojson"
gdf.to_file(out_path, driver="GeoJSON", encoding="utf-8")
あわせて、name
と hc-key
の組み合わせを Excel 形式で保存しておきましょう。
後ほど ServiceNow にインポートして使います。
# name, hc-keyの組み合わせを重複を除いて抽出
unique_pairs = gdf[["name", "hc-key"]].drop_duplicates()
# Excel形式で保存
unique_pairs.to_excel("Hokkaido.xlsx", index=False)
座標系の変換
ここからは、地理情報データを編集・変換・簡略化するためのWebサービス Mapshaper を使って加工していきます。Mapshaper のページにアクセスし、先ほど保存した "Hokkaido.geojson" ファイルをドラッグ&ドロップして読み込みます。
まず、座標系の変換を行います。
国土数値情報の行政区域データは 「JGD2011/(B,L)」(EPSGコード:6668)という座標系で提供されていますが、このデータを ServiceNow のマップでそのまま描画すると、北海道が横に引き伸ばされたような表現になってしまうため、Googleマップなどで利用されている Web メルカトル(EPSG:3857)に座標系を変換します。
画面右上部の Console をクリックするとコンソール画面が表示されるので、そちらに以下を入力します。
-proj epsg:3857
変換前後の画像がこちらです。違和感が軽減されているのがわかると思います。
地物の統合
次に、name
と hc-key
が同一の地物を統合します。再び Console を開いた状態で、今度は以下を入力します。
dissolve name,hc-key
統合されたか確認するために、画面右側にあるカーソルアイコンをクリックし、"inspect features" を選択した状態で地図上の市区町村へマウスをホバーしてみましょう。
地理的に分断された市区町村が、一つのまとまりとして統合されたのが分かると思います。
データの単純化
この状態で保存すると GeoJSON のファイルサイズが 50MB 以上あり、ServiceNow のマップとしてロードするには重すぎてとても実用に耐えられません。そこで、頂点数を減らしてポリゴンの単純化を行います。
画面右上の Simplify をクリックするとポップアップが表示されるので、デフォルトの選択状態(Method : Visvalingam / weighted area)のまま Apply ボタンをクリックします。
その後、画面上部に表示されるスライダーを 100% → 1.0% に変更します。
この状態で画面右上の Export をクリックし、File format が GeoJSON になっていることを確認して Export ボタンをクリックし、ファイルを保存します。
上から順に、Mapshaper に読み込む前のファイル → Mapshaper でデータを単純化する前のファイル → 単純化した後のファイルです。
50MB 強だったファイルサイズが 748KB まで削減されました!
座標系情報(Pro4j 文字列)の追加
ServiceNow の Map 描画には Highcharts というJSライブラリが使用されています。
独自に作成した地図を Highcharts で緯度経度対応させるには、その地図定義に hc-transform
属性を持たせる必要があります。
テキストエディタなどで GeoJSON ファイルを開き、作成した地理情報データの座標系の定義を追加します。
"hc-transform":{"default":{"crs":"+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs +type=crs"}},
"+proj=merc..." の部分は、今回変換した座標系(Webメルカトル)の Proj4 文字列となっています。
補足
今回は視覚的にわかりやすくなるように、一部の手順で Web サービスの Mapshaper を使用して説明しました。
実際には47都道府県分のファイルを扱うことになるので、以下の URL などを参考に mapshaper コマンドをインストールして、スクリプトで一括変換するのが良いと思います。
終わりに
ServiceNow設定編 に続きます!!!
参考