天地图绘制区域图层

2023-09-21 17:50:44

背景:

业务方要求将

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

变更点:

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

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

实现过程:

1.更换地图引入源

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

2.天地图基本配置-tk

3.实用方法封装

1)初始化地图方法封装

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

2)初始化底图

/**
 * 初始化底图
 */
export const initBaseLayer = () => {
  const baseLayer = new window.maptalks.TileLayer(mapLayers.baseLayer, {
    urlTemplate: TianDiTuTile,
    subdomains: ['1', '2', '3', '4', '5'],
    attribution:
      '&copy; <a target="_blank" href="http://www.tianditu.cn">Tianditu</a>'
  })
  window.maptalksMap.setBaseLayer(baseLayer)
}

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

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

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

/**
 * 设置半透明遮罩层mask
 */
export const initMaskPolygonLayer = () => {
  const maskPolygonLayer = new window.maptalks.VectorLayer(
    mapLayers.maskLayer
  )
  const geojson: any = maskGeoJSon.features[0].geometry
  const wgsJson = gcoord.transform(geojson, gcoord.GCJ02, gcoord.WGS84);
  const polygons = window.maptalks.GeoJSON.toGeometry(
    wgsJson,
    (geometry: any) => {
      geometry.setSymbol({
        lineColor: '#01e0f1',
        lineWidth: 4,
        lineOpacity: 0.4,
        polygonFill: '#014493',
        polygonOpacity: 0.3
      })
    }
  )
  maskPolygonLayer.addGeometry(polygons)
  maskPolygonLayer.addTo(window.maptalksMap)
}

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

/**
 * 设置覆盖物-嘉善轮廓
 */
export const initAreaPolygonLayer = () => {
  const areaPolygonLayer = new window.maptalks.VectorLayer(
    mapLayers.areaPolygonLayer
  )
  const polygons = window.maptalks.GeoJSON.toGeometry(
    jiashanGeoJSon,
    (geometry: any) => {
      geometry.setSymbol({
        lineColor: '#01e0f1',
        lineWidth: 4,
        lineOpacity: 1,
        polygonFill: '#0e4d96',
        polygonOpacity: 0.8
      })
    }
  )
  areaPolygonLayer.addGeometry(polygons)
  areaPolygonLayer.addTo(window.maptalksMap)
}

6)设置地名

/**
 * 设置地名
 */
export const initAreaNameLayer = () => {
  const areaNameLayer = new window.maptalks.VectorLayer(mapLayers.areaNameLayer)
  jiashanTownCenter.forEach(item => {
    new window.maptalks.Marker(item.position, {
      symbol: {
        textName: item.name,
        textSize: 20,
        textFill: '#ccc'
      }
    }).addTo(areaNameLayer)
  })
  areaNameLayer.addTo(window.maptalksMap)
}

4.应用

