使用Leaflet GeoMan结合天地图进行自由标绘实战

news2024/11/15 3:37:54

目录

前言

一、Leaflet GeoMan是什么

1、关于Leaflet GeoMan

2、关于开源版和企业版

3、相关的方法介绍

二、使用Geoman来进行自由标绘实战

1、相关资源准备

2、新建html网页

3、初始化地图及绑定Geoman控件

三、自由标绘的成果

1、整体效果

2、添加空间对象

3、开启移动和编辑 

 四、总结


前言

        很多人文类GIS、旅游类GIS,通常会采用WebGIS的方式想公众、游客来介绍当前用户感兴趣的地理信息。同时为了增加交互的趣味性,在这类人文类的GIS应用中,不仅可以支持底图的在线加载,同时还可以支持用户自主的来编辑或设置一些标绘,把一些用户自己感兴趣的空间位置信息进行图上标绘,类似于涂鸦的概念,通过这种交互性提高用户的使用欲望,从而让系统和用户结合得更好。而一些历史类的WebGIS应用也会有类似的需求,比如描述某个人物的一生,除了搜集可以获取到的位置信息,还可以基于互联网,自动关联一些感兴趣的位置、面、范围、矩形、多边形等空间信息与人物进行关联,来辅助进行说明目标任务的一生。

        类似于上面的这种操作界面,它支持各种不同的空间对象的创建和编辑,比如点、线、矩形、多边形、圆、圆点,文本标注等,同时还支持对空间对象的移动、剪切、删除、旋转等操作。用户只需要组织好自己的场景,然后基于WebGIS进行场景的创作。就像编剧一样,把各种人物按照一定的关系和出场顺序组织好,让他们依次粉墨登场。在以往的WebGIS应用开发中,我们采用的都是Leaflet.js。因此在这里,我们要想实现各种空间对象的编辑和管理,依然决定在Leaflet的可视化展示组件上来进行开发。

        本文即在这样的需求背景下诞生,首先讲解基于Leaflet开发的一个Leaflet GeoMan组件,介绍这个组件是什么,有哪些特色功能,然后介绍如何在工程中使用这些组件,最后在以一个实际的案例来实现之前我们提出来的场景。通过本文,您不但可以了解什么是Leaflet geoMan,还可以掌握它的基本用法,了解如何创建第一个基本应用,最后学会如何在WebGis界面中进行自由标绘。掌握GIS,用GIS来表达,用GIS来讲故事,从这里开始。

一、Leaflet GeoMan是什么

        本节依然来重点讲解Leaflet Geoman是什么?究竟这个组件能做些什么,它有哪些特别之处呢?在使用的时候,有哪些方法可以使用呢?这些内容都将在本节给出答案。

1、关于Leaflet GeoMan

        首先,我们来看一下在GitHub上,关于Leaflet GeoMan这个项目的简要介绍,感兴趣的朋友可以在GitHub上来查找它的源码。从而更加了解它的代码编写和设计思路。传送门。

         可以看到,在github上面,leaflet-geoman这个项目的start 数已经有2.1k,作为一个前端组件,尤其是面向webgis的前端组件,非常厉害了。下面我们结合它的官网资料来进行一些简要介绍。让您提前了解一些知识。

        首先看得到的是,这个项目的开源协议采用的MIT协议,这个协议是非常宽松的协议。首先来看一下这个项目的主要介绍。

          The most powerful leaflet plugin for drawing and editing geometry layers。Leaflet Plugin For Creating And Editing Geometry Layers Draw, Edit, Drag, Cut, Rotate, Split, Scale, Measure, Snap and Pin Layers Supports Markers, CircleMarkers, Polylines, Polygons, Circles, Rectangles, ImageOverlays, LayerGroups, GeoJSON, MultiLineStrings and MultiPolygons。

        上述文字是在其官网上的详细内容介绍,翻译成中文就是:用于绘制和编辑几何图层的最强大的Leaflet插件。用于创建和编辑几何图层的Leaflet插件绘制、编辑、拖动、剪切、旋转、分割、缩放、测量、捕捉和固定图层支持标记、圆标记、折线、多边形、圆、直角、图像叠加、图层组、GeoJSON、多线串和多多边形。从以上内容可知,其是针对Leaflet的一种扩展。

