数据可视化:绘制地震图

概览

本教程介绍了如何在 Google 地图上直观呈现数据。例如,本教程中的地图直观呈现了地震位置和震级的相关数据。不妨学习一些技巧,运用到您自己的数据源上,在 Google 地图上创建经典用例(如下所示)。

左侧的画面显示的是包含基本标记的地图,右侧的画面显示的是包含大小不一的圆圈的地图。

导入您的数据

本教程使用的是来自美国地质调查局 (USGS) 的实时地震数据。USGS 网站上的数据以多种格式提供,您可以将它们复制到您的网域,以便您的应用在本地访问。本教程通过将 script 标记附加到文档标头来直接从 USGS 服务器请求 JSONP

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

放置基本标记

现在,您已经将地震位置相关数据从 USGS Feed 提取到您的应用中,接下来可以在地图上显示这些数据了。本部分介绍了如何创建一个地图,根据导入的数据将基本标记放置在每个地震位置的震中。

下一部分显示了创建本教程中的地图所需的完整代码。

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>

试用示例

使用形状自定义地图

本部分介绍了在地图上自定义丰富数据集的另一种方法。不妨参考一下本教程上一部分中创建的地图,该地图在每个地震位置都显示了标记。您可以通过自定义标记来直观呈现更多数据,例如震级或震源深度。

下面的地图显示的是使用圆形符号图标的自定义标记。每个圆圈的大小会随着相应地震震级的升高而增大。

下文显示了创建带有自定义圆圈标记的地图所需的完整代码。

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>

试用示例

更多信息

欢迎详细了解以下主题: