场景:在项目开发中会遇到在map上绘制图层,一般想到的方法会是通过接口获取图层边界的所有点,由点生成polygons多边形面。polygons 多边形示例 数据过多地图会存在卡顿的问题。

目的:创建自定义图片图层,可以解决数据过多地图卡顿的问题并优化提高了性能。

目录

1、uniapp - map地图组件addGroundOverlay 创建实时更新自定义图片图层方法

2、高德地图web API  自定义图层 CustomLayer 自定义图层-图层- JS API v2.0 | 高德地图API

3、腾讯地图 API

4、百度地图 地面叠加层覆盖

1、uniapp - map地图组件addGroundOverlay 创建实时更新自定义图片图层方法

  • 配置 "requiredPrivateInfos" : [ "startLocationUpdate", "startLocationUpdateBackground", "getLocation",  "onLocationChange"  ],如图
  • uni.createMapContext(mapId,this);例:this.mapContext = uni.createMapContext("map",this)。
  • @regiοnchange="onRegionChange",视野发生变化时触发。
  • 通过this.mapContext.getRegion({success: res=>{}})获取当前地图的视野范围,接口调用成功的回调函数,res = {southwest, northeast},西南角与东北角的经纬度。
  • this.mapContext.addGroundOverlay(),创建自定义图片图层,图片会随着地图缩放而缩放。
  • this.mapContext.removeGroundOverlay(),移除上一个自定义图片图层。

效果图如下:

代码示例如下:

