Files

247 lines
6.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 地图加载与初始化 (Map Initialization)
本指南介绍如何使用 `@amap/amap-jsapi-loader` 异步加载高德地图 JSAPI v2.0,并初始化地图实例。
## 前置条件
在加载地图前,**必须**先完成安全配置。请参考 [安全配置文档](./security.md)。
```javascript
// 必须在加载前执行
window._AMapSecurityConfig = {
securityJsCode: '您的安全密钥',
};
```
## 1. 引入加载器
使用 script 标签加载 loader.js
```bash
<script src="https://webapi.amap.com/loader.js"></script>
```
## 2. 异步加载 JSAPI
使用 `AMapLoader.load` 方法加载 API。
```javascript
import AMapLoader from '@amap/amap-jsapi-loader';
AMapLoader.load({
key: '您的Key', // 必填,申请的 Web 端开发者 Key
version: '2.0', // 必填,指定版本号
plugins: ['AMap.Scale'], // 预加载插件列表
}).then((AMap) => {
// JSAPI 加载完成,可以开始初始化地图
initMap(AMap);
}).catch((e) => {
console.error('地图加载失败', e);
});
```
## 3. 进阶配置 (Advanced Configuration)
### 加载 Loca 数据可视化库
Loca 是高德地图基于 WebGL 的高性能数据可视化库。需要在加载器中显式声明 `Loca` 配置。
```javascript
AMapLoader.load({
key: '您的Key',
version: '2.0',
Loca: {
version: '2.0.0' // 指定 Loca 版本
}
}).then((AMap) => {
const map = new AMap.Map('container');
// 初始化 Loca 容器
const loca = new Loca.Container({
map: map,
});
});
```
```
### 加载器参数详解
| 参数 | 类型 | 必填 | 说明 |
| :--- | :--- | :--- | :--- |
| `key` | String | 是 | 申请好的 Web 端开发者 Key |
| `version` | String | 是 | 指定要加载的 JSAPI 版本,如 "2.0" |
| `plugins` | Array | 否 | 需要预加载的插件列表,如 `['AMap.Scale', 'AMap.ToolBar']` |
| `Loca` | Object | 否 | Loca 库配置,包含 `{ version: '2.0.0' }` |
| `AMapUI` | Object | 否 | AMapUI 库配置,包含 `{ version: '1.1', plugins: [] }` |
| `serviceHost` | String | 否 | 代理服务器地址(通常在安全配置中全局设置,此处也可覆盖) |
## 3. 初始化地图实例
创建 `AMap.Map` 实例,建议开启 3D 视图模式以获得最佳性能。
```javascript
function initMap(AMap) {
const map = new AMap.Map('container', {
viewMode: '3D', // 开启 3D 模式 (推荐)
zoom: 11, // 初始化缩放级别 [2, 20]
center: [116.397428, 39.90923], // 初始化中心点坐标 [lng, lat]
pitch: 45, // 俯仰角度,有效范围 [0, 83]
rotation: 0, // 旋转角度
mapStyle: 'amap://styles/normal', // 地图样式
});
// 添加控件
map.addControl(new AMap.Scale());
}
```
### 常用配置项
| 参数 | 类型 | 默认值 | 说明 |
| :--- | :--- | :--- | :--- |
| viewMode | String | '2D' | 渲染模式:'2D' 或 '3D' |
| zoom | Number | - | 初始缩放级别 |
| center | Array | - | 初始中心点 [lng, lat] |
| pitch | Number | 0 | 俯仰角度 (3D 模式有效) |
| rotation | Number | 0 | 旋转角度 |
| mapStyle | String | - | 地图样式 URL |
| zooms | Array | [2, 20] | 缩放级别范围 |
## 4. 地图生命周期管理
### 地图加载完成
```javascript
map.on('complete', function() {
console.log('地图加载完成');
});
```
### 销毁地图
在组件卸载或不再需要地图时,务必调用 `destroy` 方法以释放 WebGL 上下文和内存资源。
```javascript
// 销毁地图实例
if (map) {
map.destroy();
map = null;
}
```
## 5. 地图样式
### 官方主题样式
```javascript
const map = new AMap.Map('container', {
mapStyle: 'amap://styles/normal', // 标准
// mapStyle: 'amap://styles/dark', // 幻影黑
// mapStyle: 'amap://styles/light', // 月光银
// mapStyle: 'amap://styles/whitesmoke',// 远山黛
// mapStyle: 'amap://styles/fresh', // 草色青
// mapStyle: 'amap://styles/grey', // 雅士灰
// mapStyle: 'amap://styles/graffiti', // 涂鸦
// mapStyle: 'amap://styles/macaron', // 马卡龙
// mapStyle: 'amap://styles/blue', // 靛青蓝
// mapStyle: 'amap://styles/darkblue', // 极夜蓝
// mapStyle: 'amap://styles/wine', // 酱籽
});
// 动态切换样式
map.setMapStyle('amap://styles/dark');
```
## 完整示例 (Vue 3)
```vue
<template>
<div id="map-container" style="width: 100%; height: 500px;"></div>
</template>
<script setup>
import { onMounted, onUnmounted, shallowRef } from 'vue';
import AMapLoader from '@amap/amap-jsapi-loader';
const map = shallowRef(null); // 使用 shallowRef 避免深层响应式带来的性能损耗
onMounted(() => {
window._AMapSecurityConfig = { securityJsCode: '您的安全密钥' };
AMapLoader.load({
key: '您的Key',
version: '2.0',
plugins: ['AMap.Scale'], // 按需加载插件
}).then((AMap) => {
map.value = new AMap.Map('map-container', {
viewMode: '3D',
zoom: 12,
center: [120.15, 30.28],
});
// 添加插件
map.value.addControl(new AMap.Scale());
}).catch(e => console.error(e));
});
onUnmounted(() => {
map.value?.destroy();
});
</script>
```
## 5. 地图控件
```javascript
// 比例尺
map.addControl(new AMap.Scale());
// 工具条(缩放、定位)
map.addControl(new AMap.ToolBar({
position: 'RT' // 右上角
}));
// 3D 控制(旋转、俯仰)
map.addControl(new AMap.ControlBar({
position: { right: '10px', top: '10px' }
}));
// 鹰眼(缩略图)
map.addControl(new AMap.HawkEye());
// 图层切换
map.addControl(new AMap.MapType());
```
## 完整示例 (React Hooks)
```jsx
import React, { useEffect, useRef } from 'react';
import AMapLoader from '@amap/amap-jsapi-loader';
export default function MapComponent() {
const mapRef = useRef(null);
useEffect(() => {
// 安全密钥配置
window._AMapSecurityConfig = { securityJsCode: '您的安全密钥' };
AMapLoader.load({
key: '您的Key',
version: '2.0',
plugins: ['AMap.Scale'], // 预加载插件
}).then((AMap) => {
mapRef.current = new AMap.Map('map-container', {
viewMode: '3D',
zoom: 11,
center: [116.397428, 39.90923],
});
// 添加控件
mapRef.current.addControl(new AMap.Scale());
}).catch((e) => {
console.error('地图加载失败', e);
});
// 销毁地图
return () => {
mapRef.current?.destroy();
};
}, []);
return <div id="map-container" style={{ width: '100%', height: '500px' }} />;
}
```