2、关于开源版和企业版

        虽然这款软件是开源的,但是其还是有开源版和企业版的区别,关于这两个版本的主要差别,在Leaflet-geoman的官方文档上有简要的说明。与市面上大多数的软件一致,企业版的功能比开源版的要多一些,这也是正常的。企业版(pro)版的功能要比开源版强大一些。如果您在平时的工作中确实需要这些新特性,那不妨去支持一下这个项目。企业版的不同之处主要分几个方面,第一个方面是企业版支持的模式多一些,如下图所示:

        上图红色框中的就是企业版独有的Mode,在开源版中没有。 当然,除了Mode的区别之外,在Options配置方面也是有一些区别。

        在实际的项目中,在引入Leaflet-geoman资源时,需要注意不同的版本的选择,开源版的资源引入使用如下所示:

<link
  rel="stylesheet"
  href="https://unpkg.com/@geoman-io/leaflet-geoman-free@latest/dist/leaflet-geoman.css"
/>

        同时还要引入javascript(请注意,这里使用的是free版本):

<script src="https://unpkg.com/@geoman-io/leaflet-geoman-free@latest/dist/leaflet-geoman.js"></script>

        企业版的相关资源引入,需要申请key等令牌后才能访问。

3、相关的方法介绍

        除了介绍怎么下载geoman项目,还介绍了这个项目的两个不同版本区别,最后还是回归到技术来,就是geoman这个项目的相关方法和属性怎么去设置,工具栏的配置方法是什么?这里将重点介绍一下。首先来介绍一下工具栏的配置,在Leaflet界面中,要想触发编辑或者新增,都需要在工具栏上来统一出发。因此首先介绍工具栏的配置。工具栏的参数如下:

MethodReturnsDescription
addControls(options)-Adds the Toolbar to the map. The options are optional. Buttons can be removed with setting them to false.
removeControls()-Removes the Toolbar from the map.
toggleControls()-Toggle the visiblity of the Toolbar.
controlsVisible()BooleanReturns true if the Toolbar is visible on the map.

        然后我们具体来看下options这个配置参数具体有哪些?

OptionDefaultDescription
position'topleft'Toolbar position, possible values are 'topleft''topright''bottomleft''bottomright'
positionsObjectThe position of each block (draweditcustomoptions⭐) can be customized. If not set, the value from position is taken. Default: {draw: '', edit: '', options: '', custom: ''} Block Position
drawMarkertrueAdds button to draw Markers.
drawCircleMarkertrueAdds button to draw CircleMarkers.
drawPolylinetrueAdds button to draw Line.
drawRectangletrueAdds button to draw Rectangle.
drawPolygontrueAdds button to draw Polygon.
drawCircletrueAdds button to draw Circle.
drawTexttrueAdds button to draw Text.
editModetrueAdds button to toggle Edit Mode for all layers.
dragModetrueAdds button to toggle Drag Mode for all layers.
cutPolygontrueAdds button to cut a hole in a Polygon or Line.
removalModetrueAdds a button to remove layers.
rotateModetrueAdds a button to rotate layers.
oneBlockfalseAll buttons will be displayed as one block Customize Controls.
drawControlstrueShows all draw buttons / buttons in the draw block.
editControlstrueShows all edit buttons / buttons in the edit block.
customControlstrueShows all buttons in the custom block.
optionsControlstrueShows all options buttons / buttons in the option block ⭐.
pinningOptiontrueAdds a button to toggle the Pinning Option ⭐.
snappingOptiontrueAdds a button to toggle the Snapping Option ⭐.
splitModetrueAdds a button to toggle the Split Mode for all layers ⭐.
scaleModetrueAdds a button to toggle the Scale Mode for all layers ⭐.
autoTracingOptionfalseAdds a button to toggle the Auto Tracing Option ⭐.
snapGuidesOptiontrueAdds a button to toggle the SnapGuides Option ⭐.

        请注意,上面的配置选项中,标红色的是企业版采用的功能,如果是用开源版,不用管这些参数即可。篇幅有限,类似于这种设置,大家可以参考管网来进行合理配置,说明文档。其它的文档说明不再进行赘述。

二、使用Geoman来进行自由标绘实战

        在大致掌握了Geoman是什么?它的功能是什么?究竟geoman是怎么来操作空间图形对象的呢。在实际开发中,我们怎么进行代码的编写呢。本节主要说明上面的需求实现,主要是采用实际的工程代码编写的方式。通过本节掌握如何进行geoman可编辑代码的编写。

