GIS开发之如何使用OpenLayers,Leaflet,Mapbox,Cesium,ArcGIS, Turf.js 与 D3.js

 

1、OpenLayers

  • 描述:OpenLayers是一个高性能、开源的JavaScript库,用于在Web上创建富有的地图应用。它支持多种地图数据源,包括从瓦片服务到矢量数据,并提供了大量的交互功能。
  • 特点:功能强大、灵活易用,支持多种地图投影、矢量数据和图层样式,具有强大的地图控件和交互功能。
  • 适用场景:适用于创建复杂的地图应用,如地理信息系统平台、环境监测与灾害管理、房地产与城市规划等。

2、Leaflet

  • 描述:Leaflet是一个轻量级、易于使用的开源JavaScript库,为开发者提供了创建交互式地图的强大工具。
  • 特点:简洁灵活,具有丰富的地图功能和插件生态系统,支持触控操作,非常适合快速开发项目。
  • 适用场景:适用于需要快速部署且对性能有一定要求的地图应用,如导航与路线规划应用、旅游与户外活动应用等。

3、Mapbox GL JS

  • 描述:Mapbox GL JS是基于WebGL的开源JavaScript库,专注于提供高性能的交互式地图渲染。
  • 特点:高性能、流畅的地图动画和快速的渲染速度,支持自定义地图风格和数据源,提供了丰富的地图样式和效果。
  • 适用场景:适用于需要高性能地图渲染和复杂地图样式的应用,如实时数据可视化、地理信息系统平台等。

4、Cesium.js

  • 描述:Cesium.js是一个开源的JavaScript库,用于创建高性能的三维地球和地理可视化应用程序。
  • 特点:基于WebGL技术,支持多种地理数据格式,提供了丰富的可视化功能和交互控制,适用于构建三维地球和地理可视化应用。
  • 适用场景:适用于需要三维地球展示和地理空间分析的应用,如航空航天、军事模拟、虚拟现实和增强现实应用等。

5、ArcGIS API for JavaScript

  • 描述:ArcGIS API for JavaScript是由Esri提供的一套用于构建地理信息应用程序的JavaScript API。
  • 特点:具备丰富的地图和地理数据功能,包括地理处理、空间分析和实时数据集成,提供了强大的工具和服务,支持ArcGIS Online和ArcGIS Enterprise中的数据和服务。
  • 适用场景:适用于需要与Esri产品和服务紧密集成的GIS应用,如企业级地理信息系统平台、环境监测与灾害管理等。

6、Turf.js

  • 描述:Turf.js是一个强大的地理空间分析库,用于在浏览器和Node.js环境中执行复杂的地理空间操作。
  • 特点:提供了一系列的模块来处理地理空间数据,包括计算距离、面积、缓冲区、叠加分析等,常与上述地图库结合使用以增强分析能力。
  • 适用场景:适用于需要进行地理空间分析和数据处理的GIS应用,如空间查询、地理编码、空间统计分析等。

7、D3.js(虽然主要是一个数据可视化库):

  • 描述:D3.js是一个强大的数据可视化库,但在WebGIS领域也非常有用,特别是当涉及到地理空间数据的复杂可视化时。
  • 特点:提供了丰富的数据可视化工具和函数,支持自定义的地理空间图表和交互式信息图。
  • 适用场景:适用于需要复杂数据可视化的GIS应用,如实时数据监控、地理数据统计分析等。

1. 使用 OpenLayers

