OpenLayers加载空间数据

一、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", // 地图放到哪个容器中,值应该是div的id
    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", // 地图放到哪个容器中,值应该是div的id
    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", // 地图放到哪个容器中,值应该是div的id
    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.实现效果

ArcGIS底图服务的加载

五、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", // 地图放到哪个容器中,值应该是div的id
    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.实现效果

加载GeoServer发布的WMS图层

六、矢量切片的加载

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(),
  //请求瓦片地址
  //ip:ip地址  post:端口号  serverName:请求后台名
  url: `${ip}:${post}/${serverName}/{z}/{x}/{y}`
})
let vectorTileLayer = new VectorTileLayer({
  source: vectorTileSource
})
/**
 * 初始化地图
 */
const initialMap = () => {
  map = new Map({
    target: "map", // 地图放到哪个容器中,值应该是div的id
    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", // 地图放到哪个容器中,值应该是div的id
    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.实现效果

GeoJson的加载

八、总结

  • 本文主要针对工作中常用的空间数据的加载进行说明。其实OpenLayers还支持很多其他的数据源,以后遇到了会继续补充。
  • 以后的章节也会继续分享和探索OpenLayers的使用。
  • 欢迎大家批评指正!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值