1、相关资源准备

        在进行geoman自由标绘的时候,我们首先将需要的资源准备好。由于使用的Leaflet组件,因此我们将Leaflet需要的css和javascript文件拷贝到资源目录中。关于geom依赖的css和javascript,在前面的内容中有所涉及。

        再来看一下dist文件夹中的包含哪些文件:

         leaflet相关的css和javascript文件请从leaflet相关网站上下载即可。

2、新建html网页

        然后在文件夹中新建一个index.html文件,在这个文件中引入相关的资源,包括leaflet和geoman的css样式文件和javascript脚本文件。文件内容如下:

<!DOCTYPE >
<html lang="zh">
  <head>
	<meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Leaflet Geoman 在线标绘实战</title>
    <link rel="stylesheet" href="./dist/leaflet.css"/>
    <link rel="stylesheet" href="./dist/leaflet-geoman.css" />
    <link rel="stylesheet" href="demo.css" />
  </head>
  <body>
    <div class="wrapper">
      <article>
        <h2> Leaflet Geoman 在线标绘实战</h2>
        <div class="map" id="map"></div>
      </article>
    </div>
    <script src="./dist/leaflet.js"></script>
    <script src="./dist/leaflet-geoman.js"></script>
    <script src="demo.js?t=3"></script>
  </body>
</html>

3、初始化地图及绑定Geoman控件

        在创建index.html文件,同时引入了leaflet和geoman这两个组件的相关资源后,我们来实际的设置具体的控制组件。首先绑定地图容器,同时设置加载的瓦片底图的地址,这里使用天地图的图源,大家在实际展示时,需要先将tdt的tk进行替换,或者直接将地图换成其它的图源。

/* eslint-disable no-console */
const tiles = L.tileLayer('http://t0.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=you key', {
  maxZoom: 18,
  attribution:
    '&copy; <a href="hhttps://www.tianditu.gov.cn/">在线图源使用国家天地图</a> contributors',
});

const map = L.map('map').setView([51.505, -0.09], 13).addLayer(tiles);

        然后开启工具栏绑定,具体要开启的设置见官网说明,关键代码如下:

layerGroup.pm.toggleEdit({
  draggable: true,
  snappable: true,
  snapDistance: 30,
});

        最后将组件绑定到地图中,这里是将工具栏放置到右上方的位置,关键代码如下所示:

map.pm.addControls({
  position: 'topright',
});

        到此,已经完成了地图组件的初始化,geoman控件的绑定和渲染展示设置等。

三、自由标绘的成果

        本节以自由标绘的成果为例,主要说明在界面中如何进行使用。因此这里是交作业被检查的时候。

1、整体效果

        首先来看一下整体的效果,我们默认还设置了一些初始化的空间对象,比如线、面还有geojson类型的数据,让大家对主动加载数据有一个直观的了解。

const layerGroupItem1 = L.polyline(
  [
    [51.51, -0.09],
    [51.513, -0.08],
    [51.514, -0.11],
  ],
  { pmIgnore: true }
);
const layerGroupItem2 = L.polygon([
  [51.52, -0.06],
  [51.51, -0.07],
  [51.52, -0.05],
]);
const layerGroupItem3 = L.polygon([
  [51.51549835365031, -0.06450164634969281],
  [51.51944818307178, -0.08425079345703125],
  [51.51868369995795, -0.06131630004205801],
  [51.51549835365031, -0.06450164634969281],
]);
const feature = {
  type: 'Feature',
  properties: {},
  geometry: {
    type: 'Polygon',
    coordinates: [
      [
        [72.839012, 19.058873],
        [72.92038, 19.066985],
        [72.856178, 19.019928],
        [72.839012, 19.058873],
      ],
    ],
  },
};
const layerGroup = L.featureGroup([layerGroupItem1]).addTo(map);

         上图是初始化展示的自由标绘底图,同时加载了几个待编辑的空间对象。

2、添加空间对象

        这里主要演示添加线、面、矩形、范围、多边形、文本标记、原型等空间对象。

