Importowanie danych do Map

Przegląd

Dowiedz się, jak importować dane GeoJSON ze źródła lokalnego lub zdalnego i wyświetlać je na mapie. W tym samouczku używamy poniższej mapy do zilustrowania różnych technik importowania danych do map.

Sekcja poniżej zawiera cały kod potrzebny do utworzenia mapy w tym samouczku.

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>

Wypróbuj fragment

Wczytuję dane

W tej sekcji dowiesz się, jak wczytać dane z tej samej domeny co aplikacja interfejsu Maps JavaScript API lub z innej.

Wczytuję dane z tej samej domeny

Warstwa danych Map Google to kontener na dowolne dane geoprzestrzenne (w tym GeoJSON). Jeśli dane znajdują się w pliku hostowanym w tej samej domenie co aplikacja Maps JavaScript API, możesz je wczytać za pomocą metody map.data.loadGeoJson(). Plik musi być w tej samej domenie, ale możesz umieścić go w innej subdomenie. Możesz na przykład wysłać żądanie files.example.com z www.example.com.

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

Wczytuję dane w różnych domenach

Możesz też zażądać danych z domeny innej niż Twoja, jeśli konfiguracja domeny na to pozwala. Standard tego uprawnienia nosi nazwę Udostępnianie zasobów między domenami (CORS). Jeśli domena zezwalała na żądania między domenami, jej nagłówek odpowiedzi powinien zawierać tę deklarację:

Access-Control-Allow-Origin: *

Użyj Narzędzi deweloperskich w Chrome (DevTools), aby sprawdzić, czy w domenie jest włączony CORS.

Wczytywanie danych z takiej domeny wygląda tak samo jak wczytywanie JSON z tej samej domeny:

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

Żądanie JSONP

Aby można było zastosować tę metodę, domena docelowa musi obsługiwać żądania JSONP.

Aby wysłać żądanie JSONP, użyj createElement() i dodaj tag script w nagłówku dokumentu.

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

Po uruchomieniu skryptu domena docelowa przekazuje dane jako argument do innego skryptu, zwykle o nazwie callback(). Domena docelowa definiuje nazwę skryptu wywołania zwrotnego, czyli imię wyświetlane na stronie po wczytaniu docelowego adresu URL w przeglądarce.

W oknie przeglądarki wpisz np. http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_week.geojsonp, aby odsłonić nazwę wywołania zwrotnego jako eqfeed_callback.

Skrypt wywołania zwrotnego musisz zdefiniować w swoim kodzie:

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

Aby umieścić przeanalizowane dane GeoJSON na mapie, użyj metody addGeoJson().

Styl danych

Wygląd danych możesz zmienić, dodając dane GeoJSON do obiektu mapy. Więcej informacji o określaniu stylu danych znajdziesz w przewodniku dla deweloperów.

Więcej informacji

  • GeoJSON to powszechnie używany otwarty format do kodowania danych geograficznych oparty na formacie JSON (JavaScript Object Notation). Narzędzia i metody JavaScript przeznaczone do obsługi danych JSON działają też z GeoJSON. Więcej informacji znajdziesz w przewodniku dla programistów.
  • JSONP to skrót od padded JSON. Jest to metoda komunikacji wykorzystywana w programach JavaScript, które działają w przeglądarkach, w celu wysyłania żądań danych do serwera w innej domenie.