<template><div ref="mapContainer" style="height: 400px;"></div>
</template><script setup>
import { ref, onMounted } from 'vue'
import 'ol/ol.css'
import { Map, View } from 'ol'
import TileLayer from 'ol/layer/Tile'
import OSM from 'ol/source/OSM'
import { fromLonLat } from 'ol/proj'
import { Point } from 'ol/geom'
import { Feature } from 'ol'
import { Style, Icon } from 'ol/style'
import VectorLayer from 'ol/layer/Vector'
import VectorSource from 'ol/source/Vector'
import Overlay from 'ol/Overlay'const mapContainer = ref(null)onMounted(() => {const center = fromLonLat([110.088076, 36.126396])const marker = new Feature({geometry: new Point(center),})const markerStyle = new Style({image: new Icon({src: 'https://openlayers.org/en/v4.6.5/examples/data/icon.png',}),})marker.setStyle(markerStyle)const vectorSource = new VectorSource({features: [marker],})const vectorLayer = new VectorLayer({source: vectorSource,})const map = new Map({target: mapContainer.value,layers: [new TileLayer({source: new OSM(),}),vectorLayer,],view: new View({center,zoom: 6,minZoom: 5,maxZoom: 12,}),})const overlay = new Overlay({element: document.createElement('div'),positioning: 'bottom-center',stopEvent: false,offset: [0, -50],})map.addOverlay(overlay)marker.getGeometry().on('change', function () {const markerPosition = map.getPixelFromCoordinate(center)overlay.setPosition(center)overlay.getElement().innerHTML = 'Hello World'})
})
</script>

**解释**:
- 使用`ol.Map`创建地图。
- 限制地图的显示区域通过`zoom`控制。
- 创建了一个标记`Feature`并应用自定义样式。
- 鼠标悬浮时,使用`Overlay`展示信息窗体。
 

2. 使用 Leaflet

