今天分享一篇初始化operlayers的文章,算上一篇笔记吧,以后再有项目时直接看笔记回省好多事,也帮网上的兄弟们避避雷。
前言
这个项目是vue3+operlayers开发的一个有关地名地址的小插件,具体服务就不展示了。
之所以用天地图来加载地图呢,主要是因为天地图加载的方式比较简单,不过也不算简单吧,一开始去天地图的官网上搞了半天,后来就用到官网上申请的AppKey,哈哈
本来我想使用wmts来加载影像地图的,但是这种方式比较麻烦,而且我在网上找的好多方式都没有加载成功,为此我还在csdn上求助来着,有两个大佬回复了我,用的是阿里的影像服务,很是感谢,但是也不好使。所以,我在想是不是想使用wmts的服务就必须下载下来,在本地跑服务,希望有看到这篇文章的大佬回复一下,十分感谢、感谢!!!
实现过程
1、因为operlayers所需要的依赖文件;
operlayers其实支持用npm引入依赖的,但是因为一开始是使用内网开发,所以就使用手动引入的方式,直接下载ol.js和ol.js.map文件,直接放在public文件下,然后在index.html文件中用script标签引入即可:
<script src="/ol.js"></script>
<script src="/ol.js.map"></script>
2、首先准备好相关的影像地址,具体如下:
window.OperlayerConfig = {
worldUnderlay: 'http://t4.tianditu.com/DataServer?T=cva_w&tk=key&x={x}&y={y}&l={z}', // 天地图的底图服务
worldName: 'http://t4.tianditu.com/DataServer?T=vec_w&tk=key&x={x}&y={y}&l={z}', // 天地图的地名影像
}
以上服务地址是我在网上找的,将里面的key值更换为自己天地图账号申请的key值即可。
3、使用服务,利用operlayers的API将服务添加到operlayers的对象中。
/**
* 设置底图的投影方式
* @description EPSG:3857 使用墨卡托投影
* @description EPSG:4326 使用经纬度方式投影
*/
const projection = ol.proj.get('EPSG:3857');
// 底图影像服务
var worldUnderlaylayer = new ol.layer.Tile({
source: new ol.source.XYZ({
url: window.OperlayerConfig.worldUnderlay,
projection: projection, // 设置底图的投影方式
crossOrigin: 'anonymous',
}),
})
// 地名地址
var worldNamelayer = new ol.layer.Tile({
source: new ol.source.XYZ({
url: window.OperlayerConfig.worldName,
projection: projection, // 设置底图的投影方式
crossOrigin: 'anonymous',
})
})
4、创建一个矢量图层,我们工作中绘制的图形都放在这个矢量图层中
/**
* 矢量图层
*/
var targetManger = new ol.layer.Vector({
//数据源
source: new ol.source.Vector({
wrapX: false,
}),
})
5、上面把图层啥的都定义好了,下面开始初始化地图
// 地图对象
var mapManger: any = null
mapManger = new ol.Map({
target: 'mapContainer', // mapContainer
layers: [worldUnderlaylayer,worldNamelayer, targetManger],
view: new ol.View({
center: [123, 46],
zoom: 4,
minZoom: 2,
projection: 'EPSG:4326',
}),
})
target:是装地图的容器盒子,id值
layers:初始化时放已经创建好的图层,因为图层是安装层级覆盖的,下面的会被上面的图层覆盖掉。所以我们将底图放在最下面,地名服务放在中间,因为管理我们绘制图像的图层需要始终可见。因此要放在最上方,也就是最后一个加载的。所以请记住,上面加载图层的位置不能乱。
view.center:地图的中心位置
view.zoom:初次加载的层级
view.projection:投影的方式,这里选择经纬度投影
6、地图对象卸载
一般情况下,我们都会将初始化地图模块封装成一个组件,在项目中有使用的时候直接引入组件即可。但是这样一个组件在多出被使用容易出现大大小小的问题,最常见的就是两处业务用到同一处组件导致组件污染。一般在vue的组件卸载之前的钩子函数中调用。
// 地图卸载事件
const destroyMap = () => {
if (mapManger == null) return
mapManger.setTarget(null)
// 销毁组件
mapManger.dispose()
mapManger = null
document.getElementById('mapContainer') == null
? ''
: (document.getElementById('mapContainer').innerHTML = '')
}
7、实现效果
彩蛋
天地图的官网:天地图注册key
在天地图官网上注册好自己账号后进入【开发】-【应用管理】,或者点击上面的链接,不过需要先在天地图官网上登录好自己的账号,不然你还是会跳转到账号登录界面。