1. 在可视化地图上绘画图形

基于某些功能要求,用户可能希望在可视化地图上绘画不同的polygon来整合和规划不同的地区,因此mapbox官方提供了mapbox-gl-draw来帮助用户对地图进行自定义绘画。今天,我们将介绍如何在vue.js项目中配置绘画区域以及实现提取绘画图形的geojson地理信息

2. 配置绘画区域

首先,基于上篇文章的基础上。我们需要在terminal或者cmd中运行下面的命令,在项目中下载mapbox-gl-draw所需要的module。

npm install mapbox-gl-draw

下载成功之后,我们需要在App.vue的

import MapboxDraw from 'mapbox-gl-draw'

之后,我们在原来代码的基础上,在初始化init()方法中定义绘画区域以及定义相应的方法

 var draw = new MapboxDraw({displayControlsDefault: false,controls:{polygon:true,trash:true}});map.addControl(draw);

定义完绘画区域之后,我们项目中所显示的地图右侧上方会多出两个按钮,当用户需要绘画时,必须先点击第一个按钮进入绘画模式,之后通过两点的方式绘画polygon。如果用户希望重置绘画区域,可以点击第二个删除按钮,清空所画的图形

不仅上述所说的两种点击事件,当用户点击地图进行绘画时,地图也会进行相应的update事件,所以api一共提供了我们三个地图点击事件。由此,我们又可以自行定义不同的回调方法分别和这三个事件进行绑定以实现不同的功能效果。为了测试图形效果,我们引进了turf.js来可视化地图上保存所绘制的图形,并计算相应的面积大小。配置方法和mapbox-gl-draw一样,先在项目的terminal中运行下面的命令下载turf.js的module,之后在script中进行引用。

