翼度科技»论坛 编程开发 JavaScript 查看内容

js高德地图添加点Marker,添加线段Polyline,添加一个区域Polygon(面)

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
高德地图JS API 实例  亲测可用

参考网站=> 阿里云数据可视化平台(下载json用的):http://datav.aliyun.com/portal/school/atlas/area_selector?spm=a2crr.23498931.0.0.685915dd8QQdlv
1.渲染地图

  1.   const [initDataMap, setInitDataMap] = useState({
  2.     centerCity: '拱墅区',
  3.     defaultZoom: 12,
  4.     centerPoint: { lng: 120.165533, lat: 30.329062 },
  5.   });  
  6.   //初始化地图
  7.   const initMap = () => {
  8.     const { centerPoint } = initDataMap;
  9.     const center = [centerPoint.lng, centerPoint.lat];
  10.     const mzooms = [8, 19];
  11.     const mzoom = 12;
  12.     let map = new AMap.Map("AMapBox", {
  13.       zoom: mzoom, //初始化地图层级
  14.       zooms: mzooms,
  15.       rotateEnable: false, // 固定视角
  16.       disableSocket: true,
  17.       center: center,
  18.     });
  19.     mapRef.current = map;
  20.     addAreaCoordinate(map); // 这个是渲染块
  21.   };
复制代码
2.绘制Marker标记点
  1.   // 绘制点
  2.   const drawMarker = (data: any, map: any) => {
  3.     const infoWindow = new AMap.InfoWindow({
  4.       offset: new AMap.Pixel(5, -30),
  5.       autoMove: true,
  6.       closeWhenClickMap: true,
  7.     });
  8.     let ap: any = []
  9.     data.forEach((item: any) => {
  10.       if (item.lat && item.lng) {
  11.         const ad = [item.lng, item.lat];
  12.         const marker = new AMap.Marker({
  13.           position: ad,
  14.           icon: iconIMg, // 自己的icon
  15.           map: map
  16.         });
  17.         ap.push(marker);
  18.         setMarkerList(ap);
  19.         const content = item.projectName;
  20.         marker.on('click', () => {
  21.           infoWindow.setContent(content);
  22.           infoWindow.open(map, ad);
  23.         });
  24.       }
  25.     });
  26.     map.setFitView();
  27.   }
复制代码
3.绘制线段Polyline
  1.   // 绘制线段
  2.   const polylineInit = (lineArr: any, map: any, callBack: any) => {
  3.     const infoWindowLine = new AMap.InfoWindow({
  4.       offset: new AMap.Pixel(5, -30),
  5.       autoMove: true,
  6.       closeWhenClickMap: true,
  7.     });
  8.     const polyline = new AMap.Polyline({
  9.       path: lineArr.list,          //设置线覆盖物路径
  10.       strokeColor: "#3366FF", //线颜色
  11.       strokeOpacity: 1,       //线透明度
  12.       strokeWeight: 5,        //线宽
  13.       strokeStyle: "solid",   //线样式
  14.       strokeDasharray: [10, 5] //补充线样式
  15.     });
  16.     polyline.setMap(map);
  17.     callBack(polyline);
  18.     const content = `
  19.       
  20.         ${lineArr.roadName}
  21.         所属国企:${lineArr.belongCorpName}
  22.         当前进度:${lineArr.currentStatusStr}
  23.         <a onclick="handleClickDetail(${lineArr.id})">查看详情信息</a>
  24.       
  25.     `
  26.     if (callBackDetail) {
  27.       polyline.on('click', (e: any) => {
  28.         infoWindowLine.setContent(content);
  29.         infoWindowLine.open(map, e.lnglat);
  30.       });
  31.     }
  32.   }
  33.   // 处理绘制线段  可不看嘎嘎···
  34.   const dealPolylineInit = (arr: any, map: any) => {
  35.     // map.clearMap();
  36.     map.remove(polylineList);
  37.     let ad: any = [];
  38.     arr.forEach((item: any) => {
  39.       const st = JSON.parse(item.locationMark);
  40.       st.forEach((element: any) => {
  41.         element.forEach((ele: any) => {
  42.           ele.roadName = item.roadName;
  43.           ele.belongCorpName = item.belongCorpName;
  44.           ele.currentStatusStr = item.currentStatusStr;
  45.           ele.id = item.roadId;
  46.         });
  47.       });
  48.       ad.push(st);
  49.     });
  50.     const flatArr = ad.flat();
  51.     const cloneDeepData = cloneDeep(flatArr);
  52.     const opd: any = [];
  53.     cloneDeepData.forEach((item: any) => {
  54.       let lineArr: any = [];
  55.       const obj: any = {};
  56.       item.forEach((element: any) => {
  57.         const ad = [element.lng, element.lat];
  58.         obj.roadName = element.roadName;
  59.         obj.belongCorpName = element.belongCorpName;
  60.         obj.currentStatusStr = element.currentStatusStr;
  61.         obj.id = element.id
  62.         lineArr.push(ad);
  63.       });
  64.       obj.list = lineArr;
  65.       polylineInit(obj, map, (v: any) => {
  66.         opd.push(v)
  67.       });
  68.     })
  69.     setPolylineList(opd)
  70.   }
复制代码
4.绘制区域Polygon
  1.   const addAreaCoordinate = (map: any) => {
  2.     const obj = gs_json || '';
  3.     const points: any[] = [];
  4.     obj?.features[0]?.geometry?.coordinates[0][0].map((item: any) => {
  5.       points.push(new AMap.LngLat(item[0], item[1]));
  6.     });
  7.     const polygon = new AMap.Polygon({
  8.       path: points,
  9.       color: '#1CB9FF',
  10.       weight: 3,
  11.       opacity: 0.5,
  12.       fillColor: '#1CB9FF',
  13.       fillOpacity: 0.05,
  14.     });
  15.     map.add(polygon);
  16.     map.setFitView(polygon);//视口自适应
  17.   }
