使用openlayers加载离线瓦片地图

news/2024/7/10 3:20:49 标签: 1024程序员节, vue, openlayers

一、需求背景

我们现在的项目就说使用openlayer + geoServer自己发布的矢量地图,是和公安合作的项目,由于政府大都使用的是天地图,所以需要将geoServer的矢量地图改为天地图,搭配openlayers使用,openlayers还可以切换不同地图数据源,虽然文档不够友好。

二、下载离线瓦片资源

这里 我给个百度云链接 下载后解压
链接: https://pan.baidu.com/s/1Mjiu0v2uQA3f2JAyreDgOQ?pwd=j18c 提取码: j18c

在这里插入图片描述
解压后双击打开

在这里插入图片描述
要下载高德地图!!! 下载别的地图 我试了 报错 mmp
在这里插入图片描述

三、发布离线瓦片数据

要把自己下载的地图资源放在服务器上才行
自己本地测试的话,本地起一个服务就好

怎么起?
在这里插入图片描述
这是刚刚下载的瓦片地图资源,在这个目录下

npm i http-server -g
http-server --cors

在这里插入图片描述
这里我再唠叨下
为什么是 http-server --cors 为什么要加 --cors
因为我们的地图资源问卷有跨域的限制
虽然百度了说设置img.setAttribute(‘crossOrigin’, ‘anonymous’)这个有用,但是经过实验其实没什么用
所以…

好了 服务有了

vue2_38">四、页面渲染(vue2)

自己创建一个vue2项目,或者直接拉取我的demo,劳驾给我一个star⭐
https://github.com/ZhangMin1998/openlayers_somedemo

安装 ol

npm install ol

我直接上代码吧

<template>
  <div class="home">
    <div style="width: 100%; height: 100%">
      <div class="map" id="map"></div>
    </div>
  </div>
</template>

<script>
import 'ol/ol.css'
import Map from 'ol/Map'
import { Tile as TileLayer } from 'ol/layer'
import View from 'ol/View'
import XYZ from 'ol/source/XYZ'

export default {
  name: 'HomeView',
  components: {},
  data () {
    return {
      mapObj: null,
      mapDom: null,
      mapPointList: [],
      pointLayerSource: null,
      pointLayer: null
    }
  },
  mounted () {
    this.initMap()
  },
  methods: {
    // 清除地图 某些情况 地图容器会存在两个 导致地图无法正常显示 这个问题折腾了我半天。
    // 找了半天官方貌似也没有提供 对应的 api,自己动手了。
    mapClear () {
      if (this.mapDom) {
        this.mapDom.innerHTML = ''
        this.mapDom = null
      }
    },

    // 初始化地图
    initMap () {
      // 先尝试清除
      // this.mapClear()
      // 获取地图容器
      this.mapDom = document.getElementById('map')

      // 初始化地图配置
      this.mapObj = new Map({
        target: this.mapDom, // 地图容器
        view: new View({
          center: [114.759, 25.522], // 地图中心点
          zoom: 8, // 缩放
          projection: 'EPSG:4326' // 坐标系
        })
      })

      // 添加一个使用离线瓦片地图的层
      const offlineMapLayer = new TileLayer({
        source: new XYZ({
          url: 'http://192.168.7.34:8081' + '/{z}/{x}/{y}.png' // 设置本地离线瓦片所在路径,前面的地址是你输入http-server之后的服务地址
          // tileLoadFunction: (imageTile, src) => {
          //   console.log(imageTile, src)
          //   // 使用滤镜 将白色修改为深色
          //   const img = new Image()
          //   // img.crossOrigin = ''
          //   // 设置图片不从缓存取,从缓存取可能会出现跨域,导致加载失败
          //   img.setAttribute('crossOrigin', 'anonymous')
          //   img.onload = () => {
          //     const canvas = document.createElement('canvas')
          //     const w = img.width
          //     const h = img.height
          //     canvas.width = w
          //     canvas.height = h
          //     const context = canvas.getContext('2d')
          //     context.filter = 'grayscale(98%) invert(100%) sepia(20%) hue-rotate(180deg) saturate(1600%) brightness(80%) contrast(90%)'
          //     context.drawImage(img, 0, 0, w, h, 0, 0, w, h)
          //     imageTile.getImage().src = canvas.toDataURL('image/png')
          //   }
          //   img.onerror = () => {
          //     imageTile.getImage().src = require('@/assets/logo.png')
          //   }
          //   img.src = src
          // }
        })
      })
      // 将图层添加到地图
      this.mapObj.addLayer(offlineMapLayer)

      // 加载地理坐标
      // this.addPoint()
    }
  },
  beforeDestroy () {
    this.mapClear()
  }
}
</script>
<style lang="less">
.map {
  width: 1900px;
  height: 1000px;
  // background-color: red;
}
</style>

在这里插入图片描述
这里要替换你自己刚刚起的服务的地址哈!!!
然后运行

npm run serve

我的demo的路由是 ‘/offlineMap’

大概就是这样:
在这里插入图片描述

五、修改地图样式