npm install turf
     map.on('draw.create', updateArea);map.on('draw.delete', updateArea);map.on('draw.update', updateArea);function updateArea(e){var data = draw.getAll();var answer = document.getElementById('calculated-area');if(data.features.length > 0){var area = turf.area(data);// restrict to area to 2 decimal pointsvar rounded_area = Math.round(area * 100) / 100;answer.innerHTML = '<p><strong>' + rounded_area + '</strong></p><p>square meters</p>';}else{answer.innerHTML = '';if (e.type !== 'draw.delete')alert('Use the draw tools to draw a polygon')}}

3. 提取所绘画的geojson地理信息

为了保存用户在mapbox可视化地图上绘画的polygon信息,我们可以导出相应的geojson地理数据信息并做相应的存储。

首先我们在中定义一个button,然后在

document.getElementById('export').onclick = function(e){// extract GeoJson from featureGroupvar data = draw.getAll();if(data.features.length > 0){// Stringify the GeoJsonvar convertedData = 'text/json;charset=utf-8,' + encodeURIComponent(JSON.stringify(data))// create exportdocument.getElementById('export').setAttribute('href', 'data:' + convertedData);document.getElementById('export').setAttribute('download', 'data.geojson')}else{alert("Wouldn't you like to draw some data")}}

用户可以绘画多个polygon之后,点击export按钮,把所有polygon的geojson信息提取出来,并下载。

4. 代码测试使用

完整代码

<template><div id="app"><div style="height:500px;width:50%;text-align:left;"><div ref="mapbox" style="height:500px;width:100%;"></div><pre id='info'></pre><!-- <pre id='coordinates' class='coordinates'></pre> --></div><div class="calculation-box"><p>Draw a polygon using the draw tools.</p><a ref="#" id="export">export</a><div id="calculated-area"></div></div></div>
</template><script>import mapboxgl from 'mapbox-gl'import MapboxDraw from 'mapbox-gl-draw'import turf from 'turf'export default {data () {return {}},mounted () {this.init()},methods: {// 初始化init () {// access key from mapboxmapboxgl.accessToken = 'pk.eyJ1IjoicGVhcnBsdXMiLCJhIjoiY2thaDR4cm5kMDFibzJxcHlmNjgxYTJrayJ9.LZ0Fn5iA6SobVFv4R4gByw'var coordinates = document.getElementById('coordinates');// initialize mapconst map = new mapboxgl.Map({// refs tag for accessing the DOM element in the codecontainer: this.$refs.mapbox,style: 'mapbox://styles/mapbox/streets-v9',center: [12.550343, 55.665957], // 设置地图中心zoom: 8,  // 设置地图比例})// drawable areavar draw = new MapboxDraw({displayControlsDefault: false,controls:{polygon:true,trash:true}});map.addControl(draw);map.on('draw.create', updateArea);map.on('draw.delete', updateArea);map.on('draw.update', updateArea);function updateArea(e){console.log(e.type)var data = draw.getAll();var answer = document.getElementById('calculated-area');if(data.features.length > 0){var area = turf.area(data);// restrict to area to 2 decimal pointsvar rounded_area = Math.round(area * 100) / 100;answer.innerHTML = '<p><strong>' + rounded_area + '</strong></p><p>square meters</p>';}else{answer.innerHTML = '';if (e.type !== 'draw.delete')alert('Use the draw tools to draw a polygon')}}document.getElementById('export').onclick = function(e){// extract GeoJson from featureGroupvar data = draw.getAll();if(data.features.length > 0){// Stringify the GeoJsonvar convertedData = 'text/json;charset=utf-8,' + encodeURIComponent(JSON.stringify(data))// create exportdocument.getElementById('export').setAttribute('href', 'data:' + convertedData);document.getElementById('export').setAttribute('download', 'data.geojson')}else{alert("Wouldn't you like to draw some data")}}// create a draggable makervar marker = new mapboxgl.Marker({draggable: true}).setLngLat([12.550343, 55.665957]).addTo(map);// defend a method for dragging the markerfunction onDragEnd() {console.log("test11")var lngLat = marker.getLngLat();coordinates.style.display = 'block';coordinates.innerHTML = 'Longitude: ' + lngLat.lng + '<br />Latitude: ' + lngLat.lat;}// bind the onDragEnd method with the markermarker.on('dragend', onDragEnd);// 使用定位模块map.addControl(new mapboxgl.GeolocateControl({positionOptions: {enableHighAccuracy: true},trackUserLocation: true,showUserLocation: true,zoom: 14,}))// // 建立一个标记点// var marker = new mapboxgl.Marker({//   draggable: true// })//// function onDragEnd() {//   var lngLat = marker.getLngLat();//   coordinates.style.display = 'block';//   coordinates.innerHTML = 'Longitude: ' + lngLat.lng + '<br />Latitude: ' + lngLat.lat;// }// marker.on('dragend', onDragEnd);map.addControl(new mapboxgl.MapboxGeocoder({accessToken: mapboxgl.accessToken}));}},computed: {},}
</script><style>@import "https://api.tiles.mapbox.com/mapbox-gl-js/v1.1.1/mapbox-gl.css";@import "https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-draw/v1.0.9/mapbox-gl-draw.css";#app {font-family: 'Avenir', Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;margin-top: 60px;}.coordinates {background: rgba(0,0,0,0.5);color: #fff;position: absolute;bottom: 10px;left: 10px;padding:5px 10px;margin: 0;font-size: 11px;line-height: 18px;border-radius: 3px;display: none;}body { margin:0; padding:0; }#map { position:absolute; top:0; bottom:0; width:100%; }.calculation-box {height: 75px;width: 150px;position: absolute;bottom: 40px;left: 10px;background-color: rgba(255, 255, 255, .9);padding: 15px;text-align: center;}p {font-family: 'Open Sans';margin: 0;font-size: 13px;}#export {background-color: black;color: white;padding: 6px;border-radius: 4px;cursor:pointer;font-size:12px;height:20px;width:20px;}
</style>

参考文档

  1. mapbox 官方文档
  2. turf.js 官方文档
  3. Save GeoJSON from Mapbox GL Draw — Dan Swick

mapbox图形绘画以及polygon信息提取相关推荐

  1. Java数字图像处理基础-------Java Swing简单使用,图形绘画---画五角星

    Java数字图像处理基础-------Java Swing简单使用,图形绘画-画五角星 一:简介 要画出五角星出来,我们只需要在面板上产生5个点,然后把这5个点进行连接就可实现: 二:代码演示 imp ...

  2. graphics.h头文件图形绘画详解(史上最详细)

    简介&下载: graphics.h是针对DOS下的一个C语言图形库 (c++也可以) 目前支持下载此头文件的常用的有两种: 1. EGE (Easy Graphics Engine) 2. E ...

  3. OpenGL:基本图形绘画

    1.画点:参数为相对屏幕的比例,屏幕中间为(0,0),左上角为(-1,1)(未指定坐标系时glMatrixMode) glPointSize(5.0f); glPointSize(5.0f);glBe ...

  4. R语言给图形填充颜色(polygon函数)

    1. 使用polygon进行纯色填充 # polygon函数介绍 polygon(x, y = NULL, density = NULL, angle = 45,border = NULL, col ...

  5. 头条号指数改版上线,科技领域排名TOP3%

    自从内容创业火热之后,涌现出了不少自媒体平台和自媒体作者.在这些自媒体平台之中,今日头条是最受作者喜爱的一家.各种功能和规则也在不断完善之中.在继推出加V认证不久,又改版了头条指数. 在昨天,相信不少 ...

  6. 使用CSS 3创建不规则图形

    2019独角兽企业重金招聘Python工程师标准>>> 前言 CSS 创建复杂图形的技术即将会被广泛支持,并且应用到实际项目中.本篇文章的目的是为大家开启它的冰山一角.我希望这篇文章 ...

  7. 计算机画大熊猫教案,幼儿绘画《熊猫》教案

    幼儿绘画<熊猫>教案 教学内容: 绘画<熊猫> 教学目标: 1.教会幼儿如何使用图形绘画熊猫. 2.教育幼儿保护熊猫. 3.通过绘画活动丰富幼儿想象力,增强幼儿的动手能力. 教 ...

  8. html怎么设置不规则图形,CSS3绘制不规则图形的一些方法示例

    前言 CSS 创建复杂图形的技术即将会被广泛支持,并且应用到实际项目中.本篇文章的目的是为大家开启它的冰山一角.我希望这篇文章能让你对不规则图形有一个初步的了解. 现在,我们已经可以使用CSS 3 常 ...

  9. 三年级计算机群鸭戏水教案导入,三年级下册信息技术教案37群鸭戏水自选图形清华大学版.doc...

    第七课<群鸭戏水--自选图形> 教学内容: 7.群鸭戏水 教学目标: 知识与技能: 要求学生会在Word中插入自选图形,并掌握自选图形的格式设置. 过程与方法: 教师演示加学生自主上机练习 ...

最新文章

  1. 用C语言解“然后是几点”问题
  2. http://forensics.idealtest.org CASIA图像篡改数据库
  3. .Net Core扩展 SharpPlugs简单上手
  4. 适合零基础学python的书籍_适合零基础学习Python的书籍
  5. 100元左右的鼠标推荐
  6. [渝粤教育] 中国地质大学 工业卫生技术 复习题 (2)
  7. java中的显示初始化和特定初始化
  8. basler相机的触发线是那两脚_探究机器视觉领域线扫相机和面阵相机的区别
  9. 525 Contiguous Array 连续数组
  10. 如何让我的网站(独立网站或者blog)被百度收录?
  11. a标签传值到另一个页面_用大头儿子和小头爸爸举例,就讲明白 vue 中父子组件的传值? | 原力计划...
  12. 软件测试师和网络工程师,【软件测试工程师(科技部)网络工程师面试题目|面试经验】-看准网...
  13. 柳州铁一中机器人_柳州铁一中学学子在2020年广西中小学电脑机器人竞赛中勇创佳绩...
  14. 采样频率-控制频率-开关频率
  15. bzoj4484[Jsoi2015]最小表示 拓补排序+bitset
  16. 四阶幻方c语言编程,13年 第四届 蓝桥杯C语言C组 第4题 幻方填空
  17. 飞利浦Georg Jensen联名系列真无线耳机JT60重磅上市
  18. 【.net core】电商平台升级之微服务架构应用实战
  19. 广东高考成绩及录取分数线揭晓
  20. 苹果笔记本计算机管理员删除,如何删除一个管理员?

热门文章

  1. SolidWorks二次开发,如何修改异形孔的沉头孔大小
  2. Java 算法:图的表示
  3. 360全景夜景拍摄的五大要点
  4. 微信电脑版-微信for windows客户端发布
  5. YOLOv5实现佩戴安全帽检测和识别(含佩戴安全帽数据集+训练代码)
  6. 随意描绘风格的界面工具Balsamiq Mockups
  7. 机器学习---文本特征提取之词袋模型与tfidf特征
  8. 信息安全金钥匙数字证书使用一点通(上)(转)
  9. python 打开文件的方式汇总
  10. Ingress 使用域名访问服务