3、开启移动和编辑 

        在右边的工具条中,不仅可以添加新的空间对象,同时还可以对整体信息进行编辑,比如剪切、平移、旋转等操作。直接使用鼠标点击工具栏即可完成对应的设置。当打开编辑窗口时,可以拖动关键点进行图形的位置修正。

        下面是一张我们绘制的模拟城市功能区位置示意图 

 四、总结

        以上就是本文的主要内容,本文首先讲解基于Leaflet开发的一个Leaflet GeoMan组件,介绍这个组件是什么,有哪些特色功能,然后介绍如何在工程中使用这些组件,最后在以一个实际的案例来实现之前我们提出来的场景。通过本文,您不但可以了解什么是Leaflet geoMan,还可以掌握它的基本用法,了解如何创建第一个基本应用,最后学会如何在WebGis界面中进行自由标绘。行文仓促,定有不足之处,如有不当或者需要补充的地方,还行各位专家和朋友在评论区留言指正,鄙人不胜感激。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1964535.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

语音交互、AI问答,等你来体验!

功能背景 在实际大屏应用中&#xff0c;用户向大屏直接下达语音指令显的越来越便捷&#xff0c;其中体现的交互感也比通过动作指令来的更加强烈&#xff0c;给用户带来更高效的服务体验。目前EasyV平台开发的自定义事件交互已经很完善&#xff0c;组件之间可以进行触发联动。 …

python 装饰器及使用场景

1. 装饰器的理解 上面这种用装饰器的效果和下面这种是一样的&#xff0c;两个圈起来的是等价的&#xff0c;只是写法不一样&#xff0c;用装饰器函数 更简洁一些。 总的来说&#xff0c;装饰器的作用是&#xff1a;当定义一个函数的时候&#xff0c;通过在其上面加上装饰器&…

C:关于位操作符:、|、^、~的一些应用

一些用来熟悉位操作符的应用 一、按位异或&#xff1a;^ 异或运算&#xff1a;相同为0&#xff0c;相异为1 应用&#xff1a;在不引入临时变量&#xff08;第三变量&#xff09;的情况下&#xff0c;实现两个整数的交换。 关于两个整数交换&#xff0c;我们有一些方法&…

Docker Compose部署项目+使用

目录结构 - suggestion/- backend/ # 我的后端项目- app.py- other_files/- docker-compose.yml- Dockerfile- requirements.txt获得requirements.txt 命令行输入&#xff1a;pip list --formatfreeze > requirements.txt 因为使用 pip freeze > requirements.txt 导出…

创建了Vue项目,需要导入什么插件以及怎么导入

如果你不知道怎么创建Vue项目,建议可以看一看这篇文章 怎么安装Vue的环境和搭建Vue的项目-CSDN博客 1.在idea中打开目标文件 2.系在一个插件Vue.js 3.下载ELement UI 在Terminal中输入 # 切换到项目根目录 cd vueadmin-vue # 或者直接在idea中执行下面命令 # 安装element-u…

漏洞打靶-tomato

这是一个很有意思的靶场&#xff0c;靶机的安装过程请参考我的文章“漏洞打靶-hackme”&#xff0c;进入靶场后&#xff0c;迎面而来的就是一个大tomato&#xff0c;然后就无从下手了&#xff0c;查目录查不出来&#xff0c;sql注入也没地方注入 这时候我们可以用kali的nmap去查…

ARM学习(29)NXP 双coreMCU MCXN94学习

笔者来介绍一下NXP 双core板子 &#xff0c;新系列的mcxn94 1、MCX 新系列介绍 恩智浦 MCU 系列产品包括 Kinetis 、LPC 系列&#xff0c;以及 i.MX RT 系列&#xff0c;现在又推出新系列产品 MCX 产品&#xff0c;包括四个系列&#xff0c;目前已经发布产品的是 MCX N 系列。…

第十四天7.25(git)

1.git 1.git功能特性 1.克隆数据库版本&#xff1a;从服务器上克隆数据库本机上 2.提交代码&#xff1a;在本机上自己创建的分支上提交代码 3.合并分支&#xff1a;在本机上合并分支 4.拉取合并分支&#xff1a;新建一个分支&#xff0c;把服务器上最新的代码Fetch下来&…

微软工具合集 | Microsoft PowerToys v0.83.0

