LoginSignup
4
8

More than 5 years have passed since last update.

GoogleMapsを利用して路線を表示する

Last updated at Posted at 2016-08-06

2015年に実験的に試した内容。メモしておいた内容を今更ながら自分用メモとして投稿。
間違い等あったらごめんなさい。
markdown をイマイチよくわかってない。。。

条件

  • 国土交通省国土数値情報鉄道データを利用することとする。
  • 鉄道データをkmlフォーマットに変換しfusion tableに登録しgoogle maps上にオーバーレイ表示する
  • 変換はrubyスクリプトにて実施する
  • 表示確認は chorme のみ

問題

  • GoogleMap 標準に乗換案内レイヤ(TransitLayer)があるが、日本だと地下鉄だけの表示となってしまう。 以下のURL(引数でdata=!5m1!1e2を指定する)でTransitLayerが表示されるが日本だと地下鉄だけ表示される
    https://www.google.co.jp/maps/@34.6614067,135.4193668,10z/data=!5m1!1e2
    その他、レイヤ表示される内容
表示対象 data引数の値 日本での対応状況
道路状況 !5m1!1e1 地下鉄のみ表示
自転車 !5m1!1e3 使えない
地形 !5m1!1e4
  • GoogleMapAPIV3で乗換検索した結果を利用して路線表示しようとしたが、交通手段を公共交通機関(google.maps.TravelMode.TRANSIT)にすると日本だと検索できない。
    https://developers.google.com/maps/documentation/javascript/examples/directions-travel-modes?hl=ja
    上記サンプルを日本に変更して試したが動作しない。 公共交通機関以外の道路網(google.maps.TravelMode.DRIVING)、歩行(google.maps.TravelMode.WALKING)は検索可能(自転車(google.maps.TravelMode.BICYCLING)はダメ)

対応手順

鉄道データをkmlに変換

内容 キー 備考
ヘッダ情報 gml:boundedBy,gml:description,ksj:Datase ファイル自体の基本情報。今回は使用しない
カーブ情報 gml:Curv 路線または駅の位置情報が含まれる
路線情報 ksj:RailroadSection 事業者名、路線名、駅情報へのリンク等が含まれる。駅情報が含まれる場合はホームと同じ長さが保持されている(と思う)
駅情報 ksj:Station 事業者名、路線名、駅名、路線情報へのリンク等が含まれる
  • 鉄道データの注意するポイント

    • 路線情報は、1つの路線で複数存在する。また、1区間(駅と駅の間)で1つの路線情報とも限らない(と思う)。
    • 駅情報は、1つの駅で複数存在する場合がある(事業者名+駅名ではユニークとならない)。対象となる駅に路線が複数ある場合、路線数の駅情報が存在する。
    • 駅情報に対応するカーブ情報の位置情報は1点だけではない。おそらく駅ホームの長さ分の位置情報が含まれている。
    • 1つの路線を形成するカーブ情報が、あまりに細かく分断されていると、google map に表示したとき、ズームレベルを小さくすると点線となってしまう場合がある。 よって、可能な範囲で路線を形成するカーブ情報は、変換時になるべく繋ぎ合わせる必要がある。
    • 鉄道データの位置情報は、経度(lng), 緯度(lat) の順で記述されているが、出力する kml ファイル上は 緯度(lat), 経度(lng) の順に出力する必要がある。
  • 鉄道データをrubyスクリプトで変換する

    • 鉄道データ(N02-13.xml)は、30MB程あるため、xml パーサー等で変換すると時間が異常にかかる(または例外が発生する)。よって自力で解析する
    • 解析方法は、 鉄道データを読み込みメモリ上に展開し、カーブ情報、路線情報、駅情報それぞれを正規表現で繰り返し取得する。各要素は要素単位に正規表現にて取得する。
    • 1つの路線を形成するカーブ情報を繋ぎ合わせる方法は、単純に1つの路線データの終端位置が、他の路線データの先頭位置と同値を確認し、同値ならば1つに纏める。(もっといい方法があるかもしれない。。。)
    • 出力するジオメトリ情報は、data_type に rail(路線名),station(駅名)があり、railは ポリライン、stationはマーカーとする。
    • 変換スクリプトは以下のサイトに登録ずみ。
      https://github.com/oya3/gis_analyze.git
      実行方法
      >$ ruby gis_analyze -m mix N02-13.xml N02-13.kml
      ※windows上でのみ動作。
      ※-m オプションには、rail(路線のみ), station(駅のみ),mix(両方)が指定可能
    • 変換後のkmlファイルの1レコードの情報は以下の通り
key value
description 事業者名(kmlファイル必須項目らしい)
name 路線名または駅名(kmlファイル必須項目らしい)
data_type railまたはstation
company_name 事業者名
line_name 路線名
station_name 駅名
railway_type 鉄道区分コード http://nlftp.mlit.go.jp/ksj/gml/datalist/img/N02-1.gif 参照
service_provider_type 事業者種別コード http://nlftp.mlit.go.jp/ksj/gml/datalist/img/N02-1.gif 参照

変換した鉄道データ(kml)を fusion table に登録する

google にログイン状態で以下のサイトにアクセスし鉄道データ(kml)を fusion table に登録する
https://www.google.com/fusiontables/data?dsrcid=implicit

fusion table をgoogle map上に表示する

fusion table に登録した際の URL 引数にある docid を FusionTablesLayer の query from に設定する
参考サイトの
https://www.google.com/fusiontables/DataSource?docid=1oVouXsjBueThIMExCZh9LhYNVINnqIjzrnuc1fIT
の場合
docid は "1oVouXsjBueThIMExCZh9LhYNVINnqIjzrnuc1fIT" となる


var map, layer;

function initialize() {
  var center = new google.maps.LatLng(34.686871327463116, 135.52652215576177); // 大阪
  map = new google.maps.Map(document.getElementById('map-canvas'), {
    center: center,
    zoom: 11
  });
  layer = new google.maps.FusionTablesLayer({
    query: {
      from: '1oVouXsjBueThIMExCZh9LhYNVINnqIjzrnuc1fIT' // 

成果物

リンク

4
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8