<template><view class="map-wrap"><mapid="map"ref="map"style="height: 100vh; width:100%;":latitude="map.latitude":longitude="map.longitude":polyline="polyline":scale="scale":show-location="true":enable-building="true":enable-3D="true"@regionchange="onRegionChange"></map></view>
</template><script>
export default {name: '',components: {},props: {optionInfo:{type: Object,default: () => {return {}}},Iconstyle:{type: Boolean,default:false}},data() {return {map: { //地图初始中心点latitude: "",longitude: ""},mapContext:null,gdtbLayerId: 0 // 耕地图斑图层ID};},created() {this.mapContext = uni.createMapContext("map",this);},mounted() {this.onRegionChange();},methods: {//监听移动 获取当前地图的视野范围onRegionChange(e){if (!e || e.type === "end") {this.mapContext.getRegion({success: res=>{this.loadGdtbLayerByRegion(res)}})}},// 根据经纬度加载当前屏幕范围内的耕地 loadGdtbLayerByRegion (region) {let northeast = region.northeastlet southwest = region.southwest//获取的图片坐标是wgs84,则需要将地图坐标gcj02转成wgs84的let wgs84Northeast = this.gcj02towgs84(northeast.longitude, northeast.latitude)let wgs84Southwest = this.gcj02towgs84(southwest.longitude, southwest.latitude)let bboxs = [wgs84Southwest[0],wgs84Southwest[1],wgs84Northeast[0],wgs84Northeast[1]];let hkb = ((bboxs[2] - bboxs [0]) / (bboxs[3] - bboxs[1])).toFixed(8)let size = [ 1200, Math.ceil(1200 / hkb) ]let oldGdtbLayerId = this.gdtbLayerIdthis.gdtbLayerId = this.gdtbLayerId + 1let layerParma = {id: this.gdtbLayerId, //图片图层 id//图片路径,支持网络图片、临时路径、代码包路径src: "",下面src地址是gis服务提供的,可通过 &bbox=" + bboxs.join(",") 动态获取图片地址,//src: config.arcgisurl + "/GDDLTB/MapServer/export?dpi=96&transparent=true&format=png8&bbox=" + bboxs.join(",") + "&bboxSR=4490&size=" + size.join(",") + "&imageSR=4490&f=image",visible: true,//是否可见zindex: 1,//图层绘制顺序opacity: 0.6, //图层透明度bounds: {//图片覆盖的经纬度范围northeast: northeast,//东北角经纬度southwest: southwest//西南角经纬度},success: res => {if (oldGdtbLayerId) {//移除上一个自定义图片图层this.mapContext.removeGroundOverlay({ id: oldGdtbLayerId })}},fail: err => {console.log("失败:", err)},}this.mapContext.addGroundOverlay(layerParma)},//经纬度坐标转换:gcj02转wgs84gcj02towgs84(lng, lat) {lat = parseFloat(lat)lng = parseFloat(lng)// 定义一些常量var PI = 3.1415926535897932384626var a = 6378245.0var ee = 0.00669342162296594323function transformlat(lng, lat) {var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng))ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0return ret}function transformlng(lng, lat) {var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng))ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0return ret}// 判断是否在国内,不在国内则不做偏移function out_of_china(lng, lat) {return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false)}if(out_of_china(lng, lat)) {return [lng, lat]} else {var dlat = transformlat(lng - 105.0, lat - 35.0)var dlng = transformlng(lng - 105.0, lat - 35.0)var radlat = lat / 180.0 * PIvar magic = Math.sin(radlat)magic = 1 - ee * magic * magicvar sqrtmagic = Math.sqrt(magic)dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI)dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI)var mglat = lat + dlatvar mglng = lng + dlngreturn [lng * 2 - mglng, lat * 2 - mglat]}}}
};
</script>

uniapp - map地图组件addGroundOverlay创建自定义图片图层方法:代码如上

  • uni.createMapContext(mapId,this);例:this.mapContext = uni.createMapContext("map",this)。
  • 去掉视野发生变化时触发,@regiοnchange="onRegionChange",在mounted中调用onRegionChange方法
  • 通过this.mapContext.getRegion({success: res=>{}})获取当前地图的视野范围,接口调用成功的回调函数,res = {southwest, northeast},西南角与东北角的经纬度。
  • this.mapContext.addGroundOverlay(),创建自定义图片图层,图片会随着地图缩放而缩放。
  • this.mapContext.removeGroundOverlay(),移除上一个自定义图片图层。

2、高德地图web API  自定义图层 CustomLayer 自定义图层-图层- JS API v2.0 | 高德地图API

示例代码:高德地图自定义图层-Canvas-示例中心-JS API 2.0 示例
var cLayer = new AMap.CustomLayer(canvas, {zooms: [2, 18],zIndex: 120,render() {// 对 canvas 进行绘制}
})

3、腾讯地图 API

用于创建自定义图片图层,图片会随着地图缩放而缩放。

 静态图贴地图层 | 代码示例

4、百度地图 地面叠加层覆盖物

SAPI GL提供的GroundOverlay类支持在地图底面上叠加覆盖物,覆盖物可以是图片、自定义Canvas、视频。
GroundOverlay类继承Overlay类,基于Bounds确定在地面上的显示范围和大小,通过options来配置覆盖物的类型、源、透明度等。

图片类型示例

  • 创建地图参照展示地图
  • 创建地面叠加层实例,并添加到地图上

    创建地面叠加层使用BMapGL.GroundOverlay类,其继承自Overlay,通过map.addoverlay()方法将创建的叠加层添加到地图上。

     // 创建叠加物显示的范围Boundsvar pStart = new BMapGL.Point(117.19635, 36.24093);var pEnd = new BMapGL.Point(117.20350, 36.24764);var bounds = new BMapGL.Bounds(new BMapGL.Point(pStart.lng, pEnd.lat), new BMapGL.Point(pEnd.lng, pStart.lat));// 创建地面叠加层实例var imgOverlay = new BMapGL.GroundOverlay(bounds, {type: 'image',url: '/jsdemo/img/shouhuimap.png',opacity: 1});// 叠加层添加到地图map.addOverlay(imgOverlay);

示例:地图JS API示例

其它几种api没有实践,仅供参考...​

Map创建自定义图片图层,图片会随着地图缩放而缩放,uniapp、高德、腾讯、百度相关推荐

  1. Android高德地图的自定义底图(午夜蓝主题风格地图)

    官网上介绍:地址链接 从 3D 地图 SDK V4.1.3版本开始支持自定义地图底图功能. 功能说明:支持对部分地图元素自定义颜色,包括:填充色.边框色.文字颜色. 先上图,我自己做出来的自定义地图( ...

  2. CALayer 知识:创建带阴影效果的圆角图片图层和创建自定义绘画内容图层

    效果如下: KMLayerDelegate.h 1 #import <UIKit/UIKit.h> 2 3 @interface KMLayerDelegate : NSObject 4 ...

  3. Magento2创建自定义Widget 并通过添加图片选择器插入图片

    为什么80%的码农都做不了架构师?>>>    创建自定义Widget 并通过添加图片选择器插入图片 自定义widget 先在模块的etc 配置文件中创建widget.xml配置文件 ...

  4. iOS--app自定义相册--创建相簿,存储图片到手机

    我们在APP中点击照片,都会显示出大图,然后在大图的上面会有个保存照片的按钮,照片直接保存到了系统的相册中,但是因为公司产品的需要,让你创建和APP同名的相册保存在里面,那么就对了,可以看下具体的代码 ...

  5. vue使用高德地图小demo(标记点,画线,3D,叠加图片图层)

    vue使用高德地图小demo(标记点,画线,3D) 这个模式是3D的,可以看到地图是带有一定的倾角的. 注意:3D模式下,是不能够将进行画线的,不能使用PathSimplifier,改成2D可以正常使 ...

  6. 如何制作手绘地图?如何将图片图层精确地对准在地图上?

    最近大家常常在问,如何制作鼓浪屿手绘地图,如何将气象图层叠加在高德地图上啊? 其实地图上的研发量很小,几行代码就可以搞定. 关键是在图片绘制上,有较高的要求. 下面就用简单粗暴的方法来实现,如有不妥之 ...

  7. cropper截图插件(自定义像素的图片并保存本地)

    效果展示 公司需要截取指定大小像素的广告图,并能保存本地,由于第一次使用cropper插件,编写该文.做好笔记!!! 功能:截图自定义大小的图片并保存本地,可以用来:制作头像,截取指定格式像素 cro ...

  8. 安卓自定义view中 绘画基本图形点线面,矩形,方形,圆,扇形,文字及沿着特定方向布局,自定义圆角ImageView图片等等相关api使用方法及举例

    安卓自定义view中 绘画基本图形点线面,矩形,方形,圆,扇形,文字及沿着特定方向布局,自定义圆角ImageView图片等等相关api使用方法及举例,图片压缩处理逻辑 本文旨在介绍自定义View的实现 ...

  9. 织梦自定义图片字段和缩略图一样_DedeCMS系统自定义字段的图片调用

    实现方法及步骤 1)创建自定义函数 打开 /include/extend.func.php 文件(注:这个文件就是织梦系统预留的自定义函数接口文件,主要用于二次开发用的.如果你是老版本,默认没有这个文 ...

最新文章

  1. 揭开并发包底层AQS的神秘面纱
  2. Rabbit的Windows安装
  3. JavaScript:动态选中CheckBox
  4. NOIP模拟测试14「旋转子段·走格子·柱状图」
  5. 小程序 Typescript 最佳实践
  6. Spring IOC核心原理分析
  7. 排列组合 “n个球放入m个盒子“里,再来一遍
  8. CentOS8 安装 telnet 命令
  9. java接口防抖_RxJava功能防抖
  10. android 应用软件注册与自动登录代码
  11. 经典的W2kXP添加删除硬件
  12. vue-baidu-map之地图的主题背景色设置
  13. idea导入子工程module
  14. Word UVA - 517 状态压缩 暴力搜索
  15. 农业虫害识别相关论文——调研整理
  16. 图片格式及其内存占用
  17. windows10 家庭版 Hyper-V 虚拟机服务开启与应用 (一)
  18. 计算机就业最好的专业排名,就业前景最好的15个专业排名,理工类专业占大头,前三都有谁?...
  19. nginx解决使用域名访问项目
  20. 政府网站群建设的要求

热门文章

  1. 计算机毕业设计Java汽车客运站票务管理系统(源码+系统+mysql数据库+lw文档)
  2. c语言五子棋怎么判断五子连珠,分享一个 五子棋 输赢 的 判断逻辑。C#脚本
  3. Java URL(一)——概念、构造
  4. 站长必备-一键推送快速收录工具
  5. FreeSWITCH学习笔记 第二场 第二个镜头 JsSIP视频通讯
  6. 武汉科技大学801电路考研真题
  7. the irrationals-a story of the numbers you can't count on
  8. html转markdown在线工具
  9. html中的disabled属性的使用方式
  10. Web自动化测试进阶