Wizualizacja danych: mapowanie trzęsień

Przegląd

Z tego samouczka dowiesz się, jak wizualizować dane w Mapach Google. Na przykład mapy w tym samouczku wizualizują dane o lokalizacji trzęsień ziemi i ich magnitudzie. Poznaj techniki, które możesz wykorzystać w przypadku własnego źródła danych, i twórz w Mapach Google ciekawe historie, takie jak te poniżej.

Pierwsze 2 klatki widoczne powyżej (od lewej do prawej) przedstawiają mapy z podstawowymi znacznikamiokręgami o różnych rozmiarach. Na ostatniej klatce wyświetlana jest mapa termiczna.

Importowanie danych

W tym samouczku używamy danych o trzęsieniach ziemi w czasie rzeczywistym pochodzących z United States Geological Survey (USGS). Witryna USGS udostępnia dane w różnych formatach, które możesz skopiować do swojej domeny, aby aplikacja miała do nich lokalny dostęp. W tym samouczku wysyłamy żądanie JSONP bezpośrednio z serwerów USGS, dodając tag script do nagłówka dokumentu.

// Create a script tag and set the USGS URL as the source.         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);

Umieszczanie podstawowych znaczników

Po pobraniu do aplikacji danych o lokalizacji trzęsień ziemi z pliku danych USGS możesz wyświetlić je na mapie. W tej sekcji dowiesz się, jak utworzyć mapę, która używa zaimportowanych danych do umieszczania podstawowego markera w epicentrum każdego trzęsienia ziemi.

W sekcji poniżej znajdziesz 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>      <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>

Wypróbuj przykład

Dostosowywanie map za pomocą kształtów i map cieplnych

W tej sekcji znajdziesz inne sposoby dostosowywania rozbudowanych zbiorów danych na mapie. Weź pod uwagę mapę utworzoną w poprzedniej sekcji tego samouczka, na której znajdują się znaczniki w miejscach wystąpienia wszystkich trzęsień ziemi. Możesz dostosować znaczniki, aby wizualizować dodatkowe dane, np. lokalizacje, w których występuje najwięcej trzęsień ziemi, oraz ich magnitudę lub głębokość.

Oto kilka opcji dostosowywania podstawowego znacznika:

  • Używanie rozmiaru okręgu:
    możesz rysować okręgi (lub inne kształty) o rozmiarach proporcjonalnych do siły trzęsienia ziemi, używając symboli. Dzięki temu silne trzęsienia ziemi są reprezentowane na mapie przez największe okręgi.

  • Korzystanie z map termicznych:
    Warstwa mapy termicznej w bibliotece wizualizacji to prosty, ale skuteczny sposób wyświetlania rozkładu trzęsień ziemi. Mapy cieplne używają kolorów do przedstawiania gęstości punktów, co ułatwia wyodrębnianie obszarów o dużej aktywności. Mapy cieplne mogą też używać WeightedLocations, dzięki czemu np. większe trzęsienia ziemi będą na nich bardziej widoczne.

Rozmiar okręgu

Na mapie poniżej wyświetlają się dostosowane znaczniki w postaci okręgów. Wielkość okręgu zwiększa się wraz z magnitudą trzęsienia ziemi w danym miejscu.

W sekcji poniżej znajdziesz cały kod potrzebny do utworzenia mapy z dostosowanymi znacznikami w postaci okręgów.

TypeScript

let map: google.maps.Map;  function initMap(): void {   map = new google.maps.Map(document.getElementById("map") as HTMLElement, {     zoom: 2,     center: { lat: -33.865427, lng: 151.196123 },     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);    map.data.setStyle((feature) => {     const magnitude = feature.getProperty("mag") as number;     return {       icon: getCircle(magnitude),     };   }); }  function getCircle(magnitude: number) {   return {     path: google.maps.SymbolPath.CIRCLE,     fillColor: "red",     fillOpacity: 0.2,     scale: Math.pow(2, magnitude) / 2,     strokeColor: "white",     strokeWeight: 0.5,   }; }  function eqfeed_callback(results: any) {   map.data.addGeoJson(results); }  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: { lat: -33.865427, lng: 151.196123 },     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);   map.data.setStyle((feature) => {     const magnitude = feature.getProperty("mag");     return {       icon: getCircle(magnitude),     };   }); }  function getCircle(magnitude) {   return {     path: google.maps.SymbolPath.CIRCLE,     fillColor: "red",     fillOpacity: 0.2,     scale: Math.pow(2, magnitude) / 2,     strokeColor: "white",     strokeWeight: 0.5,   }; }  function eqfeed_callback(results) {   map.data.addGeoJson(results); }  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 Circles</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>

Wypróbuj przykład

Mapy termiczne

Mapy termiczne ułatwiają widzom zrozumienie rozkładu trzęsień ziemi zgłoszonych przez USGS. Zamiast umieszczać znacznik w każdym epicentrum, mapy cieplne wykorzystują kolor i kształt do przedstawiania rozkładu danych. W tym przykładzie czerwony kolor oznacza obszary o dużej aktywności sejsmicznej.

W sekcji poniżej znajdziesz cały kod potrzebny do utworzenia tej mapy.

TypeScript

let map: google.maps.Map;  function initMap(): void {   map = new google.maps.Map(document.getElementById("map") as HTMLElement, {     zoom: 2,     center: { lat: -33.865427, lng: 151.196123 },     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); }  function eqfeed_callback(results: any) {   const heatmapData: google.maps.LatLng[] = [];    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]);      heatmapData.push(latLng);   }    const heatmap = new google.maps.visualization.HeatmapLayer({     data: heatmapData,     dissipating: false,     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: { lat: -33.865427, lng: 151.196123 },     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); }  function eqfeed_callback(results) {   const heatmapData = [];    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]);      heatmapData.push(latLng);   }    const heatmap = new google.maps.visualization.HeatmapLayer({     data: heatmapData,     dissipating: false,     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 Heatmap</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&libraries=visualization&v=weekly"       defer     ></script>   </body> </html>

Wypróbuj przykład

Więcej informacji

Więcej informacji znajdziesz w tych artykułach: