当前位置: 首页 > news >正文

OpenLayers数据源集成 -- 章节十三:EsriJSON图层详解

前言

在前面的文章中,我们学习了OpenLayers中TopoJSON图层的应用技术。本文将深入探讨OpenLayers中EsriJSON图层的应用技术,这是WebGIS开发中处理企业级地理数据格式的重要技术。EsriJSON作为Esri公司开发的地理数据格式,具有结构完整、功能丰富、兼容性强等优点,是ArcGIS生态系统中的重要数据格式。通过OpenLayers集成EsriJSON数据,我们可以充分利用ArcGIS的数据优势,实现专业级的地理信息应用。通过一个完整的示例,我们将详细解析EsriJSON图层的创建、数据加载和样式配置等关键技术。

项目结构分析

模板结构

<template><!--地图挂载dom--><div id="map"></div>
</template>

模板结构详解:

  • 地图容器: id="map" 作为地图的唯一挂载点
  • 极简设计: 采用最简化的模板结构,专注于EsriJSON图层功能展示
  • 注释说明: 明确标识地图挂载的DOM元素
  • 响应式布局: 通过CSS样式实现全屏显示效果

依赖引入详解

import Map from 'ol/Map';
import View from 'ol/View';
import EsriJSON from 'ol/format/EsriJSON';
import {Circle as CircleStyle, Fill, Stroke, Style} from 'ol/style';
import {Vector as VectorSource} from 'ol/source';
import { Vector as VectorLayer} from 'ol/layer';
import axios from 'axios'

依赖说明:

  • Map: OpenLayers的核心地图类,负责地图实例的创建和管理
  • View: 地图视图类,控制地图的显示范围、缩放级别和投影方式
  • EsriJSON: EsriJSON格式解析器,用于读取和解析EsriJSON数据
  • Circle as CircleStyle: 圆形样式类,用于创建点要素的圆形样式
  • Fill, Stroke, Style: 样式相关类,用于配置要素的外观样式
  • Vector as VectorSource: 矢量数据源类,用于存储和管理矢量要素
  • Vector as VectorLayer: 矢量图层类,用于显示矢量数据
  • axios: HTTP客户端库,用于发送网络请求

技术背景:

  • EsriJSON: Esri公司开发的地理数据格式
  • ArcGIS兼容: 与ArcGIS生态系统完全兼容
  • 企业级应用: 适合构建企业级和专业级地理信息应用
  • 异步加载: 支持异步数据加载和处理

样式配置详解

1. 基础样式组件

const image = new CircleStyle({radius: 5,fill: null,stroke: new Stroke({color: 'red',width: 1}),
});

CircleStyle圆形样式详解:

  • radius: 5 设置圆形半径为5像素
  • fill: null 不填充内部(透明)
  • stroke: 设置边框样式
  • color: 'red' 边框颜色为红色
  • width: 1 边框宽度为1像素

2. 多类型要素样式配置

const styles = {'Point': new Style({image: image,}),'LineString': new Style({stroke: new Stroke({color: 'green',width: 1,}),}),'MultiLineString': new Style({stroke: new Stroke({color: 'green',width: 1,}),}),'MultiPoint': new Style({image: image,}),'MultiPolygon': new Style({stroke: new Stroke({color: 'yellow',width: 1,}),fill: new Fill({color: 'rgba(255, 255, 0, 0.1)',}),}),'Polygon': new Style({stroke: new Stroke({color: 'blue',lineDash: [4],width: 3,}),fill: new Fill({color: 'rgba(0, 0, 255, 0.1)',}),}),'GeometryCollection': new Style({stroke: new Stroke({color: 'magenta',width: 2,}),fill: new Fill({color: 'magenta',}),image: new CircleStyle({radius: 10,fill: null,stroke: new Stroke({color: 'magenta',}),}),}),'Circle': new Style({stroke: new Stroke({color: 'red',width: 2,}),fill: new Fill({color: 'rgba(255,0,0,0.2)',}),}),
};

样式配置详解:

Point点样式
  • image: 使用预定义的圆形样式
  • 用途: 标记位置点、兴趣点等
LineString线样式
  • stroke: 线条边框样式
  • color: 'green' 绿色线条
  • width: 1 线条宽度1像素
  • 用途: 道路、河流、边界线等
MultiLineString多线样式
  • stroke: 多线条边框样式
  • color: 'green' 绿色线条
  • width: 1 线条宽度1像素
  • 用途: 复杂的线性要素,如多条道路组成的路网
MultiPoint多点样式
  • image: 使用预定义的圆形样式
  • 用途: 多个点要素的集合
MultiPolygon多面样式
  • stroke: 多面边框样式
  • color: 'yellow' 黄色边框
  • width: 1 边框宽度1像素
  • fill: 多面填充样式
  • color: 'rgba(255, 255, 0, 0.1)' 黄色半透明填充
  • 用途: 多个面要素的集合,如多个湖泊、多个行政区划
Polygon面样式
  • stroke: 面边框样式
  • color: 'blue' 蓝色边框
  • lineDash: [4] 虚线样式,4像素实线
  • width: 3 边框宽度3像素
  • fill: 面填充样式
  • color: 'rgba(0, 0, 255, 0.1)' 蓝色半透明填充
  • 用途: 行政区划、建筑物、湖泊等
GeometryCollection集合样式
  • stroke: 集合要素边框样式
  • color: 'magenta' 洋红色边框
  • width: 2 边框宽度2像素
  • fill: 集合要素填充样式
  • color: 'magenta' 洋红色填充
  • image: 集合要素点样式
  • radius: 10 圆形半径10像素
  • stroke: 洋红色边框
  • 用途: 包含多种几何类型的复合要素
Circle圆形样式
  • stroke: 圆形边框样式
  • color: 'red' 红色边框
  • width: 2 边框宽度2像素
  • fill: 圆形填充样式
  • color: 'rgba(255,0,0,0.2)' 红色半透明填充
  • 用途: 圆形区域、缓冲区等

3. 动态样式函数

const styleFunction = function (feature) {return styles[feature.getGeometry().getType()];
};

样式函数详解:

  • 参数: feature 要素对象
  • 功能: 根据要素的几何类型返回对应样式
  • 实现: 通过 feature.getGeometry().getType() 获取几何类型
  • 优势: 支持多种几何类型的统一管理

异步数据加载详解

1. Axios网络请求

axios.get('http://localhost:8888/openlayer/esrijson/esrijson.json').then((response) => {// 处理响应数据}).catch(function (error) {console.log(error);});

网络请求详解:

  • axios.get: 发送GET请求获取EsriJSON数据
  • URL: 'http://localhost:8888/openlayer/esrijson/esrijson.json' 数据文件地址
  • then: 请求成功时的回调函数
  • catch: 请求失败时的错误处理

2. EsriJSON数据解析

let esriJSON = new EsriJSON();
let arr = response.data;
const vectorSource = new VectorSource();
for (const arrElement of arr) {//读取后台响应的esrijson数据,读取要素信息,添加到矢量数据源let feature = esriJSON.readFeature(arrElement);vectorSource.addFeature(feature);
}

数据解析详解:

  • esriJSON: 创建EsriJSON格式解析器实例
  • arr: 响应数据数组,包含多个EsriJSON要素
  • vectorSource: 创建矢量数据源实例
  • for循环: 遍历数组中的每个要素
  • readFeature: 将EsriJSON格式转换为OpenLayers要素对象
  • addFeature: 将要素添加到数据源中

地图初始化详解

1. 地图实例创建

const vector = new VectorLayer({//矢量数据源source: vectorSource,//样式设置style: styleFunction
});this.map = new Map({layers: [vector],target: 'map',view: new View({center: [0, 0],zoom: 5,projection: "EPSG:4326", //指定投影}),
});

配置详解:

VectorLayer矢量图层配置
  • source: vectorSource 矢量数据源实例
  • style: styleFunction 样式函数
View视图配置
  • center: [0, 0] 地图中心点
  • 经度: 0° (本初子午线)
  • 纬度: 0° (赤道)
  • 地理位置: 非洲西海岸,大西洋中部
  • projection: "EPSG:4326" 使用WGS84地理坐标系
  • zoom: 5 缩放级别,适合显示全球范围

EsriJSON技术原理

1. EsriJSON vs GeoJSON

EsriJSON特点:

  • ArcGIS兼容: 与ArcGIS生态系统完全兼容
  • 企业级: 适合企业级和专业级应用
  • 功能丰富: 支持更多ArcGIS特有功能
  • 数据完整: 包含完整的几何和属性信息

数据结构对比:

// GeoJSON结构
{"type": "Feature","geometry": {"type": "Point","coordinates": [0, 0]},"properties": {"name": "Test Point"}
}// EsriJSON结构
{"geometry": {"x": 0,"y": 0,"spatialReference": {"wkid": 4326}},"attributes": {"name": "Test Point"}
}

2. EsriJSON格式解析

let esriJSON = new EsriJSON();
let feature = esriJSON.readFeature(arrElement);

解析过程详解:

  • 创建解析器: 实例化EsriJSON格式解析器
  • 读取要素: 将EsriJSON格式转换为OpenLayers要素对象
  • 坐标转换: 自动处理坐标系统和投影转换
  • 属性映射: 将attributes映射为properties

核心API方法总结

VectorLayer对象方法

方法功能参数返回值示例
getSource()获取数据源-VectorSourcelayer.getSource()
setSource(source)设置数据源VectorSource-layer.setSource(source)
setStyle(style)设置样式Style/Function-layer.setStyle(styleFunc)
getStyle()获取样式-Style/Functionlayer.getStyle()
setOpacity(opacity)设置透明度Number(0-1)-layer.setOpacity(0.7)
getOpacity()获取透明度-Numberlayer.getOpacity()
setVisible(visible)设置可见性Boolean-layer.setVisible(false)
getVisible()获取可见性-Booleanlayer.getVisible()

VectorSource对象方法

方法功能参数返回值示例
addFeature(feature)添加单个要素Feature-source.addFeature(feature)
addFeatures(features)添加多个要素Feature[]-source.addFeatures(features)
removeFeature(feature)移除要素Feature-source.removeFeature(feature)
clear()清空所有要素--source.clear()
getFeatures()获取所有要素-Feature[]source.getFeatures()
getFeatureById(id)根据ID获取要素String/NumberFeaturesource.getFeatureById('1')

EsriJSON对象方法

方法功能参数返回值示例
readFeature(esrijson)读取单个要素ObjectFeatureesriJSON.readFeature(data)
readFeatures(esrijson)读取多个要素ObjectFeature[]esriJSON.readFeatures(data)
writeFeature(feature)写入单个要素FeatureObjectesriJSON.writeFeature(feature)
writeFeatures(features)写入多个要素Feature[]ObjectesriJSON.writeFeatures(features)

实际应用扩展

1. 批量数据加载优化

// 优化后的批量加载方式
axios.get('http://localhost:8888/openlayer/esrijson/esrijson.json').then((response) => {let esriJSON = new EsriJSON();let arr = response.data;// 批量读取要素let features = esriJSON.readFeatures(arr);// 创建数据源并批量添加要素const vectorSource = new VectorSource();vectorSource.addFeatures(features);// 创建图层const vector = new VectorLayer({source: vectorSource,style: styleFunction});// 创建地图this.map = new Map({layers: [vector],target: 'map',view: new View({center: [0, 0],zoom: 5,projection: "EPSG:4326"})});}).catch(function (error) {console.log(error);});

2. 动态要素添加

// 动态添加EsriJSON要素
function addEsriJSONFeature(esriJSONData) {const esriJSON = new EsriJSON();const feature = esriJSON.readFeature(esriJSONData);const source = this.map.getLayers().getArray()[0].getSource();source.addFeature(feature);
}// 使用示例
const newFeature = {geometry: {x: 116.3974,y: 39.9093,spatialReference: { wkid: 4326 }},attributes: {name: '北京',type: 'city'}
};addEsriJSONFeature(newFeature);

3. 要素交互功能

// 要素点击事件
function setupFeatureInteraction() {const vectorLayer = this.map.getLayers().getArray()[0];this.map.on('click', (event) => {const features = this.map.getFeaturesAtPixel(event.pixel);if (features.length > 0) {const feature = features[0];const properties = feature.getProperties();console.log('点击的要素:', properties);// 高亮显示highlightFeature(feature);}});
}// 要素高亮显示
function highlightFeature(feature) {const highlightStyle = new Style({stroke: new Stroke({color: 'red',width: 3}),fill: new Fill({color: 'rgba(255, 0, 0, 0.3)'})});feature.setStyle(highlightStyle);
}

4. 条件样式配置

// 根据属性值设置样式
const conditionalStyleFunction = (feature) => {const properties = feature.getProperties();const geometryType = feature.getGeometry().getType();// 根据属性值设置不同样式if (properties.type === 'important') {return new Style({stroke: new Stroke({color: 'red',width: 3}),fill: new Fill({color: 'rgba(255, 0, 0, 0.3)'})});} else {return styles[geometryType];}
};

5. 数据统计功能

// 统计EsriJSON数据信息
function getEsriJSONStatistics() {const layer = this.map.getLayers().getArray()[0];const source = layer.getSource();const features = source.getFeatures();const stats = {total: features.length,byType: {},byAttribute: {}};features.forEach(feature => {const type = feature.getGeometry().getType();const attributes = feature.getProperties();stats.byType[type] = (stats.byType[type] || 0) + 1;Object.keys(attributes).forEach(key => {if (!stats.byAttribute[key]) {stats.byAttribute[key] = {};}const value = attributes[key];stats.byAttribute[key][value] = (stats.byAttribute[key][value] || 0) + 1;});});return stats;
}

总结

本文详细介绍了OpenLayers中EsriJSON图层的使用方法,主要知识点包括:

  1. EsriJSON集成: 通过VectorLayer和VectorSource集成EsriJSON数据
  2. 异步数据加载: 使用axios进行网络请求和数据加载
  3. 格式解析: EsriJSON格式的解析和转换过程
  4. 样式配置系统: 多种几何类型的样式设置和动态样式函数
  5. 性能优化: 批量加载、样式缓存、分页加载等优化策略
  6. 错误处理: 数据验证、网络错误处理、样式错误处理

通过 VectorLayer 和 VectorSource 的组合使用,我们可以灵活地管理和显示EsriJSON数据。EsriJSON作为企业级地理数据格式,具有以下优势:

  • ArcGIS兼容: 与ArcGIS生态系统完全兼容
  • 企业级: 适合企业级和专业级应用
  • 功能丰富: 支持更多ArcGIS特有功能
  • 数据完整: 包含完整的几何和属性信息


文章转载自:

http://LF6wIFx7.mnnxt.cn
http://xQdy4hDK.mnnxt.cn
http://VBSDco6E.mnnxt.cn
http://7Uzq03yn.mnnxt.cn
http://cnmVHnJJ.mnnxt.cn
http://b9ng88zb.mnnxt.cn
http://VizwNZJT.mnnxt.cn
http://Cnezij7e.mnnxt.cn
http://JOGd576B.mnnxt.cn
http://DsnNgZmw.mnnxt.cn
http://XCSOQHWF.mnnxt.cn
http://MRY30Exu.mnnxt.cn
http://mp4jFtl6.mnnxt.cn
http://diz9Sx0T.mnnxt.cn
http://rzliuRUd.mnnxt.cn
http://v6HaDv0y.mnnxt.cn
http://ctVkwALL.mnnxt.cn
http://OYKSopt6.mnnxt.cn
http://v4zxYtbv.mnnxt.cn
http://y0TteY7w.mnnxt.cn
http://ATEWs8Ff.mnnxt.cn
http://PdVGdmfX.mnnxt.cn
http://qwrH5Lhz.mnnxt.cn
http://3nuxpH7X.mnnxt.cn
http://5wCqUYCE.mnnxt.cn
http://syGeqqEj.mnnxt.cn
http://aSJELnoe.mnnxt.cn
http://Lo7X83yO.mnnxt.cn
http://2pOhQbhE.mnnxt.cn
http://w6DI3Prh.mnnxt.cn
http://www.dtcms.com/a/385123.html

相关文章:

  • RabbitMQ—运维篇
  • 一站式YOLO目标检测解决方案:训练、测试、推理与数据集转换全流程指南
  • lamp脚本部署
  • 前端构建工具有哪些?常用前端构建工具对比、前端构建工具推荐与最佳实践分析
  • Charles日志分析与流量监控技巧 高效排查接口与性能问题
  • ACM模式的输入部分——input().strip() 与 sys.stdin.readline() 的不同
  • ““.equals(studentID)
  • 【Lesson 3】CUDA 编程模型:线程、块、网格 —— Ubuntu 22.04 + RTX 30/40 系列实战
  • [Windows]C盘瘦身 --- 软件搬家
  • CLIP 完全上手指南:从安装、下载加速、文本/图像编码到图文匹配,一篇全搞定!
  • BKY莱德因:5大黑科技逆转时光
  • 开源嵌入模型推荐与选型指南
  • 科普:Python中为什么“from .utils” 不能写成 “from ./utils”?
  • 客户粘性提升策略是什么?系统化策略提升客户粘性指南
  • Spring 框架从入门到精通(第一篇)—— 框架核心与 IOC 容器实践
  • 通过DSL生成Jenkins流水线
  • 构建AI智能体:三十四、LangChain SQLDatabaseToolkit终极指南:架构、优势与最佳实践
  • 算法 --- 字符串
  • PDF 文件创建时间属性怎样批量修改详细教程
  • hutool DesensitizedUtil
  • train.py代码学习 自学
  • 安全与效率的平衡术:安全空间
  • 【Unity】事件分发系统的使用示例
  • dinov3 源码 笔记1
  • 飞书项目,再交卷中国智造
  • c++多线程(3)------休眠函数sleep_for和sleep_until
  • 正则表达式 - 元字符
  • RDS-MYSQL,这个RDS是什么?和mysql有什么区别?
  • HarmonyOS事件订阅与通知:后台事件处理
  • 医疗器械飞检常见问题:强生测量系统分析中30%误差的改进方法