Импорт данных в Карты

Обзор

Из этой статьи вы узнаете, как импортировать данные 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>
    <script src="https://polyfill.io/v3/polyfill.min.js?features=default"></script>

    <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 callback 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 Maps Data – это контейнер для произвольных геопространственных данных, например GeoJSON. Если данные находятся в том же домене, что и ваше приложение на Maps JavaScript API, то их можно загрузить с помощью метода map.data.loadGeoJson(). При этом файл и приложение могут находиться в разных поддоменах. Например, вы можете делать запросы к files.example.com из www.example.com.

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

Загрузка данных из разных доменов

Запросить данные из другого домена можно, если его конфигурация разрешает такие запросы. Стандартом разрешений является CORS (Cross-origin resource sharing). Если запросы из других доменов разрешены, заголовок ответа на запрос в домен должен включать следующую декларацию:

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);
}

Для прорисовки проанализированных данных GeoJSON на карте используйте метод addGeoJson().

Стилизация данных

Визуализацию данных можно изменять, добавляя данные GeoJSON в объект Map. Подробная информация об этом приведена в руководстве для разработчиков.

Дополнительная информация

  • GeoJSON – это популярный открытый формат кодирования географических данных на основе нотации объектов JavaScript (JSON). Инструменты и методы JavaScript, предназначенные для данных JSON, работают и с GeoJSON. Подробная информация об этом приведена в руководстве для разработчиков.
  • Формат JSONP также называют набитым JSON (от англ. "padded JSON"). Этот метод связи применяется в браузерных программах JavaScript для запроса данных с сервера в другом домене.