一、OpenLayers地图加载
1.简介
- 往期已经对OpenLayers框架进行了介绍,本期不在进行赘述,如果有想了解OpenLayers框架的GISer,可以看我的往期文章——Openlayers的交互功能(一)——新手教程,里面详细介绍了OpenLayers框架的基本情况、地图初始化、控件加载等。
- 【注】:本文所有代码都是基于Vue3+OpenLayers7.4.0实现。
2.实现效果
二、吉林一号影像服务的加载
1.吉林一号影像服务简介
- 吉林一号首推影像服务套件,为开发者提供最新的高质量影像切片服务,也是日常工作中用的最多的底图服务。首先需要访问吉林一号切片影像套件网站(吉林一号切片影像套件),填写相关信息即可注册完成,获取对应的TK与服务的MK,即可进行使用,更多信息可以访问吉林一号网进行查看。
2.实现代码
<template>
<!-- 初始化一个地图容器 -->
<div id="map"></div>
</template>
<script setup>
import TileLayer from "ol/layer/Tile";
import {XYZ} from "ol/source";
import {View} from "ol";
import {Map} from "ol";
import {onMounted} from "vue";
import {defaults as defaultControls} from "ol/control";
import {fromLonLat} from "ol/proj";
let map;
let JL1Source = new XYZ({
url: "https://api.jl1mall.com/getMap/{z}/{x}/{-y}?mk={你的mk}&tk={你的tk}"
})
let JL1Layer = new TileLayer({
source: JL1Source
})
const initialMap = () => {
map = new Map({
target: "map",
layers: [
JL1Layer
],
view: new View({
projection: "EPSG:3857",
center: fromLonLat([125.3574397847, 43.8865062907]),
zoom: 12,
}),
controls: defaultControls({
attribution: false,
zoom: false,
rotate: false,
}).extend([]),
});
};
onMounted(() => {
initialMap();
});
</script>
<style scoped>
#map {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
}
:deep(.ol-attribution) {
display: none;
}
</style>
3.实现效果
三、天地图服务加载
1.天地图服务简介
- 天地图为国内典型的开源底图服务,所以天地图服务的加载需要了解,以免不时之需。首先访问天地图开放平台的注册页面:http://lbs.tianditu.gov.cn/register.html,输入相关信息即可完成注册;然后进入控制台,创建新的应用,指定应用程序名称、类型和访问权限等,即可获取对应的key,此处不详细介绍。
2.实现代码
<template>
<!-- 初始化一个地图容器 -->
<div id="map"></div>
</template>
<script setup>
import TileLayer from "ol/layer/Tile";
import {XYZ} from "ol/source";
import {View} from "ol";
import {Map} from "ol";
import {onMounted} from "vue";
import {defaults as defaultControls} from "ol/control";
import {fromLonLat} from "ol/proj";
let map;
let TDTSource = new XYZ({
url: 'https://t{0-7}.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk={你的key}'
})
let TDTLayer = new TileLayer({
source: TDTSource
})
const initialMap = () => {
map = new Map({
target: "map",
layers: [
TDTLayer,
],
view: new View({
projection: "EPSG:3857",
center: fromLonLat([125.3574397847, 43.8865062907]),
zoom: 12,
}),
controls: defaultControls({
attribution: false,
zoom: false,
rotate: false,
}).extend([]),
});
};
onMounted(() => {
initialMap();
});
</script>
<style scoped>
#map {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
}
:deep(.ol-attribution) {
display: none;
}
</style>
3.实现效果
四、ArcGIS底图服务的加载
1.ArcGIS底图服务简介
- ArcGIS提供一些在线的底图服务,可以进行获取更多的服务样式,其加载方式与天地图的加载类似,需要更换对应的瓦片切片地址。
2.实现代码
<template>
<!-- 初始化一个地图容器 -->
<div id="map"></div>
</template>
<script setup>
import TileLayer from "ol/layer/Tile";
import {XYZ} from "ol/source";
import {View} from "ol";
import {Map} from "ol";
import {onMounted} from "vue";
import {defaults as defaultControls} from "ol/control";
import {fromLonLat} from "ol/proj";
let map;
let ArcGISSource = new XYZ({
url: "https://map.geoq.cn/arcgis/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/WMTS/tile/1.0.0/ChinaOnlineStreetPurplishBlue/default/default028mm/{z}/{y}/{x}.png"
})
let ArcGISLayer = new TileLayer({
source: ArcGISSource
})
const initialMap = () => {
map = new Map({
target: "map",
layers: [
ArcGISLayer
],
view: new View({
projection: "EPSG:3857",
center: fromLonLat([125.3574397847, 43.8865062907]),
zoom: 12,
}),
controls: defaultControls({
attribution: false,
zoom: false,
rotate: false,
}).extend([]),
});
};
onMounted(() => {
initialMap();
});
</script>
<style scoped>
#map {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
}
:deep(.ol-attribution) {
display: none;
}
</style>
3.实现效果
五、GeoServer发布的WMS服务加载
1. WMS服务简介
- GeoServer是开源的地图服务器,利用GeoServer可以方便的发布地图数据,允许用户对特征数据进行更新、删除、插入操作,通过GeoServer可以比较容易的在用户之间迅速共享空间地理信息。实际工作中用的比较多就是加载GeoServer发布的WMS服务,现对其加载进行说明。
2.实现代码
<template>
<!-- 初始化一个地图容器 -->
<div id="map"></div>
</template>
<script setup>
import {ImageWMS} from "ol/source";
import {View} from "ol";
import {Map} from "ol";
import {onMounted} from "vue";
import {defaults as defaultControls} from "ol/control";
import {fromLonLat} from "ol/proj";
import {Image} from 'ol/layer'
let map;
let WMSSource = new ImageWMS({
url: '你的url',
crossOrigin: 'anonymous'
})
let WMSLayer = new Image({
source: WMSSource ,
})
const initialMap = () => {
map = new Map({
target: "map",
layers: [
WMSLayer
],
view: new View({
projection: "EPSG:3857",
center: fromLonLat([125.3574397847, 43.8865062907]),
zoom: 12,
}),
controls: defaultControls({
attribution: false,
zoom: false,
rotate: false,
}).extend([]),
});
};
onMounted(() => {
initialMap();
});
</script>
<style scoped>
#map {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
}
:deep(.ol-attribution) {
display: none;
}
</style>
3.实现效果
六、矢量切片的加载
1.矢量切片简介
- 矢量切片作为Mapbox公司的明星产品,OpenLayers也可以使用。
2.实现代码
<template>
<!-- 初始化一个地图容器 -->
<div id="map"></div>
</template>
<script setup>
import TileLayer from "ol/layer/Tile";
import {View} from "ol";
import {Map} from "ol";
import {onMounted} from "vue";
import {defaults as defaultControls} from "ol/control";
import {fromLonLat} from "ol/proj";
import VectorTileLayer from 'ol/layer/VectorTile'
import VectorTileSource from 'ol/source/VectorTile'
import {MVT} from "ol/format";
let map;
let vectorTileSource = new VectorTileSource({
format: new MVT(),
url: `${ip}:${post}/${serverName}/{z}/{x}/{y}`
})
let vectorTileLayer = new VectorTileLayer({
source: vectorTileSource
})
const initialMap = () => {
map = new Map({
target: "map",
layers: [
vectorTileLayer
],
view: new View({
projection: "EPSG:3857",
center: fromLonLat([125.3574397847, 43.8865062907]),
zoom: 12,
}),
controls: defaultControls({
attribution: false,
zoom: false,
rotate: false,
}).extend([]),
});
};
onMounted(() => {
initialMap();
});
</script>
<style scoped>
#map {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
}
:deep(.ol-attribution) {
display: none;
}
</style>
3.实现效果
- 受文件大小限制,没有办法上传gif图,暂时上传一张图片。
- OpenLayers加载动态矢量切片的效果是没有MapBox好的,但是在高层级下的效果是明显优于GeoServer的。
七、GeoJson的加载
1.GeoJson简介
- GeoJson是常用的地理数据规范,Mapbox将它作为Source,而Source可以与Layer进行绑定,从而实现地图绘制。GeoJson获取方式比较多,可以是原始shp导出生成的,也可以是后台读取得到,可以是存在项目中也可以是存在服务器上,接下来以存在服务器上的为例进行说明。
2.实现代码
<template>
<!-- 初始化一个地图容器 -->
<div id="map"></div>
</template>
<script setup>
import {Vector as VectorSource} from "ol/source";
import {View} from "ol";
import {Map} from "ol";
import {onMounted} from "vue";
import {defaults as defaultControls} from "ol/control";
import {fromLonLat} from "ol/proj";
import {Vector as VectorLayer} from 'ol/layer'
import {GeoJSON} from "ol/format";
let map;
let geoJsonSource = new VectorSource({
url: '你的GeoJson文件地址',
format: new GeoJSON()
})
let geoJsonLayer = new VectorLayer({
source: geoJsonSource
})
const initialMap = () => {
map = new Map({
target: "map",
layers: [
geoJsonLayer
],
view: new View({
projection: "EPSG:3857",
center: fromLonLat([125.3574397847, 43.8865062907]),
zoom: 12,
}),
controls: defaultControls({
attribution: false,
zoom: false,
rotate: false,
}).extend([]),
});
};
onMounted(() => {
initialMap();
});
</script>
<style scoped>
#map {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
}
:deep(.ol-attribution) {
display: none;
}
</style>
3.实现效果
八、总结
- 本文主要针对工作中常用的空间数据的加载进行说明。其实OpenLayers还支持很多其他的数据源,以后遇到了会继续补充。
- 以后的章节也会继续分享和探索OpenLayers的使用。
- 欢迎大家批评指正!