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文件来配置 ...
随机推荐
- 使用ventoy安装windows10
使用ventoy安装windows10 在ventoy中选择windows10镜像 进入Windows安装界面 下一步,选择现在安装 稍等片刻 选择我没有产品密钥 根据需求选择对应版本 下一步,接受许 ...
- 不止于面向对象的SOLID原则
SOLID原则是由人称"鲍勃大叔"的Rober C. Martin所提出来的.他用五个面向对象设计原则的首字母组成了SOLID,并使其得到了广泛传播.这五个原则罗列如下: 单一指责 ...
- 【Java】匿名表达式 + 构造块
来源自同事的一个代码截图 可以看见最后一行装填HashMap的语法非常的不常见 在我整理思绪之后才明白这语法是使用了 匿名内部类 + 对象构造代码块 一般使用场景是发生在容器对象的创建上,因为有些时候 ...
- 【Java-GUI】10 Swing05 JTree
简单的Tree结构: package cn.dzz; import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode; pub ...
- 【FastDFS】环境搭建 03 FastDFS & Nginx整合
FastDFS & Nginx整合: 跟踪器结合Nginx,目的是为了负载均衡和高可用,只有一台Track可以不配置Nginx 安装FastDFS-Nginx-Module到服务器上面: ta ...
- 【转载】 tensorflow中的batch_norm以及tf.control_dependencies和tf.GraphKeys.UPDATE_OPS的探究
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/huitailangyz/article/ ...
- 如何在jax框架的jit中快速的实现循环结构 —— Jax框架的jit编译是否可以使用循环结构
相关: Jax框架的jit编译是否可以使用循环结构,如果使用循环结构需要注意什么 前文中给出了jit下使用python做循环结构的代码,下面再次给出这个代码,这个代码为jupyter-notebook ...
- 记一次失败记录: MindSpore1.3.0 GPU 源码安装 —— Ubuntu18.04系统 (最终安装结果为失败)
官网地址: https://www.mindspore.cn/install 系统:Ubuntu18.04 硬件: i7-9700k CPU 2060super nvidia显卡 由于考虑到minds ...
- vue前端自适应布局,一步到位所有自适应
vue前端自适应布局,一步到位所有自适应 页面展示 实现内容 1,左右布局 左侧固定宽带,右侧自适应剩余的宽度. 中间一条分割线,可以拖拉,自适应调整左右侧的宽度. 左侧的高度超长自动出现横向滚动条, ...
- SMU Summer 2023 Contest Round 3
SMU Summer 2023 Contest Round 3 A. Curriculum Vitae 题意就是要求\(1\)后面不能有\(0\)的情况下的子序列最长长度, 也就是求一个最长不下降子序 ...