SuperMap iClient for Leaflet+leaflet.polylinemeasure实现leaflet图上距离量测

本文是借助leaflet.polylinemeasure插件+SuperMap iClient for Leaflet开发实现leaflet地图中距离量测功能,该插件除了能够测量两点间的距离外还包含了测量点的方位角信息,同时该插件还能对测量点进行增添、删除、移动、继续绘制等操作,具有很强的交互性,除此之外该插件显示的测量线段并不是普通的直线段,而是模拟大圆路径的弧线段(这一点在长距离的测量时较为明显),并且在测量过程中用户可以根据需要切换距离单位。传送门:GitHubnpm

 效果图:

一、插件说明

1.使用方法

鼠标左击“绘制”控件后即可在地图上使用鼠标左键添加需要测量的点位,绘制完成后可以双击鼠标左键或者按下Esc键即可终止本次绘制,如需再次绘制只需重复上述操作。

清除绘制:点击“清除”控件或者按下Esc键。

插入测量点:按住Ctrl键,同时鼠标左击任意两个点之间的箭头即可添加测量点。

删除测量点:按住Shift键,同时鼠标左击需要删除的点即可删除该点。

移动测量点:鼠标左键选中需要移动的点并拖动鼠标即可移动该点。

继续绘制:按住Ctrl键,同时单击某条线段的第一个或最后一个点即可继续绘制该条线段。

2.插件安装

npm i leaflet.polylinemeasure

3.部分配置项及事件说明

//Default options:
  position: "bottomright", //控件在屏幕中的位置,'topright', 'topleft', 'bottomright', 'bottomleft'
  unit: "metres", //初始单位
  showClearControl: true, //是否显示清除控件
  showUnitControl: true, //是否显示更改度量单位的控件
  showBearings: true, //是否显示方位
  clearMeasurementsOnStop: true, //取消选择控件时清除所有测量(当标绘为取消时是否清除图中现有的测量结果)
  bearingTextIn: "In", //入射角标签文字,默认为"In"(这里用“入射角”可能不太合适,其实就是当前点和上一个点的夹角,正北为起始0°)
  bearingTextOut: "Out", //出射角标签文字,默认为"Out"(其实就是当前点和下一个即将绘制的点的方位角)
  measureControlTitleOn: "开始绘制", //要打开控件的提示标签内容
  measureControlTitleOff: "停止绘制", //要关闭控件的提示标签内容
  measureControlLabel: "&#8614", //度量控件的标签符号(无需修改)
  clearControlLabel: "&times", //清除控件的标签符号(无需修改)
  distanceShowSameUnit: false, //如果距离小于1 km/mi/nm,则在工具提示中保持相同的单位(建议设置为“false”)
  unitControlTitle: {
    //要显示在“单位控制”按钮上的标题文本
    text: "更改单位",
    metres: "米",
    landmiles: "英里",
    nauticalmiles: "海里",
  },
  unitControlLabel: {
    //要在“单位控制”按钮和测量标签中显示的单位符号
    metres: "m",
    kilometres: "km",
    feet: "ft",
    landmiles: "mi",
    nauticalmiles: "nm",
  },
  tempLine: {
    // 临时虚线的样式设置
    color: "#68FFFF", // 虚线颜色
    weight: 2, // 线宽
  },
  fixedLine: {
    // 给实线设置样式
    color: "#00F8F6", // 颜色
    weight: 2, // 线宽
  },
  startCircle: {
    // 指示多段线起点的圆标记的样式设置
    color: "#000", // 圆边框的颜色
    weight: 1, //圆边框的宽度
    fillColor: "#0f0", // 圆的填充颜色
    fillOpacity: 1, // 填充圆的不透明度
    radius: 3, // 圆的半径
  },
  intermedCircle: {
    // 指示起点和终点之间点的圆的样式
    color: "#000", // 圆边框的颜色
    weight: 1, // 圆边框的宽度
    fillColor: "#ff0", //  圆的填充颜色
    fillOpacity: 1, // 填充圆的不透明度
    radius: 3, //  圆的半径
  },
  currentCircle: {
    // 在绘制直线期间指示多段线最新点的圆标记的样式设置
    color: "#000",
    weight: 1,
    fillColor: "#f0f",
    fillOpacity: 1,
    radius: 3,
  },
  endCircle: {
    // 终点圆的样式
    color: "#000",
    weight: 1,
    fillColor: "#f00",
    fillOpacity: 1,
    radius: 3,
  }

//Events:
map.on("polylinemeasure:toogle", (e) => {
  console.log("toogle", e);
});
map.on("polylinemeasure:start", (currentLine) => {
  console.log("start", currentLine);
}); //开始绘制时执行
map.on("polylinemeasure:resume", (currentLine) => {
  console.log("resume", currentLine);
}); //继续绘制时执行
map.on("polylinemeasure:finish", (currentLine) => {
  console.log("finish", currentLine);
}); //结束绘制时执行
map.on("polylinemeasure:change", (currentLine) => {
  console.log("change", currentLine);
}); //绘制发生变化时执行
map.on("polylinemeasure:clear", (e) => {
  console.log("clear", e);
}); //清除测量结果时执行
map.on("polylinemeasure:add", (e) => {
  console.log("add", e);
}); //添加测量点时执行
map.on("polylinemeasure:insert", (e) => {
  console.log("insert", e);
}); //插入测量点时执行
map.on("polylinemeasure:move", (e) => {
  console.log("move", e);
}); //移动已绘制的点时执行(alt键+鼠标左键移动)
map.on("polylinemeasure:remove", (e) => {
  console.log("remove", e);
}); //移除已绘制的点时执行


二、使用步骤

1.引入依赖

import { polylineMeasure } from "leaflet.polylinemeasure";
import "leaflet.polylinemeasure/Leaflet.PolylineMeasure.css";

2.具体逻辑

<script setup>
import { polylineMeasure } from "leaflet.polylinemeasure";
import "leaflet.polylinemeasure/Leaflet.PolylineMeasure.css";

let LFpolylineMeasure = L.control.polylineMeasure({options});
LFpolylineMeasure.addTo(map);
</script>

3.完整代码 

/*待Leaflet页面挂载完成后将此页面组件加载即可*/
<template></template>

<script setup>
import { polylineMeasure } from "leaflet.polylinemeasure";
import "leaflet.polylinemeasure/Leaflet.PolylineMeasure.css";

let LFpolylineMeasure = L.control.polylineMeasure({
  position: "bottomright", //控件在屏幕中的位置,'topright', 'topleft', 'bottomright', 'bottomleft'
  unit: "metres", //初始单位
  showClearControl: true, //是否显示清除控件
  showUnitControl: true, //是否显示更改度量单位的控件
  showBearings: true, //是否显示方位
  clearMeasurementsOnStop: true, //取消选择控件时清除所有测量(当标绘为取消时是否清除图中现有的测量结果)
  bearingTextIn: "In", //入射角标签文字,默认为"In"(这里用“入射角”可能不太合适,其实就是当前点和上一个点的夹角,正北为起始0°)
  bearingTextOut: "Out", //出射角标签文字,默认为"Out"(其实就是当前点和下一个即将绘制的点的方位角)
  measureControlTitleOn: "开始绘制", //要打开控件的提示标签内容
  measureControlTitleOff: "停止绘制", //要关闭控件的提示标签内容
  measureControlLabel: "&#8614", //度量控件的标签符号(无需修改)
  clearControlLabel: "&times", //清除控件的标签符号(无需修改)
  distanceShowSameUnit: false, //如果距离小于1 km/mi/nm,则在工具提示中保持相同的单位(建议设置为“false”)
  unitControlTitle: {
    //要显示在“单位控制”按钮上的标题文本
    text: "更改单位",
    metres: "米",
    landmiles: "英里",
    nauticalmiles: "海里",
  },
  unitControlLabel: {
    //要在“单位控制”按钮和测量标签中显示的单位符号
    metres: "m",
    kilometres: "km",
    feet: "ft",
    landmiles: "mi",
    nauticalmiles: "nm",
  },
  tempLine: {
    // 临时虚线的样式设置
    color: "#68FFFF", // 虚线颜色
    weight: 2, // 线宽
  },
  fixedLine: {
    // 给实线设置样式
    color: "#00F8F6", // 颜色
    weight: 2, // 线宽
  },
  startCircle: {
    // 指示多段线起点的圆标记的样式设置
    color: "#000", // 圆边框的颜色
    weight: 1, //圆边框的宽度
    fillColor: "#0f0", // 圆的填充颜色
    fillOpacity: 1, // 填充圆的不透明度
    radius: 3, // 圆的半径
  },
  intermedCircle: {
    // 指示起点和终点之间点的圆的样式
    color: "#000", // 圆边框的颜色
    weight: 1, // 圆边框的宽度
    fillColor: "#ff0", //  圆的填充颜色
    fillOpacity: 1, // 填充圆的不透明度
    radius: 3, //  圆的半径
  },
  //   currentCircle: {
  //     // 在绘制直线期间指示多段线最新点的圆标记的样式设置
  //     color: "#000",
  //     weight: 1,
  //     fillColor: "#f0f",
  //     fillOpacity: 1,
  //     radius: 3,
  //   },
  endCircle: {
    // 终点圆的样式
    color: "#000",
    weight: 1,
    fillColor: "#f00",
    fillOpacity: 1,
    radius: 3,
  },
});
LFpolylineMeasure.addTo(map);

map.on("polylinemeasure:toogle", (e) => {
  console.log("toogle", e);
});
map.on("polylinemeasure:start", (currentLine) => {
  console.log("start", currentLine);
}); //开始绘制时执行
map.on("polylinemeasure:resume", (currentLine) => {
  console.log("resume", currentLine);
}); //继续绘制时执行
map.on("polylinemeasure:finish", (currentLine) => {
  console.log("finish", currentLine);
}); //结束绘制时执行
map.on("polylinemeasure:change", (currentLine) => {
  console.log("change", currentLine);
}); //绘制发生变化时执行
map.on("polylinemeasure:clear", (e) => {
  console.log("clear", e);
}); //清除测量结果时执行
map.on("polylinemeasure:add", (e) => {
  console.log("add", e);
}); //添加测量点时执行
map.on("polylinemeasure:insert", (e) => {
  console.log("insert", e);
}); //插入测量点时执行
map.on("polylinemeasure:move", (e) => {
  console.log("move", e);
}); //移动已绘制的点时执行(alt键+鼠标左键移动)
map.on("polylinemeasure:remove", (e) => {
  console.log("remove", e);
}); //移除已绘制的点时执行
/*
使用方法:
鼠标左击“绘制”控件后即可在地图上使用鼠标左键添加需要测量的点位,绘制完成后可以双击鼠标左键或者按下Esc键即可终止本次绘制,如需再次绘制只需重复上述操作。
清除绘制:点击“清除”控件或者按下Esc键。
插入测量点:按住Ctrl键,同时鼠标左击任意两个点之间的箭头即可添加测量点。
删除测量点:按住Shift键,同时鼠标左击需要删除的点即可删除该点。
移动测量点:鼠标左键选中需要移动的点并拖动鼠标即可移动该点。
继续绘制:按住Ctrl键,同时单击某条线段的第一个或最后一个点即可继续绘制该条线段。
*/
</script>

<style>
</style>

总结

以上是基于Vue3框架+leaflet.polylinemeasure插件实现Leaflet图上距离量测功能相关代码,如有疏漏欢迎评论区指出,如果感觉对您有用,还请点一个免费的小👍,多谢~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SuperMap iClient for Leaflet是一款基于Leaflet框架的地图开发工具,可以帮助开发者快速构建WebGIS应用程序。它提供了丰富的地图功能和数据处理能力,支持多种数据格式和服务类型,可以轻松实现地图展示、数据查询、空间分析等功能。同时,它还具有良好的跨平台性和扩展性,可以在PC端、移动端和Web端等多种平台上使用。 ### 回答2: SuperMap iClient for Leaflet是一种基于JavaScript代码库的Web GIS开发产品,在Leaflet框架上构建出新一代的互联网GIS应用程序。SuperMap iClient for Leaflet可以在地图展示、查询分析、数据处理和空间计算等方面提供完整的功能支持,并且能够快速开发出高效、稳定和复杂的互联网GIS系统。 在SuperMap iClient for Leaflet中,Leaflet是作为主要的基础库来展示地图和功能的。Leaflet是一个轻量级的Web地图框架,具有高度的可定制性,并支持多种图层、地图的基本交互操作和协同显示。因此,SuperMap iClient for Leaflet可以和其他Web GIS开发库完美地协同工作。 SuperMap iClient for Leaflet的主要功能包括: 1.地图服务:可以快速地加载和显示多种切片和动态地图服务,支持图层控制、标注、信息窗口等操作。 2.查询和统计分析:能够实现多种查询、统计和分析操作,例如点选查询、矩形查询、属性查询、空间查询、缓冲区分析、距离测量、区域统计分析、热力图绘制等。 3.数据可视化和渲染:支持多种数据可视化和渲染技术,例如图表、标签、符号、颜色、透明度等,让数据更加生动和易于理解。 4.地理编码和路径分析:支持多种地理编码和路径分析算法,例如最短路、最优路径、网络分析、行驶路线规划等,可以应对多种实际应用场景。 5.数据处理和导出:提供多种数据处理和导出操作,例如数据格式转换、剪裁、裁剪、融合、导入、导出等,使得GIS数据的管理更加高效和灵活。 总之,SuperMap iClient for Leaflet是Web GIS开发的一种高效、灵活、全面的解决方案,可以让用户快速构建出令人称道的Web GIS系统,满足多样化的GIS需求。 ### 回答3: SuperMap iClient for Leaflet是基于Leaflet框架封装开发的一个功能强大、易用性高、可定制性强的WebGIS开发框架。SuperMap iClient for Leaflet为开发者提供了丰富的地图可视化和分析功能,轻松支持各类GIS业务系统的快速构建和发布,拥有完善的API,可方便地与其他WebGIS技术或框架相结合。 SuperMap iClient for Leaflet可以实现多种数据源的地图服务,包括矢量数据、切片数据、动态数据和三维数据等。同时,SuperMap iClient for Leaflet还支持丰富的地图功能,包括地图缩放、平移、旋转、地图标注、查询、空间分析、路径规划等。 SuperMap iClient for Leaflet还支持地图的分层和可交互性。这些都有助于开发者在WebGIS领域获得更多的自由度和灵活度。在云计算、大数据、物联网技术的带动下,SuperMap iClient for Leaflet已经成为WebGIS技术中不可或缺的一部分。 总之,SuperMap iClient for Leaflet是一款完美的WebGIS开发框架,具有易用性、高可定制性和丰富的功能,可以帮助开发者更快速、更高效地构建出具有广泛应用价值的GIS业务系统,满足社会生产和生活中对于空间分析、智能数据分析等多个领域的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值