page.tsx 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. "use client";
  2. import React, {useEffect, useRef, useState} from 'react';
  3. import './BaiduMapPage.css';
  4. import dataJson from './index.json';
  5. import markerData from './markerData.json';
  6. import fameng from '../../../../public/fameng.png';
  7. import shuifa from '../../../../public/shuifa.png';
  8. import deom1 from '../../../../public/deom1.png';
  9. import deom2 from '../../../../public/deom2.png';
  10. import Uptow from '../../../../public/up-two.png';
  11. const BaiduMapPage = () => {
  12. const mapRef = useRef(null);
  13. const [map, setMap] = useState(null);
  14. var lineLayer = null;
  15. var icon1 = deom1.src;
  16. var icon2 = deom2.src;
  17. var upTwo = Uptow.src;
  18. // 初始化地图
  19. useEffect(() => {
  20. // 检查是否已加载百度地图 GL JS API
  21. if (!window.BMapGL) {
  22. // 动态加载百度地图 GL JS API
  23. const script = document.createElement('script');
  24. script.src = `https://api.map.baidu.com/api?v=2.0&ak=jWDCUpsk33htQsF6IEwk4ctkERTOFFH0&type=webgl`;
  25. script.async = true;
  26. document.head.appendChild(script);
  27. window.initMap = () => {
  28. initializeMap();
  29. };
  30. } else {
  31. initializeMap();
  32. }
  33. return () => {
  34. // 清理工作
  35. if (map) {
  36. map.destroy();
  37. }
  38. };
  39. }, []);
  40. const initializeMap = () => {
  41. // 创建地图实例
  42. const mapInstance = new window.BMapGL.Map(mapRef.current);
  43. // 设置中心点坐标(北京)
  44. const point = new window.BMapGL.Point(110.39573035064166, 28.44628067667752);
  45. mapInstance.centerAndZoom(point, 16);
  46. // 启用滚轮放大缩小
  47. mapInstance.enableScrollWheelZoom(true);
  48. // 添加控件
  49. // mapInstance.addControl(new window.BMapGL.NavigationControl());
  50. // mapInstance.addControl(new window.BMapGL.ScaleControl());
  51. // mapInstance.addControl(new window.BMapGL.OverviewMapControl());
  52. // mapInstance.addControl(new window.BMapGL.MapTypeControl());
  53. mapInstance.setMinZoom(16);
  54. mapInstance.setMaxZoom(19);
  55. mapInstance.setMapStyleV2({
  56. styleId: '62ce43ad2a1362c23e612b783d7406e7'
  57. });
  58. markerData.list.dataOne.forEach(item => {
  59. const icon = new window.BMapGL.Icon(fameng.src, new window.BMapGL.Size(23, 25), {
  60. anchor: new window.BMapGL.Size(10, 25),
  61. });
  62. const markers = new window.BMapGL.Point(item.lng, item.lat);
  63. const marker = new window.BMapGL.Marker(markers,{
  64. icon:icon
  65. });
  66. mapInstance.addOverlay(marker);
  67. // 创建信息窗口
  68. let opts = {
  69. width: 300,
  70. title: item.name
  71. };
  72. let infoWindow = new window.BMapGL.InfoWindow("倾斜角度:" + '188deg' + "<br/>" +
  73. "状态:" + '正常运行' + "<br/>" +
  74. "信噪比:" + '16db' + "<br/>" +
  75. "负责人:" + '张三' + "<br/>" +
  76. "联系方式:" + '121234564', opts);
  77. // 点标记添加点击事件
  78. marker.addEventListener('click', function() {
  79. mapInstance.openInfoWindow(infoWindow, markers); // 开启信息窗口
  80. });
  81. })
  82. markerData.list.dataTwo.forEach(item => {
  83. const icon = new window.BMapGL.Icon(shuifa.src, new window.BMapGL.Size(23, 25), {
  84. anchor: new window.BMapGL.Size(20, 0),
  85. });
  86. const markers = new window.BMapGL.Point(item.lng, item.lat);
  87. const marker = new window.BMapGL.Marker(markers,{
  88. icon:icon
  89. });
  90. mapInstance.addOverlay(marker);
  91. // 创建信息窗口
  92. let opts = {
  93. width: 300,
  94. title: item.name
  95. };
  96. let infoWindow = new window.BMapGL.InfoWindow("倾斜角度:" + '188deg' + "<br/>" +
  97. "状态:" + '正常运行' + "<br/>" +
  98. "信噪比:" + '16db' + "<br/>" +
  99. "负责人:" + '张三' + "<br/>" +
  100. "联系方式:" + '121234564', opts);
  101. // 点标记添加点击事件
  102. marker.addEventListener('click', function() {
  103. mapInstance.openInfoWindow(infoWindow, markers); // 开启信息窗口
  104. });
  105. })
  106. if (!lineLayer) {
  107. lineLayer = new window.BMapGL.LineLayer({
  108. enablePicked: true,
  109. autoSelect: true,
  110. pickWidth: 30,
  111. pickHeight: 30,
  112. opacity: 1,
  113. selectedColor: 'blue', // 选中项颜色
  114. style: {
  115. sequence: false, // 是否采用间隔填充纹理,默认false
  116. marginLength: 18, // 间隔距离,默认16,单位像素
  117. // borderColor: '#999',
  118. borderMask: true, // 是否受内部填充区域掩膜,默认true,如果存在borderWeight小于0,则自动切换false
  119. // borderWeight: ['match', ['get', 'name'], 'demo1', 2, 0], // 描边宽度,可以设置负值
  120. strokeWeight: 10, // 描边线宽度,默认0
  121. strokeLineJoin: 'round',//描边线连接处类型, 可选'miter', 'round', 'bevel'
  122. strokeLineCap: 'round',// 描边线端头类型,可选'round', 'butt', 'square',默认round
  123. // 填充纹理图片地址,默认是空。图片需要是竖向表达,在填充时会自动横向处理。
  124. strokeTextureUrl: ['match', ['get', 'name'], 'demo1', icon1, 'demo2', icon2, upTwo],
  125. }
  126. });
  127. }
  128. lineLayer.setData(dataJson);
  129. mapInstance.addNormalLayer(lineLayer);
  130. setMap(mapInstance);
  131. // 添加点击地图事件
  132. mapInstance.addEventListener('click', (e) => {
  133. console.log('点击位置经纬度:', e.latlng.lng, e.latlng.lat);
  134. });
  135. };
  136. return (
  137. <div className="baidu-map-page" style={{margin:'-32px -40px -32px -40px'}}>
  138. <div className="map-container">
  139. <div ref={mapRef} className="map-content"></div>
  140. </div>
  141. </div>
  142. );
  143. };
  144. export default BaiduMapPage;