安装
npm安装:
npm i ol
| <style> |
| .map-x { |
| width: 600px; |
| height: 600px; |
| } |
| </style> |
| |
| <div id="map" class="map-x"></div> |
| |
| <script> |
| import 'ol/ol.css' |
| import { Map, View } from 'ol' |
| import Tile from 'ol/layer/Tile' |
| import OSM from 'ol/source/OSM' |
| |
| new Map({ |
| target: 'map', |
| layers: [ |
| new Tile({ |
| source: new OSM() |
| }) |
| ], |
| view: new View({ |
| projection: "EPSG:4326", |
| center: [114.064839, 22.548857], |
| zoom: 12 |
| }) |
| }) |
| </script> |
cdn引入:
| <link href="https://cdn.bootcdn.net/ajax/libs/openlayers/7.3.0/ol.css" rel="stylesheet"> |
| <script src="https://cdn.bootcdn.net/ajax/libs/openlayers/7.3.0/dist/ol.js"></script> |
| <style> |
| |
| #map { |
| width: 100vw; |
| height: 100vh; |
| } |
| </style> |
| |
| |
| <div id="map"></div> |
| |
| <script> |
| var gaodeMapLayer = new ol.layer.Tile({ |
| source: new ol.source.XYZ({ |
| url: 'https://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}' |
| }) |
| }); |
| const map = new ol.Map({ |
| target: 'map', |
| layers: [ |
| gaodeMapLayer |
| ], |
| view: new ol.View({ |
| projection: "EPSG:4326", |
| center: [114.064839, 22.548857], |
| zoom: 12 |
| }) |
| }) |
| </script> |
基本流程
在页面创建地图:
- 引入
ol.js
和 ol.css
。
- 创建地图容器(一个
HTML
标签,通常使用 div
)。
- 设置地图容器宽高(必须做的一项!!!)。
- 使用
ol
绑定地图容器。
- 创建地图底图。
- 设置地图中心点。
ol.Map()
中有3个核心要素:
target
:绑定地图容器的属性,传入容器的 id
即可。
layers
:底图图层。ol
支持多图层配置,所以 layers
的值是一个数组。
view
:地图视图。可以配置地图的缩放、投影坐标系、中心点、旋转角度等配置项。
视图(ol.View)常用配置
- 投影坐标系
- 视图中心点
- 缩放级别
- 最大/最小缩放级别
minZoom: 10, // 设置最小缩放级别
maxZoom: 14, // 设置最大缩放级别
- 旋转地图
rotation: Math.PI / 180 * 45, // 旋转地图45度
图层(layers)模块
加载地图数据
| layers: [ |
| new ol.layer.Tile({ |
| source: new OSM() |
| }) |
| ] |
| var gaodeMapLayer = new ol.layer.Tile({ |
| source: new ol.source.XYZ({ |
| url: 'https://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}' |
| }) |
| }); |
| |
| layers: [ |
| gaodeMapLayer |
| ] |
显示/隐藏图层
| layers: [ |
| new ol.layer.Tile({ |
| source: new ol.source.OSM(), |
| visible: false |
| }) |
| ] |
使用 getVisible()
获取图层当前的 visible
状态,使用 setVisible
设置图层的 visible
。
| |
| function toggleLayer() { |
| let layers = map.getLayers() |
| let layer = layers.item(0) |
| let visible = layer.getVisible() |
| layer.setVisible(!visible) |
| } |
图层不透明度
| layers: [ |
| new ol.layer.Tile({ |
| source: new ol.source.OSM(), |
| opacity: 0.5 // 设置图层不透明度 |
| }) |
| ] |
使用 getOpacity()
方法获取图层的不透明度,使用 setOpacity()
设置图层不透明度。
| <style> |
| #map { |
| width: 400px; |
| height: 400px; |
| } |
| </style> |
| |
| <label for="checkboxEl">不透明度</label> |
| |
| <input |
| id="rangeEl" |
| type="range" |
| checked="true" |
| min="0" |
| max="1" |
| step="0.01" |
| value="0.5" |
| /> |
| |
| <div id="opacityValue">不透明度: 0.5</div> |
| |
| <div id="map"></div> |
| |
| <script src="../ol/ol.js"></script> |
| <script> |
| const map = new ol.Map({ |
| target: 'map', |
| layers: [ |
| new ol.layer.Tile({ |
| source: new ol.source.OSM(), |
| opacity: 0.5 |
| }) |
| ], |
| view: new ol.View({ |
| center: [0, 0], |
| zoom: 2 |
| }) |
| }) |
| |
| let rangeEl = document.getElementById('rangeEl') |
| rangeEl.addEventListener('change', function() { |
| let layers = map.getLayers() |
| let osmLayer = layers.item(0) |
| |
| osmLayer.setOpacity(parseFloat(this.value)) |
| |
| opacityValue.innerHTML = `不透明度: ${osmLayer.getOpacity()}` |
| }) |
| </script> |
切换底图
使用 setSource
切换底图
| <style> |
| #map { |
| width: 400px; |
| height: 400px; |
| } |
| </style> |
| |
| <button onclick="switchSource('osm')">设置为OSM</button> |
| <button onclick="switchSource('bingmap')">设置为BingMaps</button> |
| <div id="map"></div> |
| |
| <script src="../ol/ol.js"></script> |
| <script> |
| let osm = new ol.source.OSM() |
| |
| let bingmap = new ol.source.BingMaps({ |
| key: '你的key', |
| imagerySet: 'Aerial' |
| }) |
| |
| let layer = new ol.layer.Tile() |
| |
| let map = new ol.Map({ |
| target: 'map', |
| layers: [layer], |
| view: new ol.View({ |
| projection: "EPSG:4326", |
| center: [114.064839, 22.548857], |
| zoom: 12 |
| }) |
| }) |
| |
| |
| layer.setSource(osm) |
| |
| |
| function switchSource(data) { |
| switch(data) { |
| case 'osm': |
| layer.setSource(osm) |
| break |
| case 'bingmap': |
| layer.setSource(bingmap) |
| break |
| } |
| } |
| </script> |
加载矢量图
| |
| const map = new ol.Map({ |
| target: 'map', |
| layers: [ |
| new ol.layer.Vector({ |
| source: new ol.source.Vector({ |
| format: new ol.format.GeoJSON(), |
| url: '../data/geojson.json' |
| }) |
| }) |
| ], |
| view: new ol.View({ |
| center: [0, 0], |
| zoom: 2 |
| }) |
| }) |
基础控件
- 比例尺
比例尺支持的单位:[metric公制]、degrees度、imperial英制英尺、us美制英尺、nautical海里
| |
| const scaleLineControl = new ol.control.ScaleLine({ |
| units: 'degrees' |
| }) |
| |
| const map = new ol.Map({ |
| target: 'map', |
| layers: [ |
| new ol.layer.Tile({ |
| source: new ol.source.OSM() |
| }) |
| ], |
| view: new ol.View({ |
| center: [0, 0], |
| zoom: 2 |
| }), |
| |
| controls: ol.control.defaults.defaults().extend([ |
| scaleLineControl |
| ]) |
| }) |
| <select id="units"> |
| <option value="degrees">度</option> |
| <option value="imperial">英制英尺</option> |
| <option value="us">美制英尺</option> |
| <option value="nautical">海里</option> |
| <option value="metric" selected>公制</option> |
| </select> |
| |
| <div id="map"></div> |
| |
| <script> |
| |
| const scaleLineControl = new ol.control.ScaleLine({ |
| units: 'degrees' |
| }) |
| |
| const map = new ol.Map({ |
| target: 'map', |
| layers: [ |
| new ol.layer.Tile({ |
| source: new ol.source.OSM() |
| }) |
| ], |
| view: new ol.View({ |
| projection: "EPSG:4326", |
| center: [114.064839, 22.548857], |
| zoom: 12 |
| }), |
| |
| controls: ol.control.defaults.defaults().extend([ |
| scaleLineControl |
| ]) |
| }) |
| |
| |
| const unitsSelect = document.getElementById('units') |
| |
| |
| function onChange() { |
| scaleLineControl.setUnits(unitsSelect.value) |
| } |
| |
| unitsSelect.addEventListener('change', onChange) |
| </script> |
| const map = new ol.Map({ |
| target: 'map', |
| layers: [ |
| new ol.layer.Tile({ |
| source: new ol.source.OSM() |
| }) |
| ], |
| view: new ol.View({ |
| center: [0, 0], |
| zoom: 2 |
| }), |
| |
| controls: ol.control.defaults.defaults().extend([ |
| new ol.control.FullScreen() |
| ]) |
| }) |
| |
| let overviewMapControl = new ol.control.OverviewMap({ |
| className: 'ol-overviewmap ol-custom-overviewmap', |
| layers: [ |
| new ol.layer.Tile({ |
| |
| source: new ol.source.BingMaps({ |
| key: 'AiZrfxUNMRpOOlCpcMkBPxMUSKOEzqGeJTcVKUrXBsUdQDXutUBFN3-GnMNSlso-', |
| imagerySet: 'Aerial' |
| }) |
| }) |
| |
| ], |
| collapsed: false |
| }) |
| |
| const map = new ol.Map({ |
| target: 'map', |
| layers: [ |
| new ol.layer.Tile({ |
| source: new ol.source.OSM() |
| }) |
| ], |
| view: new ol.View({ |
| projection: "EPSG:4326", |
| center: [114.064839, 22.548857], |
| zoom: 6 |
| }), |
| |
| controls: ol.control.defaults.defaults().extend([ |
| overviewMapControl |
| ]) |
| }) |
| const map = new ol.Map({ |
| target: 'map', |
| layers: [ |
| new ol.layer.Tile({ |
| source: new ol.source.OSM() |
| }) |
| ], |
| view: new ol.View({ |
| center: [0, 0], |
| zoom: 2 |
| }), |
| |
| controls: ol.control.defaults.defaults().extend([ |
| new ol.control.ZoomToExtent({ |
| |
| extent: [ |
| 813079.7791264898, 5929220.284081122, |
| 848966.9639063801, 5936863.986909639 |
| ] |
| }) |
| ]) |
| }) |
| const map = new ol.Map({ |
| target: 'map', |
| layers: [ |
| new ol.layer.Tile({ |
| source: new ol.source.OSM() |
| }) |
| ], |
| view: new ol.View({ |
| projection: 'EPSG:4326', |
| center: [114.064839, 22.548857], |
| zoom: 2 |
| }), |
| |
| controls: ol.control.defaults.defaults().extend([ |
| |
| new ol.control.ZoomSlider() |
| ]) |
| }) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步