vue前端开发仿钉图系列(3)右侧画点线面的开发详解
项目开发是完全仿照钉图的功能,参照钉图的逻辑和高德地图的参考手册以及aip文档,一点点的把功能做出来并呈现最后的效果。选中画点,在地图上获取经纬度并进行反地理编码,添加marker并弹出右侧编辑页面,选择绑定所属图层,获取相应的动态标签列表,最后保存数据到数据列表。整理总结不易,如需全部代码,请联系我15098950589(微信同号)。和以往一样,先上一下效果图。

点线面工具的核心代码
that.mouseTool = new AMap.MouseTool(that.map);
//监听draw事件可获取画好的覆盖物
that.overlays = [];
that.mouseTool.on('draw', function(e) {
that.overlays.push(e.obj);
console.log('绘图信息', e.obj)
let poly = e.obj // 绘制完多边形实力对象
console.log('绘制图形顶点信息列表--------> ', poly.getOptions())
console.log('绘制图形的自定义属性--------> ', poly.getOptions().path)
that.isFromEdit = false;
//折线
if (that.layerType === 1) {
//实例化折线对象
let polyline = new AMap.Polyline({
map: that.map, //初始化的地图变量
path: poly.getOptions()
.path //折线的存放数组,很重中。一般是好多经纬度组成的数组。
});
that.lineLength = parseFloat(polyline.getLength(false) / 1000)
.toFixed(2) + ''
that.lineMarkers = poly.getOptions().path;
console.log('折线长度', that.lineLength)
}
//面
else if (that.layerType === 2) {
//实例化面对象
let polygon = new AMap.Polygon({
map: that.map, //初始化的地图变量
path: poly.getOptions()
.path //面的存放数组,很重中。一般是好多经纬度组成的数组。
});
that.surArea = parseFloat(polygon.getArea(false) / 1000000)
.toFixed(2) + ''
that.polygonMarkers = poly.getOptions().path;
console.log('面积', that.surArea, poly.getOptions().path)
}
})
var radios = document.getElementsByName('func');
for (let i = 0; i < radios.length; i += 1) {
radios[i].onchange = function(e) {
console.log('点击我了', e.target.value)
that.operatetype = e.target.value
that.isFromEdit = false;
that.isEditedEnabled = true;
//点停止距离和面积,线绘制距离,面显示面积
if (e.target.value === 'marker') {
that.draw(e.target.value)
} else if (e.target.value === 'polyline') {
that.rageAndMeasureDraw('rule')
} else {
that.rageAndMeasureDraw('measureArea')
}
}
}
//this.draw('marker')
//获取当前选中点的经纬度信息
const geocoder = new AMap.Geocoder({
city: '全国'
});
console.log('地图对象')
console.log('地图对象', that.map)
//为地图注册click事件获取鼠标点击出的经纬度坐标
that.map.on('click', function(e) {
if (!that.isEditedEnabled) {
return;
}
//反地理编码
geocoder.getAddress([e.lnglat.getLng(), e.lnglat.getLat()], function(
status,
result) {
if (status === 'complete' && result.regeocode) {
that.locationAddress = result.regeocode
.formattedAddress;
that.lng = e.lnglat.getLng()
that.lat = e.lnglat.getLat()
console.log('位置信息', e.lnglat.getLng(), e.lnglat
.getLat(), that
.locationAddress, that.overlays)
//只在画点的时候,单击弹出右侧编辑框,其他情况在双击结束的时候弹出编辑框
if (that.operatetype === 'marker') {
console.log('显示右侧列表')
//画点
that.layerType = 0;
//显示右侧编辑列表,并关闭绘图工具
that.rightEditVisible = true;
that.isFromEdit = false;
setTimeout(() => {
that.$refs.rightEdit.initData();
}, 1)
} else if (that.operatetype === 'polyline') {
that.layerType = 1;
} else if (that.operatetype === 'polygon') {
that.layerType = 2;
}
} else {
log.error('根据经纬度查询地址失败')
}
});
});
//关闭绘图工具
closeMouseToulDraw() {
this.mouseTool.close(true)
this.isEditedEnabled = false;
var radios = document.getElementsByName('func');
for (var i = 0; i < radios.length; i += 1) {
radios[i].checked = false;
}
setTimeout(() => {
this.$refs.dataList.initData()
this.$refs.layerList.initData()
}, 1)
this.map.remove(this.overlays)
this.overlays = [];
this.map.clearMap();
},
//关闭绘图工具
closeMouseToul() {
this.mouseTool.close(false)
var radios = document.getElementsByName('func');
for (var i = 0; i < radios.length; i += 1) {
radios[i].checked = false;
}
},
//使用MouseTool封装了RagingTool的测距功能,同时提供了 measureArea 面积测量功能
rageAndMeasureDraw(type) {
switch (type) {
case 'rule': {
this.mouseTool.rule({
startMarkerOptions: { //可缺省
icon: new AMap.Icon({
size: new AMap.Size(19, 31), //图标大小
imageSize: new AMap.Size(19, 31),
image: "//webapi.amap.com/theme/v1.3/markers/b/start.png"
}),
offset: new AMap.Pixel(-9, -31)
},
endMarkerOptions: { //可缺省
icon: new AMap.Icon({
size: new AMap.Size(19, 31), //图标大小
imageSize: new AMap.Size(19, 31),
image: "//webapi.amap.com/theme/v1.3/markers/b/end.png"
}),
offset: new AMap.Pixel(-9, -31)
},
midMarkerOptions: { //可缺省
icon: new AMap.Icon({
size: new AMap.Size(19, 31), //图标大小
imageSize: new AMap.Size(19, 31),
image: "//webapi.amap.com/theme/v1.3/markers/b/mid.png"
}),
offset: new AMap.Pixel(-9, -31)
},
lineOptions: { //可缺省
strokeStyle: "solid",
strokeColor: "#FF33FF",
strokeOpacity: 1,
strokeWeight: 2
}
//同 RangingTool 的 自定义 设置,缺省为默认样式
});
break;
}
case 'measureArea': {
this.mouseTool.measureArea({
strokeColor: '#80d8ff',
fillColor: '#80d8ff',
fillOpacity: 0.3
//同 Polygon 的 Option 设置
});
break;
}
}
},
draw(type) {
switch (type) {
case 'marker': {
this.mouseTool.marker({
//同Marker的Option设置
});
break;
}
case 'polyline': {
this.mouseTool.polyline({
strokeColor: '#80d8ff'
//同Polyline的Option设置
});
break;
}
case 'polygon': {
this.mouseTool.polygon({
fillColor: '#00b0ff',
strokeColor: '#80d8ff'
//同Polygon的Option设置
});
break;
}
case 'rectangle': {
this.mouseTool.rectangle({
fillColor: '#00b0ff',
strokeColor: '#80d8ff'
//同Polygon的Option设置
});
break;
}
case 'circle': {
this.mouseTool.circle({
fillColor: '#00b0ff',
strokeColor: '#80d8ff'
//同Circle的Option设置
});
break;
}
}
整理总结不易,如需全部代码,请联系我15098950589(微信同号)。
vue前端开发仿钉图系列(3)右侧画点线面的开发详解的更多相关文章
- 前端html、CSS快速编写代码插件-Emmet使用方法技巧详解
前端html.CSS快速编写代码插件-Emmet使用方法技巧详解 Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生.它使用仿CSS选择器的语法来 ...
- FFmpeg开发笔记(五):ffmpeg解码的基本流程详解(ffmpeg3新解码api)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- [js高手之路]深入浅出webpack系列2-配置文件webpack.config.js详解
接着上文,重新在webpack文件夹下面新建一个项目文件夹demo2,然后用npm init --yes初始化项目的package.json配置文件,然后安装webpack( npm install ...
- [js高手之路]深入浅出webpack教程系列3-配置文件webpack.config.js详解(下)
本文继续接着上文,继续写下webpack.config.js的其他配置用法. 一.把两个文件打包成一个,entry怎么配置? 在上文中的webpack.dev.config.js中,用数组配置entr ...
- [js高手之路]深入浅出webpack教程系列2-配置文件webpack.config.js详解(上)
[js高手之路]深入浅出webpack教程系列索引目录: [js高手之路]深入浅出webpack教程系列1-安装与基本打包用法和命令参数 [js高手之路]深入浅出webpack教程系列2-配置文件we ...
- SpringBoot系列教程JPA之query使用姿势详解之基础篇
前面的几篇文章分别介绍了CURD中的增删改,接下来进入最最常见的查询篇,看一下使用jpa进行db的记录查询时,可以怎么玩 本篇将介绍一些基础的查询使用姿势,主要包括根据字段查询,and/or/in/l ...
- SpringBoot系列教程JPA之delete使用姿势详解
原文: 190702-SpringBoot系列教程JPA之delete使用姿势详解 常见db中的四个操作curd,前面的几篇博文分别介绍了insert,update,接下来我们看下delete的使用姿 ...
- web标准 浏览器介绍 开发工具介绍 HTML介绍 HTML颜色介绍 规范 HTML结构详解 {前端之前端初识}
前端之前端初识 前端初识 本节目录 一 web标准 二 浏览器介绍 三 开发工具介绍 四 HTML介绍 五 HTML颜色介绍 六 规范 七 HTML结构详解 一 web标准 web准备介绍: 1. ...
- Spring Boot2 系列教程 (二) | 第一个 SpringBoot 工程详解
微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 哎呦喂,按照以往的惯例今天周六我的安排应该是待在家学学猫叫啥的.但是今年这种日子就可能一去不复返了,没法办法啊.前 ...
- Docker系列10—容器编排工具Docker Compose详解
本文收录在容器技术学习系列文章总目录 1.Docker Compose 概述 Compose是一个用于定义和运行多容器Docker应用程序的工具.使用Compose,您可以使用Compose文件来配置 ...
随机推荐
- 系动词&使役动词
系动词 系动词的作用就是赋值 I am a rabbit 把 a rabbit赋值给i我 我是一只兔子 The rabbit is smart 这兔子是聪明的 smart赋值给兔子 系动词连系的方式, ...
- web3的的入口,钱包,为什么说加密钱包是Web 3活动入口
Web3.0让未来充满了想象力,或许超越当今人类所知的互联网.有可能彻底改变人类社交互动.商业往来和整个互联网经济.同时数字加密货币行业从业者对Web 3.0赋予了很高期待,希望通过结合后打破互联网巨 ...
- Python 环境傻瓜式搭建 :Anaconda概述
Anaconda概述 Anaconda是一个用于科学计算的Python发行版,支持 Linux, Mac, Windows系统,提供了包管理与环境管理的功能,可以很方便地解决多版本python并存.切 ...
- mongo变更流使用及windows下副本集五分钟搭建
mongodb的变更流解释: 变更流(Change Streams)允许应用程序访问实时数据变更,从而避免事先手动追踪 oplog 的复杂性和风险.应用程序可使用变更流来订阅针对单个集合.数据库或整 ...
- 网卡DM9000裸机驱动详解
一.网卡 1. 概念 网卡是一块被设计用来允许计算机在计算机网络上进行通讯的计算机硬件.由于其拥有MAC地址,因此属于OSI模型的第2层.它使得用户可以通过电缆或无线相互连接. 每一个网卡都有一个被称 ...
- Go进程内存占用那些事(一)
为什么要探究这个问题? 作为基础设施供应商,自己的服务占用多少内存,为什么要占用这么多内存,需要能说的清楚.作为一个云计算开发,这点问题都弄不清楚,说不过去. § 0x01 范围 讨论的只限于Linu ...
- zabbix资产清单inventory管理
概述 监控的设备越来越多,有时候搞不清楚哪台服务器是什么配置,大多公司有自己的资产清单,要去专门的系统查询显得多少有点麻烦.为此,zabbix专门设置了设备资产管理功能.我们创建或者编辑主机的时候,可 ...
- Ubuntu 更换 macOS Big Sur 主题
我们很多人使用 Mac 的原因之一是 macOS 是最像 Linux 的操作系统(bushi),而 macOS 精美的图形界面又让我们欲罢不能.那么能不能将 macOS 的图形界面搬到 Linux 上 ...
- druid数据库连接池在使用中遇到的一些问题和说明
get connection timeout retry : 1 2024-02-06 11:18:26.364 ERROR 23752 --- [eate-1838225797] com.aliba ...
- python pyqt6 QMenu 设定圆角边框
本来这个没有必要写,但是因为写的过程中,按照网上的写法运行,不知道为什么QMenu的右下角有圆角边框与直角背景颜色会覆盖显示 所以还是有必要写一下 menu = QMenu(self.tool_but ...