React Leaflet Esri 安装与使用

6 篇文章 0 订阅
6 篇文章 0 订阅

环境准备与基本使用

  1. 安装
npm install leaflet esri-leaflet
  1. 引入api
import L from "leaflet"
import * as esri from 'esri-leaflet';
  1. 引入css
import "../node_modules/leaflet/dist/leaflet.css"
  1. 补充说明
    1. esri-leaflet实际是在leaflet基础上继承扩展而来的,因此要使用esri-leaflet必须安装leaflet
    2. 以往直接和标签引入leaflet和esri-leaflet的cdn后,可以之际使用L.esri.xxx调用esri-leaflet的相关api
    3. 但在react中以import方式导入时,建议两个分开都要导入,并直接使用esri.xxx调用esri-leaflet的相关api

注意事项
上述关于引入说明,并不是最好的解决办法,只是暂时没有找到更好的处理方式

基本案例

加载MapService

前置说明

这里是将Arcgis-server中具有多个图层的地图对象整体当作一个leaflet中的一个layer对象进行添加。因此,不论Arcgis-server的地图中有多少各图层,leaflet都认为只有一个图层,简单来说url地址不需要带图层索引号

主要步骤

  1. 创建地图对象,并配置地图初始化属性(中心点,缩放层级)
  2. 创建dynamicMapLayer对象,并配置图层初始化属性(url)
  3. 加载到地图中
  4. 扩展步骤:在地图上绑定click事件,实现图层的indentify查询

实例代码

import React, { useEffect } from 'react';
import ReactDOM from 'react-dom';
import "./simpleDynamicMapLayer.css"
import L from "leaflet"
import * as esri from 'esri-leaflet';
import { message } from 'antd';
import PropertiesPopup from "../testPopup/PropertiesPopup"

function SimpleDynamicMapLayer(props) {

    useEffect(()=>{
        //创建地图对象
        let map = L.map('map').setView([29.654,106.145],13);
        //创建dynamicMapLayer对象,注意url结尾没有图层索引
        let layer = esri.dynamicMapLayer({ url: "https://localhost:6443/arcgis/rest/services/02_Tky_GDCGK/MapServer"})
        //添加到地图中
        layer.addTo(map);
        //向地图对象绑定click事件,执行identify查询
        map.on("click", (evt)=>{
            //注意查询过程利用链式语法执设置查询才是参数和回调
            layer.identify().at(evt.latlng).on(map).run((error, result) => {
                if(error){
                    message.error(error);
                    return
                }
                if(result.features.length>0)
                {
                    let div = document.createElement('div');
                    ReactDOM.render(PropertiesPopup(result.features[0].properties), div);
                    L.popup().setLatLng(evt.latlng).setContent(div).openOn(map);
                }
            })
        })
    },[])

    return (
        <div id = "map"></div>
    );
}

export default SimpleDynamicMapLayer;

代码说明

执行identify查询的链式语法各函数的意义

  1. identify():创建一个identify任务并返回任务对象
  2. at():指定indentify任务的中心点参数并返回任务对象
  3. on():指定indentify任务的在的空间边界,默认为地图容器的空间范围,返回任务对象
  4. run():执行indentify任务,指定执行后的回调,具体参数包括:
    1. error:执行失败的原因字符串
    2. result:查询的要素结果集合,一般可以用result.features访问到具体的结果要素列表

特别地,在esri-leaflet中所有的查询任务都是在run函数中指定回调函数,后期在做空间查询或属性查询时可沿用此规律

加载FeatureService

前置说明

这里是将一个Arcgis-server中的FS图层当作leaflet的一个图层,因此fs的url结尾要带图层索引号

主要步骤

  1. 创建地图对象,并配置地图初始化属性(中心点,缩放层级)
  2. 创建featureLayer对象,并配置图层初始化属性(url,要素渲染样式
  3. 加载到地图中

实例代码

import React, { useEffect } from 'react';
import ReactDOM from 'react-dom';
import L from "leaflet"
import * as esri from "esri-leaflet"
import "./simpleFeatureLayer.css"
import SimplePropertiesPopup from "../testPopup/PropertiesPopup"

function SimpleFeatureLayer(props) {
    
    useEffect(()=>{
        
        let map = L.map("map2").setView([29.776,106.308], 13);
        
        //注意示例中,0图层是一个点要素图层,其样式一定要在pointToLayer及进行指定
        let layer = esri.featureLayer({ 
            url:"http://localhost:6080/arcgis/rest/services/02_Tky_GDCGK/FeatureServer/0",
            pointToLayer: function (geojson, latlng) {
                return L.circleMarker(latlng, { radius: 5, color: "#2d84c8" })
            }})
        //注意:这里的click事件是绑定在FeatureLayer上的,而不是Map
        layer.on("click", (event)=>{
            let {properties} = event.sourceTarget.feature;
            let div = document.createElement('div');
            ReactDOM.render(SimplePropertiesPopup(properties), div)
            L.popup().setLatLng(event.latlng).setContent(div).openOn(map);
        })
        layer.addTo(map)
    },[])

    return (
        <div id="map2"></div>
    );
}


export default SimpleFeatureLayer;

代码说明

  1. 整体的加载步骤过程与dynamicMapLayer没有太大区别
  2. 因为featurelayer是一个可交互图层对象,因此click事件可以直接绑定到图层上,而不是map中
  3. 对于点状矢量图层一定要设置要通过config对象中的pointToLayer: function (geojson, latlng)回调设置要素样式,因为不论FS自身是什么样式,leaflet都不会加载,而是会按照默认leaflet自带的图标进行展示。
  4. 对于线状或面状图层,leaflet可以自动获得FS配置的要素样式,如无特殊需要可以不用单独配置,如果要在前端修改,指定style: function (feature)回调进行调整
React Leaflet是一个用于在React应用程序中集成Leaflet地图库的库。它允许您使用React组件的方式来创建和管理Leaflet地图。您可以使用React Leaflet来在React应用程序中绘制和操作Leaflet地图,并利用Leaflet提供的丰富功能和插件。您可以通过克隆Lantmäteriet的React Leaflet地图仓库、安装依赖并启动应用程序来了解更多关于React Leaflet的用法和示例。 另外,如果您想在React中绘制地图,您需要直接使用Leaflet库而不是Vue-Leaflet插件。您可以访问Leaflet官网了解更多关于Leaflet的用法和文档。 在React Leaflet中,您可以创建内容组件来显示地图元素的属性信息。例如,您可以创建一个名为SimplePropertiesPopup的组件,该组件将一个对象的key-value转换为一个无序列表(ul-li)的形式展示。您可以在该组件中使用map函数来遍历对象的属性,并将其渲染为列表项。通过导入该组件并在需要展示属性的地图元素上使用,您可以在React Leaflet中展示简单的要素属性列表。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [lantmateriet-leaflet-react:具有来自Lantmäteriet的图片的React Leaflet地图示例](https://download.csdn.net/download/weixin_42109732/18666610)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [leaflet地图在React中的使用](https://blog.csdn.net/Joey_Tribiani/article/details/124326145)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [ReactLeaflet 环境安装与基本使用](https://blog.csdn.net/cyoubo/article/details/118156333)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值