マップに GeoJSON データをインポートする

概要

ローカルまたはリモートのソースから GeoJSON データをインポートし、地図に表示する方法を説明します。このチュートリアルでは、以下の地図を使用して、データを地図にインポートするさまざまな方法を説明します。

以下のセクションに、このチュートリアルでマップを作成するために必要なコード全体を載せています。

TypeScript

let map: google.maps.Map;

function initMap(): void {
  map = new google.maps.Map(document.getElementById("map") as HTMLElement, {
    zoom: 2,
    center: new google.maps.LatLng(2.8, -187.3),
    mapTypeId: "terrain",
  });

  // Create a <script> tag and set the USGS URL as the source.
  const script = document.createElement("script");

  // This example uses a local copy of the GeoJSON stored at
  // http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_week.geojsonp
  script.src =
    "https://developers.google.com/maps/documentation/javascript/examples/json/earthquake_GeoJSONP.js";
  document.getElementsByTagName("head")[0].appendChild(script);
}

// Loop through the results array and place a marker for each
// set of coordinates.
const eqfeed_callback = function (results: any) {
  for (let i = 0; i < results.features.length; i++) {
    const coords = results.features[i].geometry.coordinates;
    const latLng = new google.maps.LatLng(coords[1], coords[0]);

    new google.maps.Marker({
      position: latLng,
      map: map,
    });
  }
};

declare global {
  interface Window {
    initMap: () => void;
    eqfeed_callback: (results: any) => void;
  }
}
window.initMap = initMap;
window.eqfeed_callback = eqfeed_callback;

JavaScript

let map;

function initMap() {
  map = new google.maps.Map(document.getElementById("map"), {
    zoom: 2,
    center: new google.maps.LatLng(2.8, -187.3),
    mapTypeId: "terrain",
  });

  // Create a <script> tag and set the USGS URL as the source.
  const script = document.createElement("script");

  // This example uses a local copy of the GeoJSON stored at
  // http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_week.geojsonp
  script.src =
    "https://developers.google.com/maps/documentation/javascript/examples/json/earthquake_GeoJSONP.js";
  document.getElementsByTagName("head")[0].appendChild(script);
}

// Loop through the results array and place a marker for each
// set of coordinates.
const eqfeed_callback = function (results) {
  for (let i = 0; i < results.features.length; i++) {
    const coords = results.features[i].geometry.coordinates;
    const latLng = new google.maps.LatLng(coords[1], coords[0]);

    new google.maps.Marker({
      position: latLng,
      map: map,
    });
  }
};

window.initMap = initMap;
window.eqfeed_callback = eqfeed_callback;

CSS

/* 
 * Always set the map height explicitly to define the size of the div element
 * that contains the map. 
 */
#map {
  height: 100%;
}

/* 
 * Optional: Makes the sample page fill the window. 
 */
html,
body {
  height: 100%;
  margin: 0;
  padding: 0;
}

HTML

<html>
  <head>
    <title>Earthquake Markers</title>

    <link rel="stylesheet" type="text/css" href="./style.css" />
    <script type="module" src="./index.js"></script>
  </head>
  <body>
    <div id="map"></div>

    <!-- 
      The `defer` attribute causes the script to execute after the full HTML
      document has been parsed. For non-blocking uses, avoiding race conditions,
      and consistent behavior across browsers, consider loading using Promises. See
      https://developers.google.com/maps/documentation/javascript/load-maps-js-api
      for more information.
      -->
    <script
      src="https://maps.googleapis.com/maps/api/js?key=AIzaSyB41DRUbKWJHPxaFjMAwdrzWzbVKartNGg&callback=initMap&v=weekly"
      defer
    ></script>
  </body>
</html>

サンプルを試す

データの読み込み

このセクションでは、Maps JavaScript API アプリケーションと同じドメインから、または別のドメインからデータを読み込む方法について説明します。

同じドメインからデータを読み込む

Google マップのデータレイヤは、任意の地理空間データ(GeoJSON を含む)のコンテナを提供します。Maps JavaScript API アプリケーションと同じドメインにホストしているファイルにデータが存在する場合は、map.data.loadGeoJson() メソッドを使用してデータを読み込むことができます。このファイルは同じドメインに存在する必要がありますが、別のサブドメインでホストできます。たとえば、www.example.com から files.example.com にリクエストを送信できます。

map.data.loadGeoJson('data.json');

ドメインをまたいでデータを読み込む

ドメインの設定で許可されていれば、自己所有のドメイン以外のドメインに対してデータをリクエストすることもできます。こうした権限の標準は、クロスオリジン リソース シェアリング(CORS)と呼ばれます。ドメインでクロスドメイン リクエストを許可している場合は、レスポンス ヘッダーに次の宣言を含める必要があります。

Access-Control-Allow-Origin: *

ドメインで CORS が有効になっているかどうかを確認するには、Chrome デベロッパー ツール(DevTools)を使用します。

このようなドメインからのデータの読み込みは、同じドメインから JSON を読み込む場合と同じです。

map.data.loadGeoJson('http://www.CORS-ENABLED-SITE.com/data.json');

JSONP のリクエスト

この手法を使用するには、対象のドメインで JSONP のリクエストがサポートされている必要があります。

JSONP をリクエストする場合は、createElement() を使用して、ドキュメントのヘッダーに script タグを追加します。

var script = document.createElement('script');
script.src = 'http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_week.geojsonp';
document.getElementsByTagName('head')[0].appendChild(script);

スクリプトを実行すると、対象のドメインはそのデータを引数として別のスクリプト(通常は callback() という名前)に渡します。対象のドメインは、コールバック スクリプトの名前を定義します。これは、ブラウザで対象の URL を読み込むと、最初にページに表示される名前です。

たとえば、ブラウザのウィンドウで http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_week.geojsonp を読み込むと、コールバックの名前が eqfeed_callback であることがわかります。

コールバック スクリプトをコード内で定義する必要があります。

function eqfeed_callback(response) {
  map.data.addGeoJson(response);
}

addGeoJson() メソッドを使用して、解析された GeoJSON データを地図に配置します。

データのスタイル設定

データの外観を変更するには、GeoJSON データを Map オブジェクトに追加します。データのスタイル設定について詳しくは、デベロッパー ガイドをご覧ください。

詳細

  • GeoJSON は、JSON(JavaScript Object Notation)を基にしたオープンなフォーマットで、地理情報データのエンコードに幅広く使用されています。JSON データ用に設計された JavaScript のツールやメソッドも GeoJSON に使用できます。詳しくは、デベロッパー ガイドをご覧ください。
  • JSONP は padded JSON の略です。これは、別のドメインにあるサーバーにデータをリクエストするための通信メソッドで、ウェブブラウザで実行する JavaScript プログラムで使用されます。