• 天地图绘制区域图层


    背景:

    业务方要求将

    原效果图
    原效果图
    参考效果图
    最终实现效果

    变更点:

    1.将原有的高德地图改为天地图

    2.呈现形式修改:加两层遮罩:半透明遮罩层mask+区域覆盖物mask

    实现过程:

    1.更换地图引入源

    1. "stylesheet" href="https://cdn.jsdelivr.net/npm/maptalks/dist/maptalks.css" />
    2. <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/maptalks/dist/maptalks.min.js">script>

    2.天地图基本配置-tk

    3.实用方法封装

    1)初始化地图方法封装

    1. /**
    2. * 初始化地图
    3. */
    4. export const initMap = (dom: any) => {
    5. window.maptalksMap = new window.maptalks.Map(dom, mapOptions)
    6. }

    2)初始化底图

    1. /**
    2. * 初始化底图
    3. */
    4. export const initBaseLayer = () => {
    5. const baseLayer = new window.maptalks.TileLayer(mapLayers.baseLayer, {
    6. urlTemplate: TianDiTuTile,
    7. subdomains: ['1', '2', '3', '4', '5'],
    8. attribution:
    9. Tianditu'
    10. })
    11. window.maptalksMap.setBaseLayer(baseLayer)
    12. }

    3)初始化底图的地点文字标记

    1. /**
    2. * 初始化底图的地点文字标记
    3. */
    4. export const initBaseMarkLayer = () => {
    5. const baseMarkLayer = new window.maptalks.TileLayer(mapLayers.baseMarkLayer, {
    6. urlTemplate: TianDiTuMark,
    7. subdomains: ['1', '2', '3', '4', '5']
    8. })
    9. baseMarkLayer.addTo(window.maptalksMap)
    10. }

    4)设置半透明遮罩层mask,其中,maskGeoJSon为导出的高德数据

    1. /**
    2. * 设置半透明遮罩层mask
    3. */
    4. export const initMaskPolygonLayer = () => {
    5. const maskPolygonLayer = new window.maptalks.VectorLayer(
    6. mapLayers.maskLayer
    7. )
    8. const geojson: any = maskGeoJSon.features[0].geometry
    9. const wgsJson = gcoord.transform(geojson, gcoord.GCJ02, gcoord.WGS84);
    10. const polygons = window.maptalks.GeoJSON.toGeometry(
    11. wgsJson,
    12. (geometry: any) => {
    13. geometry.setSymbol({
    14. lineColor: '#01e0f1',
    15. lineWidth: 4,
    16. lineOpacity: 0.4,
    17. polygonFill: '#014493',
    18. polygonOpacity: 0.3
    19. })
    20. }
    21. )
    22. maskPolygonLayer.addGeometry(polygons)
    23. maskPolygonLayer.addTo(window.maptalksMap)
    24. }

    5)设置覆盖物-某区域轮廓

    1. /**
    2. * 设置覆盖物-嘉善轮廓
    3. */
    4. export const initAreaPolygonLayer = () => {
    5. const areaPolygonLayer = new window.maptalks.VectorLayer(
    6. mapLayers.areaPolygonLayer
    7. )
    8. const polygons = window.maptalks.GeoJSON.toGeometry(
    9. jiashanGeoJSon,
    10. (geometry: any) => {
    11. geometry.setSymbol({
    12. lineColor: '#01e0f1',
    13. lineWidth: 4,
    14. lineOpacity: 1,
    15. polygonFill: '#0e4d96',
    16. polygonOpacity: 0.8
    17. })
    18. }
    19. )
    20. areaPolygonLayer.addGeometry(polygons)
    21. areaPolygonLayer.addTo(window.maptalksMap)
    22. }

    6)设置地名

    1. /**
    2. * 设置地名
    3. */
    4. export const initAreaNameLayer = () => {
    5. const areaNameLayer = new window.maptalks.VectorLayer(mapLayers.areaNameLayer)
    6. jiashanTownCenter.forEach(item => {
    7. new window.maptalks.Marker(item.position, {
    8. symbol: {
    9. textName: item.name,
    10. textSize: 20,
    11. textFill: '#ccc'
    12. }
    13. }).addTo(areaNameLayer)
    14. })
    15. areaNameLayer.addTo(window.maptalksMap)
    16. }

    4.应用

    1. useEffect(() => {
    2. if (amapDomRef.current) {
    3. initMap(amapDomRef.current) // 初始化地图
    4. initBaseLayer() // 初始化底图
    5. initBaseMarkLayer() // 初始化底图的地点文字标记
    6. // initBackgroundLayer()
    7. initMaskPolygonLayer() // 设置半透明遮罩层mask
    8. initAreaPolygonLayer() // 设置覆盖物-区域(某地区)轮廓
    9. initAreaNameLayer() // 设置地名
    10. const data: any[] = getAllRealSchoolByMap().map(c => {
    11. return {
    12. name: c.title,
    13. position: c.position,
    14. status: c.checkStatus
    15. }
    16. })
    17. setCampusSecurySchoolMarkerToMap(data) // 业务数据点
    18. }
    19. }, [amapDomRef])

    运行效果:不理想,出现了白色间隙,后面找出原因是因为高德地图和天地图不是同个坐标系(因为高德地图是火星坐标,而天地图是wgs84墨卡托4490),所以从高德地图上拉取的数据在天地图上不能完全适配,就出现了这样的间隙。

    高德:火星坐标

    天地图:wgs84墨卡托4490

    解决方案:用gcoord进行坐标转换,参考文章:高德地图更换天地图底图(坐标转换)—使用高德API(WMTS)_高德经纬度转天地图经纬度_❄️文宸er的博客-CSDN博客

    const wgsJson = gcoord.transform(geojson, gcoord.GCJ02, gcoord.WGS84);

    最后,附上接口文档

    MapTalks手册:https://doc.maptalks.com/docs/style/symbols/

  • 相关阅读:
    SpringBoot 实现数据脱敏
    Docker 入门流程
    【数据结构】二叉树 二叉树的深度优先遍历和广度优先遍历 完全二叉树和满二叉树的性质 二叉树的节点个数以及叶子节点个数
    @EqualsAndHashCode注解!!!
    笔试选择题-图
    Vue3 - this 概念及使用方法(详细教程)
    java计算机毕业设计高校社团管理系统MyBatis+系统+LW文档+源码+调试部署
    安卓机型系统美化 Color.xml文件必备常识 自定义颜色资源
    go慢速入门——函数
    java构造函数的简介说明
  • 原文地址:https://blog.csdn.net/MingleHDU/article/details/133139455