Google API 教程

Google API 教程

Google API 是 Google 提供给开发者的应用程序接口集合,涵盖地图、搜索、翻译、机器学习、云服务等众多能力。本文聚焦 Google Maps JavaScript API,展示如何在网页中集成地图。

Google API 概览

  • Google Maps API:地图展示与地理信息
  • Google Search API:搜索能力(已多数废弃)
  • Google Translate API:翻译服务
  • Google Cloud API:云计算、AI、存储
  • Google Auth API:OAuth 登录

Google Maps 能力

  • 地图展示(多种地图类型)
  • 标记(Marker)与信息窗口
  • 路线规划与方向服务
  • 地理编码(地址 ↔ 坐标)
  • 街景与绘图工具

基本流程

1. 获取 API Key(Google Cloud Console)
2. 启用 Maps JavaScript API
3. 在 HTML 中加载脚本
4. 创建地图并添加功能

注意

# 国内访问
# Google Maps 在中国大陆访问受限
# 国内替代方案:高德地图、百度地图
# 教程用于学习 API 设计思路

# API Key 安全
# 限制 Key 的域名与用途
# 不要在前端暴露高权限 Key

Google 地图 API

Google 地图 API

1. 获取 API Key

# 步骤
1. 访问 Google Cloud Console
   https://console.cloud.google.com
2. 创建项目(或选择现有)
3. 启用 API 与服务 → Maps JavaScript API
4. 凭据 → 创建凭据 → API 密钥
5. 复制 Key

# 安全限制(强烈建议)
- 限制 HTTP 引用(只允许你的域名)
- 限制 IP 地址
- 限制 API(只启用需要的)

2. 引入脚本

<script
  src="https://maps.googleapis.com/maps/api/js?key=YOUR_KEY&callback=initMap"
  async defer>
</script>

3. 第一个地图

<!DOCTYPE html>
<html>
<head>
  <style>
    #map { width: 100%; height: 400px; }
  </style>
</head>
<body>
  <div id="map"></div>

  <script>
    // 回调函数
    function initMap() {
      // 中心点(北京)
      var location = { lat: 39.9042, lng: 116.4074 };

      // 创建地图
      var map = new google.maps.Map(
        document.getElementById("map"), {
          zoom: 12,
          center: location
        }
      );

      // 添加标记
      new google.maps.Marker({
        position: location,
        map: map,
        title: "北京"
      });
    }
  </script>

  <!-- 引入 API -->
  <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_KEY&callback=initMap" async defer></script>
</body>
</html>

4. 常见类

google.maps.Map          地图
google.maps.Marker       标记
google.maps.InfoWindow   信息窗口
google.maps.Polyline     折线
google.maps.Polygon      多边形
google.maps.Circle       圆形
google.maps.Geocoder     地理编码
google.maps.DirectionsService  路线
google.maps.StreetViewService  街景

Google 地图基础

Google 地图基础

1. 地图选项

var map = new google.maps.Map(el, {
  center: { lat: 39.9042, lng: 116.4074 },
  zoom: 12,                    // 缩放级别 0-21
  mapTypeId: "roadmap",        // 地图类型
  disableDefaultUI: false,     // 是否显示默认控件
  zoomControl: true,           // 缩放控件
  scrollwheel: true,           // 滚轮缩放
  draggable: true,             // 可拖拽
  fullscreenControl: true,     // 全屏
  streetViewControl: true,     // 街景
  mapTypeControl: true         // 类型切换
});

2. 地图操作

// 设置中心
map.setCenter({ lat: 31.2304, lng: 121.4737 });

// 设置缩放
map.setZoom(15);

// 获取中心/缩放
var center = map.getCenter();
var zoom = map.getZoom();

// 边界
map.fitBounds(bounds);   // 适应边界

// 监听事件
google.maps.event.addListener(map, "click",
  function(e) {
    console.log("点击坐标:", e.latLng.lat(), e.latLng.lng());
  });

// 移除事件
google.maps.event.clearListeners(map, "click");

3. 标记(Marker)

// 基本标记
var marker = new google.maps.Marker({
  position: { lat: 39.9, lng: 116.4 },
  map: map,
  title: "标记标题",
  icon: "https://example.com/pin.png",  // 自定义图标
  draggable: true          // 可拖动
});

// 标记点击
marker.addListener("click", function() {
  alert("点击了标记!");
});

// 动画
marker.setAnimation(google.maps.Animation.DROP);
// BOUNCE 弹跳 / DROP 掉落

// 删除标记
marker.setMap(null);

4. 信息窗口

