利用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.hqwc.cn/news/596964.html

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

相关文章

财富池指标--通达信涨跌停均线指标公式源码

今日分享的通达信涨跌停均线指标公式是一个均线分析涨跌停信号的指标。 具体信号说明&#xff1a; 当指标中出现黄色信号柱&#xff0c;是上涨的信号&#xff0c;可参考买入&#xff0c;当出现钱的图标的时候&#xff0c;是一字板的信号&#xff0c;一字板开板逃跑图标&#x…

c 语言 指数搜索(Exponential Search)

该搜索算法的名称可能会产生误导&#xff0c;因为它的工作时间为 O(Log n)。该名称来自于它搜索元素的方式。 给定一个已排序的数组和要 搜索的元素 x&#xff0c;找到 x 在数组中的位置。 输入&#xff1a;arr[] {10, 20, 40, 45, 55} x 45 输出&#xff1a;在索…

第⑪讲:Ceph集群OSD扩容方案及实现横向和纵向扩容

文章目录 1.Ceph集群OSD扩容方案2.实现OSD的横向扩容4.实现OSD的纵向扩容 1.Ceph集群OSD扩容方案 Ceph集群OSD的扩容支持两种方式&#xff1a; 横向扩容 通过增加OSD节点来达到扩容的目的。使用横向扩容要完成以下几个步骤&#xff1a; 在新的机器中进行初始化操作、配置Yum源…

授人以渔 选购篇四:电视选购要点

文章目录 系列文章屏幕尺寸显示技术与面板类型&#xff1a;优选OLED&#xff0c;Mini LED分辨率和刷新率&#xff1a;4K以上&#xff0c;优选120Hz以上画质支持HDR支持广色域选择RGB 3色支持运动补偿 智能操作系统品牌其他 系列文章 授人以渔 选购篇一&#xff1a;信用卡选购要…

【OJ】stack刷题

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 1. 155. 最小栈1.1 分析1.2 代码 2. JZ31 栈的压入、弹出序列2.1 分析2.2 代码 3. 150. 逆波兰表达式求值3.1 分析3.2 代码 1. 155. 最小栈 1.1 分析 利用两个栈&#xff0c;一个栈a负责入数据和出数据&#xff0c;另一个…

Java基于微信小程序的校园外卖平台系统,附源码

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

web自动化测试系列-如何选择实战项目(四)

目录 1.项目安装 2.项目优点 3.项目介绍 3.1 项目介绍 3.3 商品展示 接上文 &#xff1a;web自动化测试系列-页面元素该如何定位?(三)-CSDN博客 在后续的技术操作中都将会使用到项目 &#xff0c;如果你有自己的练手项目 &#xff0c;优先拿自己的项目做练习&#xff0c…

DFS:floodfill算法解决矩阵联通块问题

floodfill&#xff0c;翻译为洪水灌溉&#xff0c;而floodfill算法本质上是为了解决在矩阵中性质相同的联通块问题。 一、图像渲染 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int dx[4]{0,0,1,-1};int dy[4]{1,-1,0,0};int prev;//记住初始值int m,…

【随笔】Git 高级篇 -- 整理提交记录(上)cherry-pick(十五)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

【Linux实践室】Linux高级用户管理实战指南:创建与删除用户组操作详解

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;Linux创建用户组命令2.1.1 知识点讲解2.1.2…

建模实例评点(2)领域类图-食谱

1 00:00:00,290 --> 00:00:04,120 这是之前我们给一个用户 2 00:00:04,130 --> 00:00:05,360 给他出食谱的 3 00:00:05,370 --> 00:00:06,480 这样做的一个 4 00:00:06,650 --> 00:00:08,000 你认为你系统最重要的 5 00:00:08,010 --> 00:00:09,360 一个核心…

Vue基础知识:编程式导航有几种跳转方式?通过路径跳转(比较简单),通过路由名字跳转(适合路径名字比较长的情况)

1.通过路径跳转&#xff08;比较简单&#xff09; this.$router.push(路由路径)this.$router.push({path:路由路径 }) 案例演示&#xff1a; 1.简写 点击按钮 2.完整写法 绑定事件与上方相同&#xff0c;效果也相同。 2.通过路由名字跳转&#xff08;适合路径名字比较长的情…