参考文章:
https://www.cnblogs.com/m7777/p/16280817.html
https://blog.csdn.net/qq_32077521/article/details/123224974
https://blog.csdn.net/weixin_43239880/article/details/129247279
https://juejin.cn/post/7017301189406490655

利用openlayers中的tileLoadFunction 的函数回调进行变色,结合css的filter属性来进行变色

// 添加一个使用离线瓦片地图的层
const offlineMapLayer = new TileLayer({
  source: new XYZ({
    url: 'http://192.168.7.34:8081' + '/{z}/{x}/{y}.png', // 设置本地离线瓦片所在路径,前面的地址是你输入http-server之后的服务地址
    tileLoadFunction: (imageTile, src) => {
      console.log(imageTile, src)
      // 使用滤镜 将白色修改为深色
      const img = new Image()
      // img.crossOrigin = ''
      // 设置图片不从缓存取,从缓存取可能会出现跨域,导致加载失败
      img.setAttribute('crossOrigin', 'anonymous')
      img.onload = () => {
        const canvas = document.createElement('canvas')
        const w = img.width
        const h = img.height
        canvas.width = w
        canvas.height = h
        const context = canvas.getContext('2d')
        context.filter = 'grayscale(98%) invert(100%) sepia(20%) hue-rotate(180deg) saturate(1600%) brightness(80%) contrast(90%)'
        context.drawImage(img, 0, 0, w, h, 0, 0, w, h)
        imageTile.getImage().src = canvas.toDataURL('image/png')
      }
      img.onerror = () => {
        imageTile.getImage().src = require('@/assets/logo.png')
      }
      img.src = src
    }
  })
})

offlineMapLayer函数:在加载瓦片的时候进行修改

css的filter属性解释:大概就是改变你图片的色相,饱和度,黑白,通透性等等,来实现图片变色的效果。【缺点,不能让地图指定哪个颜色,只能调个大概的好看的颜色。】

效果:
在这里插入图片描述
为什么多了这些图片??
目的是解决加了这个函数后,有些瓦片不全时会加载404的瓦片图,缩放后就没了的问题。
所以添加img.onerror事件,
把imageTile.getImage().src = require(‘@/assets/logo.png’)设置为一个图片出错时的替换图片就ok。对于404的图片,大家也可以这样子设置,设置成需要替换的图片就行。

六、demo地址 记得给个star⭐

https://github.com/ZhangMin1998/openlayers_somedemo


http://www.niftyadmin.cn/n/5119889.html

相关文章

【数据挖掘 | 关联性分析】万字长文详解关联性分析,详解Apriori算法为例,确定不来看看?

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

苹果手机自身的ip地址怎么查

随着互联网的普及&#xff0c;越来越多的人使用智能手机连接到网络。苹果手机用户可能想要知道他们的设备如何获取或查询自身的IP地址。虎观代理小二二将详细介绍如何在苹果手机上查找IP地址。 在苹果手机上查询IP地址的方式有多种&#xff0c;其中最常用的方法是通过手机设置…

mongodb-gridfs下载文件报Sort exceeded memory limit of 104857600 bytes异常

报错详细信息 com.mongodb.MongoQueryException: Query failed with error code 292 and error message Executor error during find command :: caused by :: Sort exceeded memory limit of 104857600 bytes, but did not opt in to external sorting. on server 11.51.141.…

k8s笔记 实例篇

01 金丝雀部署 金丝雀部署&#xff08;Canary releases&#xff09;是一种软件发布技术&#xff0c;可以通过将新版本的应用程序逐步部署到生产环境中的一小部分用户&#xff0c;来降低部署新软件版本的风险。如果新版本在初期测试中表现良好&#xff0c;它可以逐步推广到所有…

工业通信网关常用的工业通信协议

在工业领域中常常有不同的设备协同工作&#xff0c;而这些设备的通信协议和数据格式也有所差异&#xff0c;要想实现不同通信设备之间的数据传输互通&#xff0c;工业网关是一个重要的设备。 什么是工业网关 工业网关是一种能够连接多种不同设备并实现数据的收集、传输、处理和…

达芬奇MacOS最新中文版 DaVinci Resolve Studio 18中文注册秘钥

DaVinci Resolve Studio 18是一款专业的视频编辑软件&#xff0c;它具有多种强大的功能。首先&#xff0c;它提供了丰富的视频剪辑工具&#xff0c;如剪切、复制、粘贴、剪辑、缩放和移动等&#xff0c;使用户可以轻松地剪辑和组合视频素材。其次&#xff0c;该软件还支持多个轨…

力扣第134题 加油站 c++ 暴力 + 贪心

题目 134. 加油站 中等 相关标签 贪心 数组 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;…

谈谈Net-SNMP软件

Net-SNMP是一个开源的SNMP软件套件&#xff0c;它提供了SNMP代理&#xff08;snmpd&#xff09;和SNMP工具&#xff08;如snmpget、snmpwalk等&#xff09;&#xff0c;可以用于监控和管理网络设备。 Net-SNMP最初是从UC Davis的SNMP软件衍生而来&#xff0c;现在已经成为广泛…