1. 注册百度账号
2. 账号和获取秘钥
- 文档地址
- 登录注册百度账号之后
- 点击账号和获取密钥
- 然后点击右上角 控制台 进入注册页
- 分为
个人开发者、企业用户、学生



3. 创建应用


4. 使用
- 官方文档以及很详细了
- 我自己的项目是通过 vite 创建的 所及直接在 index.html 中引入 SDK
<!doctype html>
<html lang="en" data-env="dev">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>React后台</title>
</head>
<body>
<div id="root"></div>
<script src="//mapopen.bj.bcebos.com/github/BMapGLLib/TrackAnimation/src/TrackAnimation.min.js"></script>
<script type="text/javascript" src="//api.map.baidu.com/api?type=webgl&v=1.0&ak=自己的密钥"></script>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
5. React 使用
5.1. 功能一、地图打点
import { useImperativeHandle, useState } from 'react'
import { message, Modal } from 'antd'
import { IModalProp, OrderItem } from '@/types'
import { getOrderDetail, updateOrder } from '@/api'
type MarkerTypes = Array<{
lng: string
lat: string
id: number
}>
const OrderMarker = (props: IModalProp) => {
const [visible, setVisible] = useState(false)
const [markerData, setMarkerData] = useState<MarkerTypes>([])
const [markId, setMarkId] = useState('')
const open = async (data?: OrderItem) => {
setVisible(true)
setMarkId(data!.orderId)
const markerData = await getOrderDetail(data!.orderId)
renderMap(markerData)
}
const createMarker = (map: any, lng: string, lat: string) => {
const id = Math.random()
markerData.push({ lng, lat, id })
const marker = new window.BMapGL.Marker(new window.BMapGL.Point(lng, lat))
marker.id = id
const markerMenu = new window.BMapGL.ContextMenu()
markerMenu.addItem(
new window.BMapGL.MenuItem('删除', function () {
map.removeOverlay(marker)
const index = markerData.findIndex(item => item.id === marker.id)
markerData.splice(index, 1)
setMarkerData([...markerData])
})
)
setMarkerData([...markerData])
marker.addContextMenu(markerMenu)
map.addOverlay(marker)
}
const renderMap = (data: OrderItem) => {
const map = new window.BMapGL.Map('container')
map.centerAndZoom(data.cityName, 12)
const zoomCtrl = new window.BMapGL.ZoomControl()
map.addControl(zoomCtrl)
map.enableScrollWheelZoom(true)
data.route.forEach(item => {
createMarker(map, item.lng, item.lat)
})
map.addEventListener('click', function (e: any) {
createMarker(map, e.latlng.lng, e.latlng.lat)
})
}
useImperativeHandle(props.markerRef, () => ({
open
}))
const handleOk = async () => {
await updateOrder({
orderId: markId,
route: markerData
})
message.success('打点成功')
handleCancel()
}
const handleCancel = () => {
setVisible(false)
setMarkerData([])
}
return (
<Modal
title='地图打点'
open={visible}
okText='确定'
width={1200}
cancelText='取消'
onOk={handleOk}
onCancel={handleCancel}
>
<div id='container' style={{ height: 600 }} />
</Modal>
)
}
export default OrderMarker
5.2. 功能二、打点之后运行轨迹
- 百度地图示例文档 代码基本可以直接 copy
- 一定要引入动画库 切记切记!!!
- 在上面 index.html 引入
import { useImperativeHandle, useState } from 'react'
import { message, Modal } from 'antd'
import { IModalProp, OrderItem } from '@/types'
import { getOrderDetail } from '@/api'
const MapTrajectory = (props: IModalProp) => {
const [visible, setVisible] = useState(false)
const [trackAni, setTrackAni] = useState<{ cancel?: () => void }>()
const open = async (data?: OrderItem) => {
const detail = await getOrderDetail(data!.orderId)
if (detail.route.length > 0) {
setVisible(true)
setTimeout(() => {
renderMap(detail)
})
} else {
message.warning('请先进行打点操作')
}
}
const renderMap = (data: OrderItem) => {
const map = new window.BMapGL.Map('mapTrajectory')
map.enableScrollWheelZoom(true)
map.centerAndZoom(data.cityName, 17)
const path = data.route || []
let point = []
for (var i = 0; i < path.length; i++) {
point.push(new window.BMapGL.Point(path[i].lng, path[i].lat))
}
const polyline = new window.BMapGL.Polyline(point, {
strokeColor: '#a170f2',
strokeWeight: 6,
strokeOpacity: 0.5
})
setTimeout(() => {
start()
}, 100)
function start() {
const trackAni = new window.BMapGLLib.TrackAnimation(map, polyline, {
overallView: true,
tilt: 30,
duration: 20000,
delay: 300
})
trackAni.start()
setTrackAni(trackAni)
}
}
useImperativeHandle(props.mapTrajectoryRef, () => ({
open
}))
const handleOk = () => {
trackAni?.cancel?.()
setVisible(false)
}
const handleCancel = () => {
trackAni?.cancel?.()
setVisible(false)
}
return (
<Modal
title='运行轨迹'
open={visible}
okText='确定'
width={1200}
cancelText='取消'
onOk={handleOk}
onCancel={handleCancel}
>
<div id='mapTrajectory' style={{ height: 600 }} />
</Modal>
)
}
export default MapTrajectory
5.3. 效果展示


5.4. 问题
- 不存在类型怎么办

declare interface Window {
BMapGL: {
[propName: string]: any
}
}
{
"include": ["src", "typings.d.ts", "global.d.ts"]
}
- 调用百度 SDK 出现白名单问题
- 自己个学习使用白名单里面写个 http 就行了 最终上线的话就要配置真正的域名了
