このビューアーでできること
位置データの多くは、GISファイルとしては届きません。普通のJSONとして届きます。天気APIのレスポンス、店舗検索の店舗一覧、配達アプリの書き出し、開発者から送られてきたファイルなどです。各レコードにはどこかに緯度と経度がありますが、GeoJSONを前提とする地図ツールでは読めず、表計算ソフトで開くと入れ子の構造が失われます。
このビューアーはJSONをそのまま読み込みます。文書全体からレコードの一覧を探し、入れ子のオブジェクトを `location.lat` のようなフィールド名に平らにし、緯度・経度によく使われる名前を見つけます。`[lng, lat]` の配列や `"lat, lng"` の文字列のように、1つのフィールドに両方の値が入っている場合にも対応します。有効な座標を持つレコードはすべて地図に表示されます。サイドバーには、座標がなかったレコードや範囲外の値だったレコードの数が表示され、緯度と経度が入れ替わっているように見える場合は警告が出ます。
誰かからJSONファイルが送られてきて「これはどこ?」と聞かれたときのために作りました。数秒でデータを確認し、好きなフィールドで点を色分けし、点をクリックしてレコード全体を読み、結果をGIS用のGeoJSONや表計算用のCSVでダウンロードできます。ファイルはブラウザ内で読み込まれ、アップロードされることはありません。
ビューアーが理解できるJSONの形
実際のJSONにはさまざまな形があります。次の形は、設定なしで読み込めます。どの場合も見つけたレコードの一覧が表示され、ファイルに複数の一覧があれば別の一覧を選べます。
[{ "name": "Berlin", "lat": 52.52, "lng": 13.405 }]lat と lng は名前で見つかります。{ "data": { "cities": [{ "name": "Paris", "latitude": 48.8566, "longitude": 2.3522 }] } }data.cities にある一覧を見つけます。同じファイル内のほかの一覧は「List of records」メニューに表示されます。[{ "name": "Rome", "location": { "lat": 41.9028, "lon": 12.4964 } }]location.lat と location.lon になります。同じ親を持つ緯度と経度が優先されます。[{ "id": 7, "coordinates": [2.1686, 41.3874] }]coordinates という名前のフィールドは、GeoJSONの順序である[経度, 緯度]として読みます。ほかの名前では、値の範囲から順序を決めます。[{ "stop": "Central", "latlng": "59.3293, 18.0686" }]{ "BER": { "lat": 52.52, "lng": 13.405 }, "PAR": { "lat": 48.86, "lng": 2.35 } }_key フィールドに残ります。{"lat": 38.72, "lng": -9.14}
{"lat": 41.16, "lng": -8.63}"52.52" のように文字列で保存された数値や、"52,52" のように小数点にカンマを使った数値も読み込めます。タグの一覧のようにレコード内にある配列は、ポップアップと書き出しの中でJSONの文字列として残ります。
認識されるフィールド名
ビューアーは各フィールド名の最後の部分を比べるので、`lat`、`location.lat`、`data.geo.lat` はどれも対象になります。大文字と小文字は区別しません。一致するものがなければ、Coordinatesパネルで自分でフィールドを選びます。
- 緯度
lat、latitude、lat_dd、y、ycoord、point_y、decimalLatitude、gps_lat、geo_latなどの形。- 経度
lng、lon、long、longitude、lon_dd、x、xcoord、point_x、decimalLongitude、gps_lon、geo_lngなどの形。- 両方を持つ1つのフィールド
coordinates、coords、position、latlng、lnglat、location、geo、point、center、gpsで終わる名前で、値が2つの数値の配列か "a, b" の文字列の場合。- 候補の選び方
- 考えられる緯度と経度の組み合わせを、最初の300件のレコードで試します。±90と±180に収まる値が最も多い組が選ばれ、同じ親オブジェクトを持つ組には加点があり、同点のときは
x/yより本当のlat/lngの名前が優先されます。 - 組の順序
lnglat、lonlat、coordinatesは経度が先、latlngとlatlonは緯度が先を意味します。ほかの名前では、有効な値が多い順序を選びます。どちらでも合う場合、配列は[lng, lat]、文字列は "lat, lng" として読みます。
技術的な詳細
ビューアーが受け付けるものと作り出すものを正確に説明します。
- 入力
- 50 MBまでの
.json、.jsonl、.ndjsonファイル、またはPaste JSON欄に貼り付けたJSON。 - GeoJSONとTopoJSONは対象外
- ファイルがすでにGeoJSON(
"type": "FeatureCollection")やTopoJSON("type": "Topology")の場合は、このサイトのGeoJSONビューアーまたはTopoJSONビューアーを案内するメッセージが出ます。 - レコードの一覧
- 要素の半分以上がオブジェクトの配列(8階層まで、どの深さでも)と、値がすべてレコードであるオブジェクト。座標を持つ一覧が先に、次に大きい一覧が並びます。
- 有効な座標
- 緯度は−90〜90、経度は−180〜180の十進法の度(WGS84)。範囲外のレコードは数えられ、地図には描かれません。
- 入れ替わりの警告
- 範囲外のレコードが、緯度と経度を入れ替えれば有効になる場合、ビューアーはその数を数え、Swapボタンを表示します。
- フィールドで色分け
- 異なる値が10種類までのフィールドなら、凡例と値ごとの件数付きで点を色分けできます。
- 性能
- 点はcanvasに描くので、普通のノートパソコンでも数万件のレコードがなめらかに動きます。
- 書き出し
- すべてのフィールドをプロパティに持つGeoJSON、または最初の2列が
latitudeとlongitudeで、その後に平らにしたフィールドが続くCSV。 - プライバシー
- ファイルはブラウザ内で読み込まれます。インターネットから読み込むのはベースマップのタイルだけです。
JSONを地図に表示する手順
組み込みのサンプルで全体の流れを示します。APIのレスポンスのような入れ子の中に、ヨーロッパの25都市があります。座標は `location` オブジェクトにあり、位置のないレコードが1件あります。