<template><div id="map" style="height: 400px;"></div>
</template><script setup>
import { onMounted } from 'vue'
import L from 'leaflet'onMounted(() => {const map = L.map('map').setView([36.126396, 110.088076], 6)L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map)const marker = L.marker([36.126396, 110.088076]).addTo(map)marker.bindPopup('Hello World').openPopup()map.setMaxBounds([[38.5, 121.1], // 辽宁省大概范围[39.1, 122.7],])
})
</script>

 **解释**:
- `L.map`创建了一个地图并设置中心点。
- 使用`L.marker`在中心点标记,并绑定悬浮显示的Popup信息。
- `setMaxBounds`限制辽宁省的地图区域。

3. 使用 Mapbox GL JS

<template><div id="map" style="height: 400px;"></div>
</template><script setup>
import { onMounted } from 'vue'
import mapboxgl from 'mapbox-gl'mapboxgl.accessToken = 'your_mapbox_access_token'onMounted(() => {const map = new mapboxgl.Map({container: 'map',style: 'mapbox://styles/mapbox/streets-v11',center: [110.088076, 36.126396],zoom: 6,})new mapboxgl.Marker().setLngLat([110.088076, 36.126396]).addTo(map)map.on('mouseenter', () => {new mapboxgl.Popup().setLngLat([110.088076, 36.126396]).setHTML('<h1>Hello World</h1>').addTo(map)})map.setMaxBounds([[118, 39], // Approximate bounds for Liaoning[124, 43],])
})
</script>

 **解释**:
- `mapboxgl.Map`创建了地图,并设置地图样式。
- 使用`mapboxgl.Marker`标记中心点,并绑定悬浮显示Popup。
- `setMaxBounds`限制地图的显示区域。

 4. 使用 Cesium.js

<template><div id="cesiumContainer" style="height: 400px;"></div>
</template><script setup>
import { onMounted } from 'vue'
import Cesium from 'cesium'onMounted(() => {const viewer = new Cesium.Viewer('cesiumContainer', {imageryProvider: new Cesium.OpenStreetMapImageryProvider({url: 'https://a.tile.openstreetmap.org/',}),baseLayerPicker: false,geocoder: false,})viewer.camera.setView({destination: Cesium.Cartesian3.fromDegrees(110.088076, 36.126396, 1000000),})const entity = viewer.entities.add({position: Cesium.Cartesian3.fromDegrees(110.088076, 36.126396),point: {pixelSize: 10,color: Cesium.Color.RED,},label: {text: 'Hello World',verticalOrigin: Cesium.VerticalOrigin.BOTTOM,},})
})
</script>

 **解释**:
- 使用`Cesium.Viewer`创建地图。
- `viewer.entities.add`添加一个点标记并显示文本信息。
- 地图视角通过`setView`进行调整。

5. 使用 ArcGIS API for JavaScript

<template><div id="viewDiv" style="height: 400px;"></div>
</template><script setup>
import { onMounted } from 'vue'
import Map from '@arcgis/core/Map'
import MapView from '@arcgis/core/views/MapView'
import Graphic from '@arcgis/core/Graphic'onMounted(() => {const map = new Map({basemap: 'streets',})const view = new MapView({container: 'viewDiv',map,center: [110.088076, 36.126396],zoom: 6,})const point = {type: 'point',longitude: 110.088076,latitude: 36.126396,}const markerSymbol = {type: 'simple-marker',color: [226, 119, 40],}const pointGraphic = new Graphic({geometry: point,symbol: markerSymbol,popupTemplate: {title: 'Hello World',content: 'This is a marker popup',},})view.graphics.add(pointGraphic)
})
</script>

 **解释**:
- `Map`与`MapView`创建地图并设置中心点。
- 使用`Graphic`创建标记并设置信息窗体内容。

6. 使用 Turf.js 与 D3.js

这两个库主要用于地理计算与数据可视化,但并不直接用于地图展示或交互,通常需要配合其他库(如Leaflet或Mapbox GL JS)使用。
 

 

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

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

相关文章

举例说明:自然语言处理实战项目

自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;是人工智能领域的一个重要分支&#xff0c;旨在使计算机能够理解、解释和生成人类语言。以下是一些NLP实战项目的示例&#xff1a; 1. 情感分析&#xff08;Sentiment Analysis&#xff09; 项目描述: …

【LLM学习之路】9月16日 第六天

【LLM学习之路】9月16日 第六天 损失函数 L1Loss 可以取平均也可以求和 参数解析 input &#xff08;N&#xff0c;*&#xff09; N是batchsize&#xff0c;星号代表可以是任意维度 不是输入的参数&#xff0c;只是描述数据 target 形状要同上 MSELoss平方差 CrossEntr…

(done) 声音信号处理基础知识(5) (Types of Audio Features for Machine Learning)

参考&#xff1a;https://www.youtube.com/watch?vZZ9u1vUtcIA 声学特征描述了声音&#xff0c;不同特征捕捉声音的不同方面性质 声学特征有助于我们构建智能声学系统 声学特征分类有&#xff1a; 1.抽象等级 2.时域视野 3.音乐的部分 4.信号域 5.机器学习方法 如下图展示…

力扣中等 33.搜索旋转排序数组

文章目录 题目介绍题解 题目介绍 题解 首先用 153. 寻找旋转排序数组中的最小值 的方法&#xff0c;找到 nums 的最小值的下标 i。 然后分类讨论&#xff1a; 如果 target>nums[n−1]&#xff0c;在 [0,i−1] 中二分查找 target。 如果 target≤nums[n−1]&#xff0c;那…

51单片机——独立按键

一、独立按键对应单片机P3管脚&#xff0c;如图 二、按键点亮LED灯 #include <STC89C5xRC.H> void main() { while(1) { if(P300) { P200; } else { P201; } } } 当按键为0时&#xff0c;代表按下&#xff0c;所以当P30按下时&#xff0c;让P20&#xff1d;0&#…

二叉树(二)深度遍历和广度遍历

一、层序遍历 广度优先搜索&#xff1a;使用队列&#xff0c;先进先出 模板&#xff1a; 1、定义返回的result和用于辅助的队列 2、队列初始化&#xff1a; root非空时进队 3、遍历整个队列&#xff1a;大循环while(!que.empty()) 记录每层的size以及装每层结果的变量&a…

leetcode第十三题:罗马数字转整数

罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#x…

LeetCode[中等] 215. 数组中的第 K 个最大元素

给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 思路&#xff1a;基于快排改进的快速…

【全网最全】2024华为杯数学建模C题高质量成品查看论文!【附带全套代码+数据】

题 目&#xff1a; ___基于数据驱动下磁性元件的磁芯损耗建模 完整版获取&#xff1a; 点击链接加入群聊【2024华为杯数学建模助攻资料】&#xff1a;http://qm.qq.com/cgi-bin/qm/qr?_wv1027&kxtS4vwn3gcv8oCYYyrqd0BvFc7tNfhV7&authKeyedQFZne%2BzvEfLEVg2v8FOm%…

计算机基础(Computer Fundamentals)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

【学习笔记】手写Tomcat 四

目录 一、Read 方法返回 -1 的问题 二、JDBC 优化 1. 创建配置文件 2. 创建工具类 3. 简化 JDBC 的步骤 三、修改密码 优化返回数据 创建修改密码的页面 注意 测试 四、优化响应动态资源 1. 创建 LoginServlet 类 2. 把登录功能的代码放到 LoginServlet 类 3. 创…

关于有源蜂鸣器及无源蜂鸣器的区别及驱动各类单片机案例

关于有源蜂鸣器及无源蜂鸣器的区别及驱动各类单片机案例 有源蜂鸣器与无源蜂鸣器区别有源蜂鸣器无源蜂鸣器模块化有源蜂鸣器及无源蜂鸣器驱动方式的说明 有源、无源蜂鸣器代码驱动总结 有源蜂鸣器与无源蜂鸣器区别 有源蜂鸣器与无源蜂鸣器区别在于是否有振荡源。 有源蜂鸣器即…

【BEV 视图变换】Ray-based(2): 代码复现+画图解释 基于深度估计、bev_pool

paper&#xff1a;Lift, Splat, Shoot: Encoding Images from Arbitrary Camera Rigs by Implicitly Unprojecting to 3D code&#xff1a;https://github.com/nv-tlabs/lift-splat-shoot 一、完整复现代码(可一键运行)和效果图 import torch import torch.nn as nn import mat…

8587 行编辑程序

### 思路 1. **初始化栈**&#xff1a;创建一个空栈用于存储有效字符。 2. **读取输入**&#xff1a;读取输入的行数 n&#xff0c;然后逐行读取字符。 3. **处理字符**&#xff1a; - 如果是 #&#xff0c;则弹出栈顶字符&#xff08;如果栈不为空&#xff09;。 - 如果…

谷歌的AI反击战:创始人谢尔盖·布林的回归与大模型组合的未来

近年来&#xff0c;随着AI技术的迅猛发展&#xff0c;尤其是ChatGPT等大语言模型的出现&#xff0c;全球科技格局正发生剧烈变化。作为曾经引领AI潮流的谷歌&#xff0c;在这场竞争中逐渐失去了领头羊的地位。然而&#xff0c;谷歌的创始人之一谢尔盖布林&#xff08;Sergey Br…

黑马智数Day1

src文件夹 src 目录指的是源代码目录&#xff0c;存放项目应用的源代码&#xff0c;包含项目的逻辑和功能实现&#xff0c;实际上线之后在浏览器中跑的代码就是它们 apis - 业务接口 assets - 静态资源 &#xff08;图片&#xff09; components - 组件 公共组件 constants…

【WEB】序列一下

1、 2、反序列化 <?phpclass Polar{public $url polarctf.com;public $ltsystem;public $bls /;function __destruct(){$a $this->lt;$a($this->b);} }$a new Polar(); echo serialize($a); ?>###O:5:"Polar":3:{s:3:"url";s:12:"…

某乐指数爬虫逆向分析

目标网站 aHR0cHM6Ly93d3cuY2hpbmFpbmRleC5uZXQvcmFua2xpc3QvNS8w 一、抓包分析 明显请求参数有sign加密&#xff0c;有经验的很容易就知道这就是个MD5加密&#xff0c;在一个就是响应数据也加密了 二、逆向分析 搜索sign&#xff0c;直接定位到加密位置 进入方法内部 hae方…

win11 wsl2安装ubuntu22最快捷方法

操作系统是win11&#xff0c;wsl版本是wsl2&#xff0c;wsl应该不用多介绍了&#xff0c;就是windows上的虚拟机&#xff0c;在wsl上可以很方便的运行Linux系统&#xff0c;性能棒棒的&#xff0c;而且wsl运行的系统和win11主机之间的文件移动是无缝的&#xff0c;就是两个系统…

某建筑市场爬虫数据采集逆向分析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 目标网站 aHR0cHM6Ly9qenNjLm1vaHVyZC5nb3YuY24vZGF0YS9jb21wYW55P2NvbXBsZXhuYW1lPSVFNiVCMCVCNA 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面…