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

news/2024/9/22 16:36:30 标签: arcgis, javascript, 开发语言

 

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

javascript"><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

javascript"><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

javascript"><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

javascript"><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

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.niftyadmin.cn/n/5670585.html

相关文章

Java笔试面试题AI答之单元测试JUnit(7)

文章目录 37. 请列举一些JUnit扩展 &#xff1f;1. 参数化测试2. 条件测试执行3. 临时目录4. 时间测试5. 重复测试6. 前置/后置条件7. Mockito8. Spring Test9. JUnit Vintage10. Testcontainers11. 自定义注解和扩展12. 测试监听器&#xff08;TestListener 和 RunListener&am…

深入理解前端拖拽:从基础实现到事件冒泡与委托的应用【面试真题】

在前端开发中&#xff0c;拖拽功能是一项常见的交互需求。通过监听鼠标或触摸事件&#xff0c;用户可以拖动元素并将其放置到指定位置。理解拖拽的底层实现、如何判断拖拽的是子元素还是父元素&#xff0c;以及事件冒泡和事件委托的原理&#xff0c;可以帮助我们更好地实现复杂…

C++之 虚 纯虚

虚函数 virtual void fun() { }; 子类重写函数&#xff0c;但父类也有函数&#xff08;实体类&#xff09; 纯虚函数 virtual void fun()0; 子类重写函数&#xff0c;父类只有函数声明&#xff08;抽象类&#xff09; 虚析构 virtual ~void fun() { }; 如果子类中有属性开辟到堆…

LeetCode_sql_day31(1384.按年度列出销售总额)

目录 描述 1384.按年度列出销售总额 数据准备 分析 法一 法二 代码 总结 描述 1384.按年度列出销售总额 Product 表&#xff1a; ------------------------ | Column Name | Type | ------------------------ | product_id | int | | product_name | var…

计算机毕业设计 基于 Hadoop平台的岗位推荐系统 SpringBoot+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

深度学习02-pytorch-06-张量的形状操作

在 PyTorch 中&#xff0c;张量的形状操作是非常重要的&#xff0c;可以让你灵活地调整和处理张量的维度和数据结构。以下是一些常用的张量形状函数及其用法&#xff0c;带有详细解释和举例说明&#xff1a; 1. reshape() 功能: 改变张量的形状&#xff0c;但不改变数据的顺序…

2.《DevOps》系列K8S部署CICD流水线之部署NFS网络存储与K8S创建StorageClass

架构 服务器IP服务名称硬件配置192.168.1.100k8s-master8核、16G、120G192.168.1.101k8s-node18核、16G、120G192.168.1.102k8s-node28核、16G、120G192.168.1.103nfs2核、4G、500G操作系统:Rocky9.3 后续通过K8S部署GitLab、Harbor、Jenkins 一、环境准备 #关闭防火墙开机自…

【Delphi】通过 LiveBindings Designer 链接控件示例

本教程展示了如何使用 LiveBindings Designer 可视化地创建控件之间的 LiveBindings&#xff0c;以便创建只需很少或无需源代码的应用程序。 在本教程中&#xff0c;您将创建一个高清多设备应用程序&#xff0c;该应用程序使用 LiveBindings 绑定多个对象&#xff0c;以更改圆…