地図は道路のベースマップ付きで開きます。Upload、Paste JSONを使うか、ファイルを地図にドラッグします。ここではSample Dataをクリックしました。

Recordsパネルには、選ばれた一覧(`data.cities`)、地図に表示されたレコード数、座標がなかったレコード数が表示されます。サンプルでは1件が `"location": null` なので、25件中24件が表示されます。

Coordinatesパネルには検出されたフィールド、ここでは `location.lat` と `location.lng` が表示されます。`[lng, lat]` や `"lat, lng"` の1つのフィールドを持つデータでは「One field」に切り替え、点の位置がおかしい場合はSwapを使います。

「Color by field」でフィールドを選びます。ここでは `capital` で首都とそれ以外の都市を分け、値ごとに凡例と件数を表示しています。

点をクリックすると、正確な座標と、入れ子の値や配列を含むレコードのすべてのフィールドが表示されます。

点を、QGIS、ArcGIS、Web地図用のGeoJSON、またはExcelやGoogleスプレッドシート用のCSVでダウンロードします。
JSONデータを地図にするほかの方法
このビューアーはJSONファイルを見る最も速い方法です。同じ作業を処理の流れの中で行うときは、次のツールを使います。
QGIS
QGISだけでは、普通のJSONのレコードを地図に置けません。GeoJSONは読めますし、CSVは「CSVテキストレイヤを追加」で読めます。そのため、まずJSONをCSVかGeoJSONに変換するのが一般的で、ここの書き出しボタンがまさにその役目です。
pandasとGeoPandasを使ったPython
pandas.json_normalize は、このビューアーと同じように、入れ子のJSONをドット付きの名前の列に平らにします。その後 geopandas.points_from_xy で点を作ります。x(経度)が先である点に注意してください。
コマンドラインのjq
jq は、どんなJSONも1つのコマンドでGeoJSONのFeatureCollectionに作り替えられます。APIから定期的にデータを取得するスクリプトに最適です。
JavaScriptとLeaflet
自分でWeb地図を作るなら、レコードを順に処理してマーカーを追加できます。Leafletは [lat, lng] を求めますが、GeoJSONは [lng, lat] で保存します。この取り違えは地図のコードで最も多いバグです。
同じ作業をコードで
3つの例はどれも上で使ったサンプルファイルを読み込み、位置のないレコードを飛ばし、ほかのフィールドを残します。
# Python: pandas flattens nested JSON, GeoPandas builds the points
import json
import pandas as pd
import geopandas as gpd
with open("cities.json") as f:
data = json.load(f)
df = pd.json_normalize(data["data"]["cities"]) # columns: location.lat, location.lng
df = df.dropna(subset=["location.lat", "location.lng"])
gdf = gpd.GeoDataFrame(
df, geometry=gpd.points_from_xy(df["location.lng"], df["location.lat"]), crs="EPSG:4326"
)
gdf.to_file("cities.geojson", driver="GeoJSON")# jq on the command line: JSON records to a GeoJSON FeatureCollection
jq '{type: "FeatureCollection", features: [
.data.cities[] | select(.location != null) | {
type: "Feature",
properties: del(.location),
geometry: { type: "Point", coordinates: [.location.lng, .location.lat] }
}]}' cities.json > cities.geojson// JavaScript + Leaflet: note the order, Leaflet wants [lat, lng]
const res = await fetch("cities.json");
const json = await res.json();
for (const c of json.data.cities) {
if (!c.location) continue;
L.marker([c.location.lat, c.location.lng]).bindPopup(c.name).addTo(map);
}私の考えでは、新しいJSONファイルの構造を理解し、座標を確認するのにこのビューアーを使うのがよいです。構造がわかれば、Pythonやjqの数行で、データが変わるたびにGeoJSONに変換できます。
ビューアーの仕組み
ファイルをドロップしてから点が表示されるまでの流れです。すべてのステップはブラウザ内で動きます。
- テキストを解析する. テキストをJSONとして解析します。失敗し、ファイルが複数行ある場合は、各行をJSON Linesとして解析します。先頭のバイト順マークは取り除きます。
- 専用のビューアーがあるファイルを断る. GeoJSONとTopoJSONは
typeで見分け、このサイトの対応するビューアーへ案内します。これらにはすでに本当のジオメトリが入っているからです。 - レコードの一覧を探す. 文書を8階層までたどり、要素の大部分がオブジェクトである配列と、値がすべてレコードであるオブジェクトを集めます。各レコードはドット付きのパスに平らにします。
- 座標を見つける. フィールド名を上の一覧と比べます。候補の組を最大300件のレコードで試し、有効な値が最も多い組を選びます。合う組がなければ、2つの数値を持つ単独のフィールドを試します。
- 点を作る. 選んだフィールドで各レコードを読みます。文字列の数値は変換し、±90 / ±180を外れた値は数えて飛ばし、入れ替えれば合うレコードは別に数えます。
- 描画、色分け、書き出し. 点をcanvasのレイヤーに描き、地図をそこにズームします。フィールド、順序、色を変えると、地図はすぐに描き直されます。書き出しには、画面に見えているレコードがそのまま使われます。
自動検出は最初の提案にすぎません。どの選択もサイドバーで変えられ、変えるとすぐ地図が更新されるので、提案が間違っていてもクリック1回で直せます。
座標の確認:範囲、入れ替わり、精度
緯度と経度の組は、2つの数値にすぎません。次の3つの確認で、その数値が妥当かどうかがわかります。
1. 有効な範囲
緯度は赤道から北と南へ測るので、南極の−90から北極の+90までしかありません。経度はグリニッジから東と西へ測り、−180から+180までです。
有効 ⇔ −90 ≤ 緯度 ≤ 90 かつ −180 ≤ 経度 ≤ 180 緯度 91.2、経度 10.5 → 無効(緯度が大きすぎる)
この範囲を外れる値は、ほとんどの場合次の3つのどれかです。フィールドが入れ替わっている、データがUTMやWebメルカトルのメートルのような投影座標系である、または小数点が失われている(52.52ではなく52520000)。
2. 入れ替わった値を見つける
そのままでは無効でも、2つの数値を入れ替えると有効になる組は、フィールドが入れ替わっている可能性が高いです。ビューアーはこうしたレコードを数え、Swapボタンを表示します。
保存値: 緯度 = 151.21, 経度 = −33.87 → 無効 入れ替え: 緯度 = −33.87, 経度 = 151.21 → 有効(シドニー)
この確認ですべての入れ替わりがわかるわけではありません。2つの数値が両方とも−90〜90なら、どちらの順序でも有効だからです。パリを (48.86, 2.35) ではなく (2.35, 48.86) と保存すると、ソマリア沖のインド洋に表示されます。点が世界の違う場所に出たら、Swapを試して地図を見てください。
3. 小数の桁数と精度
緯度1度はどこでも約111 kmです。経度1度は赤道で約111 kmで、緯度の余弦に比例して短くなります。つまり小数が1桁増えるごとに、位置は約10倍細かくなります。
緯度1° ≈ 111 320 m 経度1° ≈ 111 320 m · cos(緯度) 桁数 緯度のステップ ベルリン(52.52°)での経度のステップ 1 11.1 km 6.8 km 2 1.1 km 680 m 3 111 m 68 m 4 11.1 m 6.8 m 5 1.1 m 0.68 m 6 0.11 m 0.07 m
小数4桁で建物、5桁で玄関がわかり、6桁はすでに普通のスマートフォンのGPSより細かいです。JSONに小数が10桁や15桁あっても、余分な桁は精度を上げません。浮動小数点の計算から生まれたものです。
このビューアーが役立つ場面
私がJSONマップビューアーを使うのは、次のような場面です。
- APIのレスポンスを確認する. 天気、交通、店舗検索のAPIのレスポンスを貼り付ければ、地図のコードを書く前に、位置が妥当かどうかをすぐに確認できます。
- アプリやデータベースの書き出しを確認する. 配達アプリ、CRM、IoTプラットフォームはよくJSONを書き出します。書き出したデータを地図に表示して、座標が欠けている、または間違っているレコードを見つけます。
- JSONをGeoJSONやCSVに変換する. スクリプトを書かずに、QGISやArcGIS用のGeoJSONファイル、またはExcel用のCSVを手に入れられます。
- 入れ替わった座標を見つける. 警告と地図のおかげで、処理のどこかで緯度と経度が入れ替わるというよくあるバグに簡単に気づけます。
- オープンデータのポータルを調べる. 多くのオープンデータのポータルは、CSVと並べてJSONを提供しています。JSONにはCSVでは失われる入れ子の詳細が残っていることが多く、そのまま地図にできます。
- フィールドで点をグループ分けする. 状態、カテゴリ、種類で色分けすると、オフラインの観測所や日曜日に営業する店舗などの傾向が見えてきます。
- 地図のコードをデバッグする. 自分の地図で点が違う場所に出たら、同じJSONをここで読み込みます。ここで正しく表示されるなら、バグは自分のコードにあり、多くは [lat, lng] と [lng, lat] の取り違えです。
- JSONと座標を教える. 学生は小さなJSONの例を貼り付けて、入れ子、フィールド名、座標の順序が地図上の結果をどう変えるかを確かめられます。
よくある質問
1. JSONデータを地図に表示するには?
ファイルをアップロードするか、JSONを貼り付けるか、ファイルを地図にドラッグします。ビューアーはレコードと緯度・経度のフィールドを自動で見つけます。見つからない場合は、Coordinatesパネルでフィールドを選んでください。
2. JSONとGeoJSONの違いは何ですか?
JSONは汎用のデータ形式です。GeoJSONは、ジオメトリ用の決まった構造を持つJSONの規格(RFC 7946)で、geometry オブジェクトと properties を持つフィーチャから成ります。普通のJSONはどんな名前のどのフィールドにも座標を保存できるため、このビューアーはそれを探す必要があります。
3. 座標が入れ子のオブジェクトの中にあります。使えますか?
はい。入れ子のオブジェクトはドット付きのパスに平らにされるので、{"location": {"lat": 52.5}} は location.lat というフィールドになります。8階層まで探します。
4. ファイルに一覧が複数あります。どれが使われますか?
座標を持つ一覧が優先され、次に最も大きい一覧が選ばれます。見つかった一覧はすべて「List of records」メニューにあるので、別の一覧に切り替えられます。
5. 点が違う場所に表示されます。どうすればよいですか?
まずSwapをクリックしてください。緯度と経度は逆に保存されていることがよくあります。それでもおかしい場合は座標系を確認してください。数千や数百万の値は、度ではなくUTMやWebメルカトルのメートルである可能性が高いです。
6. 地図に表示されないレコードがあるのはなぜですか?
Recordsパネルに理由が出ます。座標のフィールドに値がなかったか、緯度が±90、経度が±180を外れていたかのどちらかです。描画と書き出しの対象は有効なレコードだけです。
7. 文字列で保存された座標でも使えますか?
はい。"52.52" も "52,52" も数値として読みます。"52.52, 13.405" のように両方の値を持つ文字列も、「One field」を選べば使えます。
8. 配列 [a, b] はどちらの順序ですか?
coordinates という名前のフィールドは、GeoJSONの順序である[経度, 緯度]です。latlng は緯度が先、lnglat は経度が先です。ほかの名前では両方の順序を試し、有効な値が多い方を選びます。順序のメニューでいつでも変えられます。
9. ここでGeoJSONやTopoJSONを開けますか?
いいえ、その必要はありません。これらの形式にはすでにジオメトリがあるので、このサイトのGeoJSONビューアーまたはTopoJSONビューアーを案内します。
10. どれくらいのレコード数まで扱えますか?
50 MBまでのファイルです。点はcanvasに描くので、数万の点でもなめらかに動きます。とても大きなファイルは、解析に数秒かかります。
11. データはアップロードされますか?
いいえ。ファイルはブラウザ内で読み込まれ、書き出しもブラウザ内で作られます。インターネットから読み込むのはベースマップのタイルだけです。
ライブラリとクレジット
JSONの読み込みと座標の検出は、このサイトのために書いたものです。地図はオープンソースソフトウェアの上に作られています。
- Leaflet 1.9 · BSD-2-Clause · Volodymyr Agafonkin and contributorsインタラクティブな地図、canvasの点レイヤー、ポップアップを描きます。
- OpenStreetMap, Protomaps (hosted by KONAKTIVE), CARTO, Esri World Imagery · ODbLと提供元の利用規約 · OpenStreetMap contributors, Protomaps, KONAKTIVE, CARTO, Esriベースマップのタイルと画像。
関連ツール
JSONファイルはブラウザ内で読み込まれ、サーバーにアップロードされることはありません。サンプルの座標は都市の中心で、小数は最大4桁です。 地図タイル © OpenStreetMap の貢献者、Protomapsで描画(ホスティング:KONAKTIVE)、予備としてCARTO。 衛星画像:Esri。