var infoWindow = new google.maps.InfoWindow({
  content: "<h3>北京</h3><p>中国首都</p>",
  maxWidth: 300
});

marker.addListener("click", function() {
  infoWindow.open(map, marker);
});

// 动态内容
infoWindow.setContent("<b>更新内容</b>");
infoWindow.close();

Google 地图叠加层

Google 地图叠加层

1. 折线(Polyline)

var path = [
  { lat: 39.9, lng: 116.4 },
  { lat: 31.2, lng: 121.5 },
  { lat: 22.5, lng: 114.1 }
];

var polyline = new google.maps.Polyline({
  path: path,
  geodesic: true,
  strokeColor: "#FF0000",
  strokeOpacity: 1.0,
  strokeWeight: 3
});
polyline.setMap(map);

2. 多边形(Polygon)

var triangle = [
  { lat: 39.9, lng: 116.3 },
  { lat: 39.9, lng: 116.5 },
  { lat: 39.8, lng: 116.4 }
];

var polygon = new google.maps.Polygon({
  paths: triangle,
  strokeColor: "#0000FF",
  strokeWeight: 2,
  fillColor: "#00FF00",
  fillOpacity: 0.3
});
polygon.setMap(map);

// 可编辑
polygon.setEditable(true);

3. 圆形与矩形

// 圆形
var circle = new google.maps.Circle({
  strokeColor: "#FF0000",
  strokeOpacity: 0.8,
  strokeWeight: 2,
  fillColor: "#FF0000",
  fillOpacity: 0.2,
  map: map,
  center: { lat: 39.9, lng: 116.4 },
  radius: 5000     // 米
});

// 矩形
var rectangle = new google.maps.Rectangle({
  bounds: {
    north: 40.0, south: 39.8,
    east: 116.6, west: 116.2
  },
  map: map
});

4. 图层(图层)

// 交通图层
var trafficLayer = new google.maps.TrafficLayer();
trafficLayer.setMap(map);

// 公交图层
var transitLayer = new google.maps.TransitLayer();
transitLayer.setMap(map);

// 自行车图层
var bikeLayer = new google.maps.BicyclingLayer();
bikeLayer.setMap(map);

// 移除图层
trafficLayer.setMap(null);

5. 信息窗口与叠加组合

// 点击多边形显示信息
polygon.addListener("click", function(e) {
  infoWindow.setPosition(e.latLng);
  infoWindow.setContent("点击了多边形");
  infoWindow.open(map);
});

Google 地图事件

Google 地图事件

1. 地图事件

// 点击地图
map.addListener("click", function(e) {
  console.log("位置:", e.latLng.lat(), e.latLng.lng());
});

// 双击
map.addListener("dblclick", function(e) { ... });

// 拖动
map.addListener("drag", function() { ... });
map.addListener("dragend", function() {
  console.log("新中心:", map.getCenter());
});

// 缩放
map.addListener("zoom_changed", function() {
  console.log("缩放级别:", map.getZoom());
});

// 类型切换
map.addListener("maptypeid_changed", function() { ... });

// 边界变化
map.addListener("bounds_changed", function() { ... });

2. 标记事件

marker.addListener("click", function() { ... });
marker.addListener("mouseover", function() { ... });
marker.addListener("mouseout", function() { ... });
marker.addListener("dragend", function(e) {
  // 拖动结束获取新位置
  console.log("新坐标:", e.latLng.lat(), e.latLng.lng());
});

3. 事件工具函数

// 添加一次性事件
google.maps.event.addListenerOnce(map, "idle", function() {
  console.log("地图加载完成(仅一次)");
});

// 绑定对象属性
// 多个标记绑定同一事件
var clickHandler = function(e) {
  console.log("标记:", this.getTitle());
};
markers.forEach(function(m) {
  m.addListener("click", clickHandler);
});

4. 事件实践:点击添加标记

var markers = [];

map.addListener("click", function(e) {
  var marker = new google.maps.Marker({
    position: e.latLng,
    map: map,
    draggable: true
  });
  markers.push(marker);

  // 显示坐标信息
  var info = new google.maps.InfoWindow({
    content: "纬度: " + e.latLng.lat().toFixed(4) +
             "<br>经度: " + e.latLng.lng().toFixed(4)
  });
  info.open(map, marker);
});

// 清除所有标记
function clearMarkers() {
  markers.forEach(function(m) { m.setMap(null); });
  markers = [];
}

Google 地图控件集

Google 地图控件集

1. 内置控件

# Google 地图内置控件
缩放控件(zoomControl)
类型切换(mapTypeControl)
全屏(fullscreenControl)
街景(streetViewControl)
比例尺(scaleControl)
旋转(rotateControl)