复制代码
5.完整的代码------(react写的,但不影响cv)
  1. import React, { useRef, forwardRef, useImperativeHandle, useEffect, useState } from 'react';//antd// 第三方组件//@ts-ignoreimport AMap from 'AMap';import { cloneDeep } from 'lodash';import gs_json from '@/assets/json/gongshu.json'; // 地图区域的json数据import iconIMg from '@/assets/productizationimg/local.png'const AMapModal = forwardRef((props: any, ref: any) => {  const { roadMapData, projectMapData, isShowLanLat, callBackDetail } = props;  const mapRef = useRef();  const [markerList, setMarkerList] = useState([]);  const [polylineList, setPolylineList] = useState([]);  const [initDataMap, setInitDataMap] = useState({    centerCity: '拱墅区',    defaultZoom: 12,    centerPoint: { lng: 120.165533, lat: 30.329062 },  });  //@ts-ignore  window.document.handleClickDetail = function (id: any) {    if (callBackDetail) {      callBackDetail(id);    }  };  // 根据levelCode向地图中画一个区域轮廓  const addAreaCoordinate = (map: any) => {
  2.     const obj = gs_json || '';
  3.     const points: any[] = [];
  4.     obj?.features[0]?.geometry?.coordinates[0][0].map((item: any) => {
  5.       points.push(new AMap.LngLat(item[0], item[1]));
  6.     });
  7.     const polygon = new AMap.Polygon({
  8.       path: points,
  9.       color: '#1CB9FF',
  10.       weight: 3,
  11.       opacity: 0.5,
  12.       fillColor: '#1CB9FF',
  13.       fillOpacity: 0.05,
  14.     });
  15.     map.add(polygon);
  16.     map.setFitView(polygon);//视口自适应
  17.   }  // 绘制点  const drawMarker = (data: any, map: any) => {    const infoWindow = new AMap.InfoWindow({      offset: new AMap.Pixel(5, -30),      autoMove: true,      closeWhenClickMap: true,    });    let ap: any = []    data.forEach((item: any) => {      if (item.lat && item.lng) {        const ad = [item.lng, item.lat];        const marker = new AMap.Marker({          position: ad,          icon: iconIMg,          map: map        });        ap.push(marker);        setMarkerList(ap);        const content = item.projectName;        marker.on('click', () => {          infoWindow.setContent(content);          infoWindow.open(map, ad);        });      }    });    map.setFitView();  }  // 绘制线段  const polylineInit = (lineArr: any, map: any, callBack: any) => {    const infoWindowLine = new AMap.InfoWindow({      offset: new AMap.Pixel(5, -30),      autoMove: true,      closeWhenClickMap: true,    });    const polyline = new AMap.Polyline({      path: lineArr.list,          //设置线覆盖物路径      strokeColor: "#3366FF", //线颜色      strokeOpacity: 1,       //线透明度      strokeWeight: 5,        //线宽      strokeStyle: "solid",   //线样式      strokeDasharray: [10, 5] //补充线样式    });    polyline.setMap(map);    callBack(polyline);    const content = `              ${lineArr.roadName}        所属国企:${lineArr.belongCorpName}        当前进度:${lineArr.currentStatusStr}        [url=http://bbs.itdo.tech/]查看详情信息[/url]          `    if (callBackDetail) {      polyline.on('click', (e: any) => {        infoWindowLine.setContent(content);        infoWindowLine.open(map, e.lnglat);      });    }  }  // 处理绘制线段  const dealPolylineInit = (arr: any, map: any) => {    // map.clearMap();    map.remove(polylineList); // 清除线段的    let ad: any = [];    arr.forEach((item: any) => {      const st = JSON.parse(item.locationMark);      st.forEach((element: any) => {        element.forEach((ele: any) => {          ele.roadName = item.roadName;          ele.belongCorpName = item.belongCorpName;          ele.currentStatusStr = item.currentStatusStr;          ele.id = item.roadId;        });      });      ad.push(st);    });    const flatArr = ad.flat();    const cloneDeepData = cloneDeep(flatArr);    const opd: any = [];    cloneDeepData.forEach((item: any) => {      let lineArr: any = [];      const obj: any = {};      item.forEach((element: any) => {        const ad = [element.lng, element.lat];        obj.roadName = element.roadName;        obj.belongCorpName = element.belongCorpName;        obj.currentStatusStr = element.currentStatusStr;        obj.id = element.id        lineArr.push(ad);      });      obj.list = lineArr;      polylineInit(obj, map, (v: any) => {        opd.push(v)      });    })    setPolylineList(opd)  }  const initMap = () => {    const { centerPoint } = initDataMap;    const center = [centerPoint.lng, centerPoint.lat];    const mzooms = [8, 19];    const mzoom = 12;    let map = new AMap.Map("AMapBox", {      zoom: mzoom, //初始化地图层级      zooms: mzooms,      rotateEnable: false, // 固定视角      disableSocket: true,      center: center,    });    mapRef.current = map;    addAreaCoordinate(map);  };  useEffect(() => {    initMap();  }, []);  // 地图道路线更新  useEffect(() => {    dealPolylineInit(roadMapData, mapRef.current);  }, [roadMapData]);  // 地图点更新  useEffect(() => {    if (isShowLanLat == 1) {      drawMarker(projectMapData, mapRef.current);    } else {      if (mapRef.current) {        mapRef.current.remove(markerList);// 清除markerList点位      }    }  }, [isShowLanLat, projectMapData]);  return (                );})export default AMapModal
复制代码
 

来源:https://www.cnblogs.com/dreamtt/p/17173262.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具