欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用Openlayers叠加天地图

程序员文章站 2022-07-02 08:59:42
...

Tianditu:天地图
BaiduMap: 百度地图

什么是Openlayers?

openlayers是一个专为Web Gis客户端开发提供的javascript包。OpenLayers 支持的地图包括Google Maps、Yahoo、 Baidu、天地图、微软Virtual Earth 等等,可以说是功能非常之强大。
Openlayers支持调用远程服务器地图(以OGC形式发布的地图)到本地的客户端浏览器中进行显示。
OpenLayers 除了可以在浏览器中帮助开发者实现地图浏览的基本效果,比如放大、缩小、平移等常用操作之外,还可以进行选取面、选取线、要素选择、图层叠加等不同的操作。

什么时候需要使用Openlayers?

       那当然是在必要的时候。比如,本人原本使用的百度地图和天地图。但是当需要在地图上添加一个图层用以显示dwg格式的cad文件时,很明显原生的baiduMap or Tianditu 是未提供加载图层的API(最多提供了一些覆盖物Overlay层)。那么这个时候就需要使用到OpenLayers的图层叠加了。
虽然OpenLayers也不直接支持dwg或dxf格式的文件叠加,但是可以间接支持。kml支持kml、shp、geojson等文件格式的叠加。

      在我的理解中,openlayers主要是做图层管理,它可以建立多个图层,包括底图层TileLayer来加载地图,还要一些vectorLayer一些叠加层来加载矢量文件。

好了言归正传,由于项目需要,将原本使用的baiduMap改成了Tianditu。那么下面说说,如何在Vue框架中使用OpenLayers来加载天地图作为地图

加载天地图

  • API key
    首先如果要使用天地图,需要到天地图官网申请一个API key。在官网申请成为 个人开发着,然后创建一个应用即可,系统会分配key。
  • 引入天地图
    在vue项目的index.html文件中,添加以下代码:
    <script src="http://api.tianditu.gov.cn/api?v=4.0&tk=你的API key" type="text/javascript"></script>

在wepack.base.config.js文件加中添加依赖;

externals: {
    'T': 'T'
  },
  • 引入openlayers,添加依赖
npm i ol -save
  • 主要代码

使用OpenLayers加载天地图有两种方法,分别是ol.source.WMTS类(简称WMTS) 和 ol.source.XYZ类(简称XYZ)。后者代码比较简单,但是本人在实现过程中发现通过XYZ无法调取地图服务,原因未知。所幸采用WMTS类来进行调取,以下是主要代码:

//html
<template>
  <div>
  <div id="div_map" style= "height: 800px;width:1000px">
  </div>
  </div>
</template>

//js代码
import Map from 'ol/Map';
import View from 'ol/View';
import 'ol/ol.css';
import { Tile as TileLayer } from 'ol/layer';
import { toLonLat, fromLonLat } from 'ol/proj';//这里要注意
import { defaults as defaultControls } from 'ol/control.js';
import { getWidth, getTopLeft } from 'ol/extent.js';
import { get as getProjection } from 'ol/proj.js';
import WMTS from 'ol/source/WMTS.js';
import WMTSTileGrid from 'ol/tilegrid/WMTS.js';
methods: {
initTianditu() {
      let projection = getProjection('EPSG:3857');
      let projectionExtent = projection.getExtent();
      let size = getWidth(projectionExtent) / 256;
      let resolutions = new Array(18);
      let matrixIds = new Array(18);
      for (let z = 1; z < 19; ++z) {
        //分辨率
        resolutions[z] = size / Math.pow(2, z);
        //放大等级
        matrixIds[z] = z;
      }
      //天地图API key
      let webKey = '你的API Key';
      let wmtsUrl_3 = 'http://t{0-7}.tianditu.gov.cn/img_w/wmts?tk='; //影像底图
      let tileLayer = new TileLayer({
        source: new WMTS({
          url: wmtsUrl_3 + webKey,
          layer: 'img',
          matrixSet: 'w',
          format: 'tiles',
          style: 'default',
          projection: projection,
          tileGrid: new WMTSTileGrid({
            origin: getTopLeft(projectionExtent),
            resolutions: resolutions,
            matrixIds: matrixIds
          }),
          wrapX: true
        })
      });
      this.map =  new Map({
        target: 'div_map',
        view: new View({
          center: fromLonLat([120.60753817138888, 30.49043631527778]), 
          projection: 'EPSG:3857',
          zoom: 12//加载地图的层级
        }),
        layers: [tileLayer]
      });
    }
}

 

let wmtsUrl_3 = ‘http://t{0-7}.tianditu.gov.cn/img_w/wmts?tk=’;
其中的url是天地图的服务调用地址,
需要说明的是,天地图有几个服务器,分别通过t0-t7来调用。天地图有很多地图类型;
let wmtsUrl_1 = ‘http://t{0-7}.tianditu.gov.cn/vec_w/wmts?tk=’; //矢量底图
let wmtsUrl_2 = ‘http://t{0-7}.tianditu.gov.cn/cva_w/wmts?tk=’; //矢量注记
let wmtsUrl_3 = ‘http://t{0-7}.tianditu.gov.cn/img_w/wmts?tk=’; //影像底图
let wmtsUrl_4 = ‘http://t{0-7}.tianditu.gov.cn/cia_w/wmts?tk=’; //影像注记
let wmtsUrl_5 = ‘http://t{0-7}.tianditu.gov.cn/ter_w/wmts?tk=’; //地形底图
let wmtsUrl_6 = ‘http://t{0-7}.tianditu.gov.cn/cta_w/wmts?tk=’; //地形注记
let wmtsUrl_7 = ‘http://t{0-7}.tianditu.gov.cn/ibo_w/wmts?tk=’; //境界(省级以上)
let wmtsUrl_8 = ‘http://t{0-7}.tianditu.gov.cn/eva_w/wmts?tk=’; //矢量英文注记