Openlayers+天地图在页面上显示(初始化)(使用vue3)

一、原理介绍

首先先来介绍一下Openlayers加载天地图的原理,废话不多说,概念性的东西一笔带过

一个地图里面就像一个对象,首先要new一个map容器

容器里面有一些属性 target:目标容器name,也就是说这个map容器放在哪里,比如说前端代码有一个div id=‘map’,那么target就是map,就是将这个容器放在这个 map的div中。

那么一个地图还有什么属性呢?

一个地图里面有很多的图层(这里用瓦片图层来介绍,较多的东西就不讲了,涉及很多gis的相关知识,大致了解就好)

图层Layer就是显示地图最关键的部分,一个完整的地图由很多图层来共同完成,比如用来显示的,用来标注的等等

那么一个Layer图层里面又有一个数据源来支持(这里用天地图来举例)

map里面还有一个比较重要的东西就是View视图,这里控制地图的初始显示大小级别,中心点等

二、代码举例

那么原理讲的差不多了,具体实现用代码加文字来展示

导包什么的就不过多展示了

new Map

import Map from 'ol/Map';
import TileLayer from 'ol/layer/Tile';
import View from 'ol/View';
import WMTS from 'ol/source/WMTS';
import WMTSTileGrid from 'ol/tilegrid/WMTS';
setup(){
     let map: any = null;
     let tiandiLayer: any = null;
map = new Map({
          layers: [],    //图层集
          target: 'map',   //目标
          view: new View({       //视图
            projection: 'EPSG:4326',   //EPSG:4326 就是用经纬度来具体显示  还有一种是用坐标
            center: [avgLon, avgLat],   //中心点(经纬度,自行设定)
            zoom: 15,               //初始缩放级别
            minZoom: 6,         //最小缩放级别
            maxZoom: 20,        //最大放大级别
          }),
          interactions: OlDef({   //地图上的一些控制器,可自行进去看看
            dragPan: true,
            doubleClickZoom: false, //取消双击放大
          }),
          controls: OlControl({
            zoom: false,         //地图上的+号—号来放大缩小地图的按键  false关闭 true打开
          }),
        });
}

 那么这时候一个地图就已经new好了,接下来就是要向图层里面放东西,查看天地图的相关例子,可以很简单的知道图层的使用,当然,要在天地图中去注册,拿到一个秘钥(很简单,不说了)

let tiandiLayer: any = null;
let layerRemark: any = null;

      //官网示例写法,不过多深究
      const projection = getProjection('EPSG:4326');
      const projectionExtent = projection.getExtent();
      const size = getWidth(projectionExtent) / 256;
      const resolutions = new Array(19);
      const matrixIds = new Array(19);
      for (let z = 0; z < 19; ++z) {
        // generate resolutions and matrixIds arrays for this WMTS
        resolutions[z] = size / Math.pow(2, z);
        matrixIds[z] = z;
      }
   //添加矢量图层
        tiandiLayer = new TileLayer({
          opacity: 0.8,   //透明度
           source: new WMTS({     //数据源
           url: 'http://t3.tianditu.gov.cn/vec_c/wmts?tk=你的秘钥', //引用天地图的数据源
            layer: 'vec', //注意每个图层这里不同  类型是矢量图层
            matrixSet: 'c',  //vec_c  的后缀'c' ,每个图层不同
            format: 'tiles',   
            style: 'default',
            projection: 'EPSG:4326',    //使用4326的形式 (经纬度形式)
            tileGrid: new WMTSTileGrid({
              origin: getTopLeft(projection),
              resolutions: resolutions,
              matrixIds: matrixIds,
            }),
            wrapX: true,
          }),
        });


//添加标注图层
 //添加矢量标注
        layerRemark = new TileLayer({
          opacity: 0.8,
          source: new WMTS({
            url: 'http://t4.tianditu.gov.cn/cva_c/wmts?tk=你的秘钥',
            layer: 'cva', //注意每个图层这里不同
            matrixSet: 'c',
            format: 'tiles',
            style: 'default',
            projection: projection,
            tileGrid: new WMTSTileGrid({
              origin: getTopLeft(projectionExtent),
              resolutions: resolutions,
              matrixIds: matrixIds,
            }),
            wrapX: true,
          }),
        });

//图层设置完毕,加载到map地图中
 map.addLayer(tiandiLayer);
  map.addLayer(layerRemark);

这样一个地图初始化就已经完成啦,小伙伴们快去试试吧!

Vue3+TypeScript 中使用 OpenLayers 显示不同地物类别的图例,可以通过以下步骤实现: 1. 安装 OpenLayers 和 @types/ol 库: ```bash npm install ol @types/ol ``` 2. 在 Vue3 组件中引入 OpenLayers 库: ```javascript import Map from 'ol/Map'; import View from 'ol/View'; import TileLayer from 'ol/layer/Tile'; import OSM from 'ol/source/OSM'; import VectorLayer from 'ol/layer/Vector'; import VectorSource from 'ol/source/Vector'; import Style from 'ol/style/Style'; import Fill from 'ol/style/Fill'; import Stroke from 'ol/style/Stroke'; import Circle from 'ol/style/Circle'; ``` 3. 在 Vue3 组件中定义地图容器和图例容器: ```html <template> <div> <div id="map" style="width: 100%; height: 400px;"></div> <div id="legend"></div> </div> </template> ``` 4. 在 Vue3 组件中使用 OpenLayers 创建地图和图层: ```javascript <script lang="ts"> import { defineComponent } from 'vue'; import Map from 'ol/Map'; import View from 'ol/View'; import TileLayer from 'ol/layer/Tile'; import OSM from 'ol/source/OSM'; import VectorLayer from 'ol/layer/Vector'; import VectorSource from 'ol/source/Vector'; import Style from 'ol/style/Style'; import Fill from 'ol/style/Fill'; import Stroke from 'ol/style/Stroke'; import Circle from 'ol/style/Circle'; export default defineComponent({ name: 'MapComponent', mounted() { const map = new Map({ target: 'map', layers: [ new TileLayer({ source: new OSM(), }), new VectorLayer({ source: new VectorSource({ features: [ // 添加地物要素 ], }), style: (feature) => { // 根据不同的地物类别设置样式 }, }), ], view: new View({ center: [0, 0], zoom: 2, }), }); // 创建图例 const legend = document.getElementById('legend'); legend.innerHTML = ` <div> <span style="background-color: #ff0000;"></span> <span>红色代表...</span> </div> <div> <span style="background-color: #00ff00;"></span> <span>绿色代表...</span> </div> <div> <span style="background-color: #0000ff;"></span> <span>蓝色代表...</span> </div> `; }, }); </script> ``` 在上面的代码中,我们可以根据不同的地物类别来设置样式,例如:红色代表建筑物,绿色代表森林,蓝色代表水域等等。我们还创建了一个图例容器,并添加了不同地物类别的说明和颜色示例。 以上就是使用 OpenLayersVue3+TypeScript 中显示不同地物类别的图例的方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值