MULTISOUP

MULTISOUP

MULTISOUP

マルティスープ
Staff Blog

Introduction example

2017.04.23

KML を GeoJSON に変換して描画する

KML to GeoJSON

みなさん、こんちには。

最近、Google マイマップを使って図形を描画する機会がありました。

そこで、マイマップの機能を使い、KMLファイルをダウンロードし、Google Maps JavaScript API でKMLをロードしようとしたところ、何と表示されませんでした! そこまで複雑な図形ではありません。Google Earch や QGIS だと問題なく表示します。

仕方がないので、KML を GeoJSONに変換して描画することにしたました。今回はその方法を説明します。

 

KMLを GeoJSON に変換する方法としては、下記方法があります。(もっとあると思いますが…)

① QGIS等のソフトを使い、KMLをGeoJson にあらかじめ変換する
② ライブラリを用いて、動的に変換する

 

今回は、②のライブラリを用いて動的に変換し描画することにしました。

そこで今回使用したのは、MapBox で提供している「togeojson.js」です。

togeojson ライブラリのダウンロード

 

使い方は、非常に簡単です。KMLファイルを読込み、「togeojson.kml(kml)」と実行するだけです。

なお、kmlファイルの読込みは、d3.js で行いました。

 

var map = new google.maps.Map(document.getElementById("map"));

// d3 で kmlファイルを読み込む
d3.xml('test.kml', function(kml){
  // GeoJSON に変換
  var geojson = toGeoJSON.kml(kml);
  // map.data に GeoJSON を追加
  map.data.addGeoJson(kml);
  // スタイルの設定
  map.data.setStyle(function(feature) {
    var type = feature.getGeometry().getType();
    if (type === 'LineString') {
      return ({
        strokeColor: feature.getProperty('stroke'),
		strokeWeight: feature.getProperty('stroke-width'),
        zIndex: 1
      });
    } else if (type == 'Polygon') {
      return ({
        strokeColor: feature.getProperty('stroke'),
		strokeWeight: feature.getProperty('stroke-width'),
        fillColor: feature.getProperty('fill'),
        fillOpacity: feature.getProperty('fill-opacity'),
        zIndex: 1
      });
    } else if (type == 'Point') {
       return ({
         icon: {
           url: 'pin.png',
           scaledSize: new google.maps.Size(32, 32)
         }
       });
    }
 });
});

 

また、図形の範囲でズームする場合は、下記のようにします。図形を描画後、「zoomToGeojson」をコールしてください。

// GeoJSON で追加した図形範囲でズーム
var zoomToGeojson = function() {
  var bounds = new google.maps.LatLngBounds();
  map.data.forEach(function(feature) {
    processPoints(feature.getGeometry(), bounds.extend, bounds);
  });
  map.fitBounds(bounds);
};
var processPoints = function(geometry, callback, thisArg) {
  if (geometry instanceof google.maps.LatLng) {
    callback.call(thisArg, geometry);
  } else if (geometry instanceof google.maps.Data.Point) {
    callback.call(thisArg, geometry.get());
  } else {
    geometry.getArray().forEach(function(g) {
      processPoints(g, callback, thisArg);
    });
  }
};

 

 

こちらがサンプルアプリです。テキストボックスにKMLを貼り付けて、「GeoJSONに変換」ボタンをクリックすると、GeoJSON に変換し図形を描画します。

Full Screen

 

いかがでしょうか。

まだまだ、考慮しなければいけない箇所もたくさんありますが、KML の読込みで上手く行かない場合は、是非こちらをお試しください。

 

 

Google Maps API の技術的な質問、あるいは地図開発に関する質問などがありましたら、是非マルティスープにお問い合わせください。

では、今日はこの辺で。

 

地図や位置情報を用いたシステムのご提案・開発ならマルティスープへ

マルティスープは、創業以来のGISとモバイル開発の実績と技術力で、営業支援システムやリサーチ・公共インフラ・工事・警備業界の現場を支援するシステム開発など、地図や位置情報を使った業務システムの導入のご提案や開発をいたします。

現場をつなぐコミュニケーションが屋内外業務のパフォーマンスを最大限に。マルティスープのiField(アイ・フィールド)®シリーズは、屋内外業務の現場の実力を減少させるコミュニケーション障壁を除き、使い慣れたスマートデバイスを使って 現場の実力をリアルに伝えるサービス。

位置・空間情報のエキスパート集団として一緒に働きませんか?

マルティスープは地図情報をはじめとする位置・空間情報技術のエキスパート集団です。当社で日々研究している地図や位置情報といった技術は、災害支援など貢献度の高いシステムとして使用されることもあれば、スマートフォンアプリのゲームとして使われることもあり、その利用用途・価値は、今後もますます広がっていっています。
私たちの企業理念は、「創る喜び、使う喜び」です。
今後の開発体制をより強化するために、新卒・中途問わず、当社の未来を共に創っていただける新メンバーを募集します!

【関連記事】こんな記事も読まれています

2017.01.24

InfoWindow をカスタマイズする

こんにちは。

Google Maps 上に描画したマーカーをクリックしたときに表示する吹き出し、通称「InfoWindow」をカスタマイズ・・・

続きを読む

2017.09.10

Googleマップに天気画像を重ねて表示してみる

みなさん、こんにちは。

今回は Googleマップ上に、「OpenWeatherMap」という天気情報サービスで公開している降水量、温度などの・・・

続きを読む

2017.10.23

Mac で xml を gml に変換する(バッチ処理)

みなさん、こんにちは。

以前のブログで、Macで基盤地図情報をダウンロードしたもののxmlファイルなのでQGISで使えない問題が発生していた件・・・

続きを読む

 - GIS, Google Maps JavaScript API, スタッフ日記