利用Leaflet + React:构建WEBGIS

 React是 Facebook 开发的一个开源库,用于构建用户界面。就其本身而言,Leaflet是一个用于将地图发布到网络的JavaScript 库。这两个工具的组合很简单,允许您创建动态网络地图。在本文中,我们将看到这种组合的一些特征以及一些简单的示例,作为结合使用Leaflet 和 React的介绍。

React 和 Leaflet 功能

React 允许您从称为组件的各个部分构建用户界面。 React 组件是 JavaScript 函数,它使用称为JSX的标记语法。它是 React 流行的 JavaScript 语法的扩展。将 JSX 标记放在相关渲染逻辑附近使得 React 组件易于创建、维护和删除。React 的一些特性是:

·React 组件接收数据并返回屏幕上应显示的内容,从而允许您向页面添加交互性。

·React 使用状态和属性系统,使数据管理和组件之间的通信变得更加容易。这在使用地图并且我们需要动态更新用户界面时非常有用。

· React 使用Virtual DOM来优化 DOM 更新,提高应用程序性能并提供更流畅的用户体验。

Leaflet 是一个开源 JavaScript 库,广泛用于将地图发布到网络上。Leaflet 的设计考虑到了简单性、性能和可用性。Leaflet很轻,但它有很多插件可以让你快速添加新功能,并且它还有一个易于使用且文档齐全的API。

React 和 Leaflet 入门

要使用 React,我们需要安装Node和 npm。首先是在 React 中创建一个新项目:

npx create-react-app react-leaflet-examplecd react-leaflet-example

项目中创建了一个新文件夹,我们进入它并安装我们需要的库:

npm install leaflet react-leaflet

此操作的结果是,我们将拥有一组包含基本应用程序的文件和文件夹。基于这个“模型”我们可以开始创建我们的网站。我们打开src/App.js并编辑其内容:

import React, { useState } from 'react';import { MapContainer, TileLayer, Polygon, Popup } from 'react-leaflet';import 'leaflet/dist/leaflet.css';

在这里,我们导入了地图所需的模块。根据地图的内容,我们将使用相应的模块。在这个例子中,我们将添加一个背景层(Tilelayer ),一个由多边形( Polygon )组成的矢量图层,我们将添加一个弹出窗口或弹出窗口,当单击我们所在的多边形时,它将打开将要创建(弹出窗口)。此外,我们需要导入 Leaflet 样式表 (leaflet.css)。

添加矢量图层

一旦我们有了所有可用的模块,我们就开始创建网页和地图。我们继续编辑 App.js 文件以添加以下内容:

const App = () => {  const [polygonCoords] = useState([    [40.96548, -5.66443], [40.96527, -5.66338], [40.96451, -5.66373], [40.9647, -5.66468]  ]);
   return (    <MapContainer center={[40.965, -5.664]} zoom={15} style={{ height: '400px', width: '100%' }}>      <TileLayer        url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"        attribution='&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'      />
      <Polygon        positions={polygonCoords}        pathOptions={{ color: 'blue' }}      >        <Popup>          <p>市长广场</p>        </Popup>      </Polygon>    </MapContainer>  );};
export default App;

正如您所看到的,我们所做的第一件事是指示我们要绘制的多边形的一些坐标。

接下来,我们定义包含地图参数的MapContainer元素,例如地图的中心、初始缩放级别和尺寸。这些是 Leaflet 构建地图所需的数据。创建容器后,我们可以开始将元素添加到地图中:

·<TileLayer>将 OpenStreetMap 图层添加到地图中。

·<Polygon>创建一个矢量图层,该矢量图层由具有我们之前定义的坐标的多边形形成

·<Popup>打开一个弹出窗口,其中包含单击多边形时指示的文本。

完成编辑 App.js 文件后,我们可以在浏览器中看到结果。为此,我们使用以下命令启动浏览器:npm start

我们打开浏览器http://localhost:3000/查看结果。

创建图层控件

Web 地图通常具有的基本元素是用于激活/停用地图图层的图层控件。Leaflet有图层控制。

这次,除了我们在上一个示例中使用的模块之外,我们还必须添加两个模块。

import { MapContainer, TileLayer, Polygon, Popup, LayerGroup, LayersControl } from 'react-leaflet';

在上一行中,您可以看到我们添加了LayerGroupLayersControl模块,它们分别负责创建图层组和图层控件。为了创建图层控件,我们使用以下代码:

import React, { useState } from 'react';import { MapContainer, TileLayer, Polygon, Popup, LayerGroup, LayersControl } from 'react-leaflet';import 'leaflet/dist/leaflet.css';
const { BaseLayer, Overlay } = LayersControl;
const App = () => {  const center = [40.965, -5.664]; // Coordenadas del centro del mapa  const [polygonCoords] = useState([    [40.96548, -5.66443], [40.96527, -5.66338], [40.96451, -5.66373], [40.9647, -5.66468]  ]);  return (    <MapContainer center={center} zoom={16} style={{ height: '400px', width: '100%' }}>            <LayersControl position="topright">        <BaseLayer checked name="OpenStreetMap">          <TileLayer            url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"            attribution='&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'          />        </BaseLayer>
                <BaseLayer name="OpenTopoMap">          <TileLayer            url= "https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png"          />        </BaseLayer>
        <Overlay checked name="Marcadores">          <LayerGroup>            <Polygon              positions={polygonCoords}              pathOptions={{ color: 'blue' , fillColor: 'red'}}             >        <Popup>          <p>Plaza mayor de Salamanca</p>        </Popup>      </Polygon>          </LayerGroup>        </Overlay>      </LayersControl>    </MapContainer>  );};
export default App;

Leaflet 中的图层控件由基础图层或BaseLayer和覆盖图层或Overlay组成。在此示例中,有两个基础图层:OpenStreetmap 图层和 OpenTopoMap 图层。您可以从Leaflet 供应商列表中获取这些层的链接和属性。在Overlay中包括具有多边形的图层及其Popup

除了地图上的位置(position=»topright»)之外,控制图层还支持其他选项。我们可以使用折叠选项使图层控件从头开始显示。

<LayersControl position="topright" collapsed={false}>

在这种情况下,当我们保存在 App.js 中所做的修改时,地图视图将更新,显示我们创建的图层控件。

结论

将 Leaflet 与 React 集成可以让您创建动态网页,因为 React 负责有效更新用户界面以响应应用程序状态的变化。此外,React 使管理应用程序的状态变得更加容易,这在我们使用交互式地图时非常重要。它允许使用 React 状态处理地图位置、标记和其他地图相关数据。

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

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

相关文章

查找题(二分解法c++)

文章目录 【深基13.例1】查找题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示代码如下&#xff1a; 【深基13.例1】查找 题目描述 输入 n n n 个不超过 1 0 9 10^9 109 的单调不减的&#xff08;就是后面的数字不小于前面的数字&#xff09;非负整数 a 1 , a…

数据结构DAY3--栈与队列

栈&#xff1a; 是一种只能从一端操作的表&#xff0c;规则为先进后出。 主要操作步骤为&#xff1a;1.建立相关结构体 2.建立栈 3.增加栈 4.获得栈顶值 5.删除 6.修改 7.销毁 1.建立两个结构体 一个为链栈&#xff0c;一个为结点&#xff0c;链栈包括栈头&#xff08;指针…

多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络多输入多输出预测

多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络…

java数据结构与算法刷题-----LeetCode367. 有效的完全平方数

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 自实现Math.sqrt()函数&#xff1a;牛顿迭代法 自实现Math.sqrt(…

Redis单线程 VS 多线程

一、Redis 为什么选择单线程&#xff1f; 这种说法其实并不严谨&#xff0c;为什么这么说呢&#xff1f; Redis的版本有很多 3.x、4.x、6.x&#xff0c;版本不同架构也不同的&#xff0c;不限定版本问是否单线程也是不太严谨。 版本3.x&#xff0c;最早版本&#xff0c;也就…

项目架构MVC,DDD学习

写在前面 本文一起看下项目架构DDD&#xff0c;MVC相关的内容。 1&#xff1a;MVC 不管我们做什么项目&#xff0c;自己想想其实只是做了三件事&#xff0c;如下&#xff1a; 其实&#xff0c;这三件事完全在一个类中做完也可以可以正常把项目完成的&#xff0c;就像下面这…

【MacBook系统homebrew镜像记录】

安装 使用Homebrew 国内源安装脚本,贼方便&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"切换至清华大学镜像源&#xff1a; 命令合并&#xff1a; 分别切换了 brew.git、 homebrew-core.git、 homebrew-…

逆向案例十二——看准网企业信息json格式的信息

网址&#xff1a;【全国公司排行|排名榜单|哪家好】-看准网 打开开发者工具——刷新——网络——XHR——下滑页面加载新的页面——找到数据包 发现参数加密&#xff0c;返回的数据也进行了加密 按关键字在下方搜索 kiv进入第一个js文件 ctrlf打开文件里面的搜索框继续搜kiv找到…