PowerToys是由微软开发的一款免费系统工具集&#xff0c;专为Windows 10和Windows 11系统设计。它提供了一系列高效实用的工具&#xff0c;旨在帮助用户提升操作系统的使用效率和个性化程度。PowerToys工具集深受系统管理员和高级用户的喜爱&#xff0c;通过集成多种工具&#…

XXE -靶机

XXE靶机 一.扫描端口 进入xxe靶机 1.1然后进入到kali里 使用namp 扫描一下靶机开放端口等信息 1.2扫描他的目录 二 利用获取的信息 进入到 robots.txt 按他给出的信息 去访问xss 是一个登陆界面 admin.php 也是一个登陆界面 我们访问xss登陆界面 随便输 打开burpsuite抓包 发…

《深入浅出WPF》学习笔记二.为对象属性赋值的三种方式

《深入浅出WPF》学习笔记二.为对象属性赋值的三种方式 WPF用户图形界面是树状结构 &#x1f446;wpf文档大纲 &#x1f446;winform文档大纲 wpf的用户图形界面是树状结构&#xff0c;与winform不同点在于&#xff0c;winform同样存在树状结构的控件(比如panel、gridcontrol等…

Wi-Fi、WLAN、Bluetooth、zigbee、蜂窝网络、4g5g、MQTT

为什么打开手机的WiFi连接&#xff0c;显示的是WLAN&#xff1f; 分清Wi-Fi、WLAN、Bluetooth、zigbee、蜂窝网络、4g5g、MQTT这些概念. 一、WLAN、WIFI、WAPI WLAN是利用无线通信技术在局部区域内构建的网络&#xff0c;家庭/办公室里的网络就是一个WLAN&#xff0c;WLAN是一…

【数据结构】Java实现二叉搜索树

二叉搜索树的基本性质 二叉搜索树&#xff08;Binary Search Tree, BST&#xff09;是一种特殊的二叉树&#xff0c;它具有以下特征&#xff1a; 1. 节点结构&#xff1a;每个节点包含一个键&#xff08;key&#xff09;和值&#xff08;value&#xff09;&#xff0c;以及指…

大语言模型中的提示隐私保护

大语言模型中的提示隐私保护 一、简介&#xff1a; 大语言模型&#xff08;LLM&#xff09; 拥有庞大的规模、预先训练的知识和卓越的性能&#xff0c;被广泛应用于各种任务。提示学习(prompt learning)和指令微调(instruction tuning) 是两种重要的使得大模型能理解具体任务…

决策树基础

概述 决策树是一种树型结构&#xff0c;其中每个内部结点表示在一个属性上的测试&#xff0c;每个分支代表一 个测试输出&#xff0c;每个叶结点代表一种类别。决策树学习采用的是自顶向下的递归方法&#xff0c;其基本思想是以信息熵为度量构造一棵熵值下降最快的树&#xff…

自学Java第16Day

学习目标&#xff1a;面向对象进阶 学习内容&#xff1a;Object、Objects、BigInteger、BigDecimal、正则表达式 学习时间&#xff1a;下午 3 点-下午 6 点 学习产出&#xff1a; 1. Object类 1.1 概述 查看API文档&#xff0c;我们可以看到API文档中关于Object类的定义如下&…

【SpringBoot3】场景整合(实战)

0 环境准备 0.0 云服务器 阿里云、腾讯云、华为云 服务器开通&#xff1b; 按量付费&#xff0c;省钱省心 安装以下组件&#xff1a;docker、redis、kafka、prometheus、grafana 下载windterm&#xff1a; https://github.com/kingToolbox/WindTerm/releases/download/2.5…

React-Native 宝藏库大揭秘:精选开源项目与实战代码解析

1. 引言 1.1 React-Native 简介 React-Native 是由 Facebook 开发的一个开源框架&#xff0c;它允许开发者使用 JavaScript 和 React 的编程模型来构建跨平台的移动应用。React-Native 的核心理念是“Learn Once, Write Anywhere”&#xff0c;即学习一次 React 的编程模型&am…

《LeetCode热题100》---<5.普通数组篇六道>

本篇博客讲解LeetCode热题100道普通数组篇中的六道题 第一道&#xff1a;最大子数组和&#xff08;中等&#xff09; 第二道&#xff1a;合并区间&#xff08;中等&#xff09; 第一道&#xff1a;最大子数组和&#xff08;中等&#xff09; 法一&#xff1a;贪心算法 class So…