useEffect(() => {
    if (amapDomRef.current) {
      initMap(amapDomRef.current) // 初始化地图
      initBaseLayer() // 初始化底图
      initBaseMarkLayer() // 初始化底图的地点文字标记
      // initBackgroundLayer()
      initMaskPolygonLayer() // 设置半透明遮罩层mask
      initAreaPolygonLayer() // 设置覆盖物-区域(某地区)轮廓
      initAreaNameLayer() // 设置地名
      const data: any[] = getAllRealSchoolByMap().map(c => {
        return {
          name: c.title,
          position: c.position,
          status: c.checkStatus
        }
      })
      setCampusSecurySchoolMarkerToMap(data) // 业务数据点
    }
  }, [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/

更多推荐

【总结】javascript中的同步与异步

概念同步模式简单的理解就是后一个任务等待前一个任务的结束才能执行,程序的执行顺序与任务的排列顺序是一致的、同步的;同步任务进入主线程异步模式异步的每一个任务有一个或多个回调函数,前一个任务执行结束后,并不会执行后一个任务,而是执行它的回调函数。而后一个任务不会等待前一个任务结束才执行,所以程序的执行顺序与任务的排列顺序

【Java 基础篇】Java线程异常处理详解

在多线程编程中,异常处理是一个至关重要的方面,它决定了你的多线程应用程序的稳定性和可靠性。在本篇博客中,我们将深入探讨Java中的线程异常处理,包括线程抛出的异常类型、如何捕获和处理异常以及最佳实践。异常类型在多线程应用中,线程可能会抛出不同类型的异常。了解这些异常的类型对于有效的异常处理至关重要。以下是一些常见的线程

C/C++简单计算器 2019年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录C/C++简单计算器一、题目要求1、编程实现2、输入输出二、解题思路1、案例分析三、程序代码四、程序说明五、运行结果六、考点分析C/C++简单计算器2019年12月C/C++编程等级考试一级编程题一、题目要求1、编程实现一个最简单的计算器,支持+,-,,/四种运算。仅需考虑输入输出为整数的情况,数据和运算结果不会超

森林防火可视化智能监管与风险预警系统解决方案

一、方案背景森林火灾是世界八大自然灾害之一,具有发生面广、突发性强、破坏性大、危险性高、处置扑救特别困难等特点,严重危及人民生命财产和森林资源安全,甚至引发生态灾难。有效预防和及时控制森林火灾是保护国家生态建设成果、推进生态文明建设的重要措施。监管痛点:1)现有的森林防火监测系统落后,以人工地面巡护、瞭望塔高点巡查为主

Mysql基本命令操作

Mysql基本命令操作一、基本概念1.1、数据库分类1.1.1、关系型数据库(二代数据库)1.1.2、非关系型数据库(三代数据库)1.2、库和表1.3、SQL语句1.3.1、SQL语言分类1.3.2、常用数据类型二、查看数据库2.1、查看mysql版本2.2、查看数据库2.3、查看数据库中包含的表2.4、查看表结构三、

驱动开发 linux内核GPIO子系统、及其新版API的概念和使用,linux内核定时器

1、GPIO子系统概述:每一个芯片厂商生产出芯片后会给linux提供一个当前芯片中gpio外设的驱动,我们只需要调用对应的厂商驱动就可以完成硬件的控制。而linux内核源码中的gpio厂商驱动有很多,linux内核个会对厂商驱动做一些封装,会提供一系列的API,我们在自己编写设备驱动中只需要调用这些API即可访问对应厂

【微服务】六. Nacos配置管理

6.1Nacos实现配置管理配置更改热更新在nacos左侧新建配置管理DataID:就是配置文件名称一般命名规则:服务名称-环境名称.yaml配置内容填写:需要热更新需求的配置配置文件的id:[服务名称]-[profile].[后缀名]分组,默认即可格式,目前支持yaml和properties6.2微服务配置拉取配置获

iOS应用闪退或崩溃的解决方法

iOS应用的闪退(Crash)通常是应用在运行过程中发生了异常或错误,导致应用崩溃的情况。解决iOS应用的闪退问题需要一些工具和方法,以下是一些建议,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。1.使用Xcode进行调试:Xcode是苹果官方的开发工具,提供了强大的调试功能。你可

专访西藏药业CEO郭远东:数字化转型核心是驱动业务战略实现丨爱分析访谈

[图片]近日,爱分析联合创始人、首席分析师张扬与西藏药业CEO郭远东进行了一次深度对话,就西藏药业整体数字化规划布局、数字化转型过程中面临的痛点及落地实践展开交流。爱分析将通过对各家医药企业数字化转型的探讨和洞悉,为行业提供更多的借鉴。创始于1999年的西藏药业,已成长为产品涵盖生物制药、现代藏药、中药和化学药领域,业

Jetpack:在数据变化时如何优雅更新Views数据

本文讲的是关于Jetpack的架构组件LiveData,LiveData是Lifecycle-aware组件的一个应用,这意味着LiveData遵守Activity、Fragment和Service等组件的生命周期,在它们生命周期处于活跃状态(CREATED和RESUMED)才进行更新Views。使用LiveData步

Smart UI Web 16.0.1 WebComponents htmlelements Crack

JavascriptWeb组件库SmartUIWeb组件库是您构建令人惊叹的Web应用程序所需的唯一套件。它包含70多个快速且专业设计的UI组件,可在单个包中实现美观且始终现代的Web应用程序。具有高级功能的即用型Javascript组件。只需几行代码即可使用数据网格、甘特图、调度程序等复杂组件。Smart是一个基于J

热文推荐