# 配置
var map = new google.maps.Map(el, {
  center: ...,
  zoom: 12,
  mapTypeControl: true,
  mapTypeControlOptions: {
    position: google.maps.ControlPosition.TOP_LEFT,
    style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
  },
  scaleControl: true,
  scaleControlOptions: {
    position: google.maps.ControlPosition.BOTTOM_LEFT
  }
});

2. 控件位置

google.maps.ControlPosition
  TOP_LEFT / TOP_CENTER / TOP_RIGHT
  LEFT_CENTER / RIGHT_CENTER
  BOTTOM_LEFT / BOTTOM_CENTER / BOTTOM_RIGHT

// 示例
position: google.maps.ControlPosition.TOP_RIGHT

3. 自定义控件

// 自定义控件类
function HomeControl(controlDiv, map) {
  controlDiv.style.padding = "5px";
  var controlUI = document.createElement("div");
  controlUI.style.cssText =
    "background:#fff;padding:8px 12px;cursor:pointer;" +
    "border:1px solid #ccc;border-radius:4px;";
  controlUI.textContent = "回到北京";
  controlDiv.appendChild(controlUI);

  controlUI.addEventListener("click", function() {
    map.setCenter({ lat: 39.9042, lng: 116.4074 });
    map.setZoom(12);
  });
}

// 添加到地图
var controlDiv = document.createElement("div");
new HomeControl(controlDiv, map);
map.controls[google.maps.ControlPosition.TOP_LEFT]
  .push(controlDiv);

4. 控件显示控制

// 隐藏默认控件
disableDefaultUI: true

// 单独控制
zoomControl: false
mapTypeControl: false
fullscreenControl: false
streetViewControl: false
scaleControl: true

Google 地图类型

Google 地图类型

1. 内置地图类型

# ROADMAP    普通街道地图(默认)
# SATELLITE  卫星影像
# HYBRID     卫星 + 标注
# TERRAIN    地形图

// 设置
map.setMapTypeId("satellite");

// 或初始化时
var map = new google.maps.Map(el, {
  mapTypeId: google.maps.MapTypeId.SATELLITE
});

2. 自定义地图样式

// 深色主题地图
var darkStyle = [
  {
    "featureType": "all",
    "elementType": "geometry",
    "stylers": [{ "color": "#242f3e" }]
  },
  {
    "featureType": "water",
    "elementType": "geometry",
    "stylers": [{ "color": "#17263c" }]
  },
  {
    "featureType": "road",
    "elementType": "labels.text.fill",
    "stylers": [{ "color": "#8a8a8a" }]
  }
];

var styledMap = new google.maps.StyledMapType(
  darkStyle,
  { name: "深色主题" }
);

map.mapTypes.set("dark", styledMap);
map.setMapTypeId("dark");

3. 地图类型控件

// 自定义类型按钮
mapTypeControlOptions: {
  mapTypeIds: [
    "roadmap",
    "satellite",
    "dark"     // 自定义类型
  ],
  style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR
}

4. 常用样式场景

# 深色主题: 数据大屏
# 简约主题: 新闻/博客
# 高对比: 无障碍
# 无标签: 纯地图底图

# 在线样式生成
# https://mapstyle.withgoogle.com
# 生成 JSON 样式粘贴使用

Google 地图参考手册

Google 地图参考手册

1. 核心类速查

# 地图
google.maps.Map           地图对象
google.maps.MapOptions    地图配置

# 几何
google.maps.LatLng        经纬度坐标
google.maps.LatLngBounds  边界范围
google.maps.Point         像素点
google.maps.Size          尺寸

# 叠加层
google.maps.Marker        标记
google.maps.InfoWindow    信息窗口
google.maps.Polyline      折线
google.maps.Polygon       多边形
google.maps.Circle        圆形
google.maps.Rectangle     矩形
google.maps.GroundOverlay 地面覆盖

# 服务
google.maps.Geocoder      地理编码
google.maps.DirectionsService  路线服务
google.maps.DistanceMatrixService 距离矩阵
google.maps.PlacesService 地点服务
google.maps.StreetViewService  街景

2. 常用方法速查

map.setCenter(latlng)      设置中心
map.setZoom(level)         设置缩放
map.setMapTypeId(type)     设置类型
map.fitBounds(bounds)      适应边界
map.panTo(latlng)          平移
map.getBounds()            获取边界

marker.setMap(map)         显示标记
marker.setPosition(latlng) 移动标记
marker.getPosition()       获取位置
marker.setAnimation()      设置动画
marker.setMap(null)        移除标记

