引入百度地图插件

  1. <script src="https://api.map.baidu.com/api?v=3.0&type=webgl&ak=申请的key&s=1"></script>

添加 ts 类型

  1. declare const BMapGL: any

实现

  1. import { useEffect, useRef } from 'react';
  2. export default () => {
  3. const mapRef = useRef<any>(null);
  4. const creatMarker = (list: { gps: number[]; title: string; icon: string }[]) => {
  5. mapRef?.current?.clearOverlays(); // 先清除后创建,适用于切换
  6. list?.forEach((item) => {
  7. // 创建图标
  8. const myIcon = new BMapGL.Icon(item.icon, new BMapGL.Size(40, 50), {
  9. anchor: new BMapGL.Size(20, 50),
  10. });
  11. // 创建Marker标注,使用图标
  12. const point = new BMapGL.Point(item.gps[0], item.gps[1]);
  13. const marker = new BMapGL.Marker(point, {
  14. icon: myIcon,
  15. });
  16. // 点标记添加点击事件
  17. const infoWindow = new BMapGL.InfoWindow(item, {
  18. width: 200,
  19. height: 100,
  20. title: item.title,
  21. });
  22. marker.addEventListener('click', () => {
  23. mapRef.current.openInfoWindow(infoWindow, point); // 开启信息窗口
  24. });
  25. // 将标注添加到地图
  26. mapRef.current.addOverlay(marker);
  27. });
  28. };
  29. // 设置行政区划
  30. const getBoundary = () => {
  31. const bdary = new BMapGL.Boundary();
  32. bdary.get('东阳', (rs: any) => {
  33. // 获取行政区域
  34. const count = rs.boundaries.length; // 行政区域的点有多少个
  35. if (count === 0) {
  36. console.log('未能获取当前输入行政区域');
  37. return;
  38. }
  39. let pointArray: any[] = [];
  40. for (let i = 0; i < count; i += 1) {
  41. const ply = new BMapGL.Polygon(rs.boundaries[i], {
  42. strokeWeight: 2,
  43. strokeColor: '#ff0000',
  44. }); // 建立多边形覆盖物
  45. mapRef.current.addOverlay(ply); // 添加覆盖物
  46. pointArray = pointArray.concat(ply.getPath());
  47. }
  48. mapRef.current.setViewport(pointArray); // 调整视野
  49. });
  50. };
  51. const creatMap = () => {
  52. mapRef.current = new BMapGL.Map('my-map');
  53. mapRef.current.enableScrollWheelZoom(true);
  54. mapRef.current.centerAndZoom(new BMapGL.Point(120.325301, 29.159552), 16);
  55. // mapRef.current.setMapStyleV2({ styleJson }); // 设置地图主题 https://lbsyun.baidu.com/apiconsole/custommap
  56. creatMarker([
  57. {
  58. title: '标记一',
  59. icon: 'https://xxx.png',
  60. gps: [120.3202894172981, 29.1566923548061],
  61. },
  62. {
  63. title: '标记二',
  64. icon: 'https://xxx2.png',
  65. gps: [120.3202894177781, 29.1566966648061],
  66. },
  67. ]);
  68. // getBoundary();
  69. };
  70. useEffect(() => {
  71. creatMap();
  72. }, []);
  73. return <div id="my-map" style={{ width: 500, height: 500 }} />;
  74. };

方法

如何清除地图上的覆盖物?

清除地图上所有的标记,用 map.clearOverlays();
清除单个标注 iMarker,用 map.removeOverlay(iMarker);
显示和隐藏自定义覆盖物,可以继承 overlay 的 hide(); 或者 show() 方法。

  1. // 创建 Marker 标注
  2. const point = new BMapGL.Point(it.GPS[0], it.GPS[1]);
  3. const marker = new BMapGL.Marker(point, {
  4. icon: 'https://xxx.png',
  5. });
  6. // 隐藏、显示 marker
  7. marker.hide();
  8. marker.show();