12.手写JavaScript bind方法

一、核心思想 bind相比apply和call引入了闭包的思想&#xff0c;重点是正确找到this和arguments 二、代码实现 /*** 手写bind* param {Function} o 函数* param {Array} ...args1 数组* return 根据具体情况考虑*/ function Fn(a,b,c,d){console.log("this.name:"…

Java 面试宝典:Redis 的线程模型是怎么样的?

大家好&#xff0c;我是大明哥&#xff0c;一个专注「死磕 Java」系列创作的硬核程序员。 本文已收录到我的技术网站&#xff1a;https://www.skjava.com。有全网最优质的系列文章、Java 全栈技术文档以及大厂完整面经 Redis 的线程模型其实是分两块的&#xff1a; Redis 6.0 …

前端开发语言有那些?

前端开发语言有那些&#xff1f; 1、html 超文本标记语言&#xff1a;构建前端网页的基本结构&#xff0c;就象人的骨架一样。 2、css 层叠样式表&#xff1a;控制网页的样式和布局&#xff0c;就象人需要穿各种服式展现不同风采。 3、javascript 简称 JS 动态脚本语言&#x…

阿里面试总结

ThreadLocal 线程变量存放在当前线程变量中&#xff0c;线程上下文中&#xff0c;set将变量添加到threadLocals变量中 Thread类中定义了两个ThreadLocalMap类型变量threadLocals、inheritableThreadLocals用来存储当前操作的ThreadLocal的引用及变量对象&#xff0c;把当前线程…

gcc/g++:预编译阶段嵌入头文件并完成替换

预编译阶段嵌入头文件并完成替换首先需要找到需要包含头文件的位置&#xff0c;然后进行引入。 示例&#xff1a; 1&#xff09;用户头文件 /*brief design and implements of demo-for-precompile.author wenxuanpeiemail 15873152445163.com(query for any question here) …

括号串(Deque)

题目 import java.util.Deque; import java.util.LinkedList; import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();sc.nextLine();char[] c sc.nextLine().toCharArray();Deque…

Prompt提示词——常见的Prompt框架

以下是一些常见的Prompt框架&#xff0c;包括它们的原理、功能、使用场景、优缺点以及示例&#xff1a; BROKE框架&#xff1a; 原理&#xff1a;BROKE是一个结合了OKR&#xff08;Objectives and Key Results&#xff09;方法论的框架&#xff0c;通过提供背景、角色、目标、关…

柒拾贰- tushare 模拟策略交易 (三)

书接上两回 柒拾- tushare 模拟策略交易 &#xff08;一&#xff09; 柒拾壹- tushare 模拟策略交易 &#xff08;二&#xff09; 开始 终于我们可以可以来进行模拟了 复杂 的我不会&#xff0c;所以就写个最简单的策略吧&#xff1a; 买入条件 比两年前是上升的比一年前…

前端开发之el-select 设置默认值后选项无法切换

前端开发之el-select 设置默认值后选项无法切换 前言解决方案 前言 在实际使用过程中发现再给el-select设置默认值之后选项无法进行切换了 解决方案 为el-select添加 change“$forceUpdate()” 添加这个即可 <template><el-form-item label"数据类型"&g…

【题目】【信息安全管理与评估】2023年国赛信息安全管理与评估正式赛任务书-模块2

全国职业院校技能大赛高等职业教育组 信息安全管理与评估 任务书 模块二 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 竞赛任务书&#xff0c;赛题&#xff0c;解析&#xff0c;培训服务添加博主wx&#xff1a;liuliu5488233 网络安全事件…

speech to text 库FastASR交叉编译arm target的配置

FastASR是一个比较方便的SPEECH TO TEXT的AI库。开源。下面介绍下其在交叉编译到ARM target时候的交叉编译的cmake配置&#xff1a; cmake_minimum_required(VERSION 3.10)project(FastASR)SET(CMAKE_C_COMPILER "/home/xxx/buildroot/output/platform_name/host/bin/aar…

Flutter第六弹 基础列表ListView

目标&#xff1a; 1&#xff09;Flutter有哪些常用的列表组建 2&#xff09;怎么定制列表项Item&#xff1f; 一、ListView简介 使用标准的 ListView 构造方法非常适合只有少量数据的列表。我们还将使用内置的 ListTile widget 来给我们的条目提供可视化结构。ListView支持…