infoWindow.open(map, anchor) 打开
infoWindow.close()            关闭
infoWindow.setContent(html)   设置内容

3. 常量速查

google.maps.MapTypeId
  ROADMAP SATELLITE HYBRID TERRAIN

google.maps.Animation
  DROP BOUNCE

google.maps.ControlPosition
  TOP_LEFT TOP_CENTER TOP_RIGHT ...
  LEFT_CENTER RIGHT_CENTER ...

google.maps.TravelMode
  DRIVING WALKING BICYCLING TRANSIT

google.maps.GeocoderStatus
  OK ZERO_RESULTS ERROR ...

地图 API Map() 构造器

地图 API Map() 构造器

1. Map 构造器

// 语法
new google.maps.Map(container, options)

// 完整选项
var options = {
  center: { lat: 39.9, lng: 116.4 },  // 必选
  zoom: 12,                           // 必选
  minZoom: 3,                         // 最小缩放
  maxZoom: 18,                        // 最大缩放
  mapTypeId: "roadmap",
  heading: 0,                         // 方向(街景)
  tilt: 0,                            // 倾斜
  draggable: true,
  scrollwheel: true,
  disableDoubleClickZoom: false,
  keyboardShortcuts: true,
  backgroundColor: "#fff",
  styles: [],                         // 自定义样式
  gestureHandling: "auto",            // 手势处理
  restriction: { latLngBounds: ... }, // 区域限制
  mapId: "MAP_ID"                     // 高级功能 ID
};

2. 创建示例

<div id="map" style="width:100%;height:500px;"></div>

<script>
function initMap() {
  // 多个地图实例
  var map1 = new google.maps.Map(
    document.getElementById("map"), {
      center: { lat: 39.9042, lng: 116.4074 },
      zoom: 12
    });

  var map2 = new google.maps.Map(
    document.getElementById("map2"), {
      center: { lat: 31.2304, lng: 121.4737 },
      zoom: 13
    });
}
</script>

3. 地图状态管理

// 保存/恢复地图状态
function saveState(map) {
  return {
    center: map.getCenter().toJSON(),
    zoom: map.getZoom(),
    type: map.getMapTypeId()
  };
}

function restoreState(map, state) {
  map.setCenter(state.center);
  map.setZoom(state.zoom);
  map.setMapTypeId(state.type);
}

// 使用
var state = saveState(map);
// ... 其他操作
restoreState(map, state);

4. 事件绑定在构造器

// 构造时不可直接传事件
// 需创建后 addListener
var map = new google.maps.Map(el, options);

map.addListener("idle", function() {
  console.log("地图空闲(加载完成)");
});

Google 地图 教程总结

Google 地图 教程总结

1. 知识回顾

  • API Key:Cloud Console 获取并配置限制
  • Map():构造地图,center/zoom 必选
  • Marker:标记与信息窗口
  • 叠加层:折线、多边形、圆形、图层
  • 事件:click、drag、zoom_changed 等
  • 控件:内置控件与自定义控件
  • 地图类型:标准/卫星/地形 + 自定义样式

2. 进阶功能

# 地理编码(Geocoding)
var geocoder = new google.maps.Geocoder();
geocoder.geocode(
  { address: "天安门" },
  function(results, status) {
    if (status === "OK") {
      var loc = results[0].geometry.location;
      console.log("坐标:", loc.lat(), loc.lng());
    }
  });

# 路线规划(Directions)
var directions = new google.maps.DirectionsService();
var renderer = new google.maps.DirectionsRenderer();
renderer.setMap(map);

directions.route({
  origin: "北京",
  destination: "上海",
  travelMode: "DRIVING"
}, function(result, status) {
  if (status === "OK") {
    renderer.setDirections(result);
  }
});

3. 国内替代方案

# Google Maps 国内访问受限
# 推荐替代
高德地图 JS API    amap.com
百度地图 JS API    lbsyun.baidu.com
腾讯位置服务       lbs.qq.com

# API 设计类似
# 学习 Google Maps 后可快速迁移

4. 最佳实践

  • API Key 严格限制(域名/IP)
  • 地图容器必须有明确宽高
  • 大数据量标记用 MarkerClusterer
  • 移动端考虑手势与性能
  • 监听 idle 事件再加载数据

5. 官方资源

文档:  developers.google.com/maps/documentation
示例:  developers.google.com/maps/documentation/javascript/examples
定价:  cloud.google.com/maps-platform/pricing
控制台: console.cloud.google.com

# 结语
# 掌握地图 API 的核心模式,
# 即可快速构建 LBS 应用。
第 1 / 10 节