• openlayers学习(一)


    首先感谢大佬们写的文章,博客链接已在文章最后贴出,在接下来的内容中,我将会引用其中的一些定义结论。

    之前文章写过一个Arcgis api for js的小demo,openlayers项目代码就继续在写这个小demo框架上。


    openlayers官网

    初始化地图 

    要想在vue项目里使用openlayers,需要先安装openlayers包

    npm install ol

     下面来写核心代码:

    1. <script>
    2. import 'ol/ol.css';
    3. import { Map, View } from "ol";//地图,视图
    4. import OSM from "ol/source/OSM"; //可以理解为数据源,就是一张图片
    5. import TileLayer from "ol/layer/Tile"; //可以理解为图层
    6. export default {
    7. data() {
    8. return {
    9. map: null,
    10. };
    11. },
    12. methods: {
    13. createMap() {
    14. this.map = new Map({
    15. target: "map", // 关联到对应的div容器
    16. layers: [
    17. new TileLayer({ // 瓦片图层
    18. source: new OSM(), // OpenStreetMap数据源
    19. }),
    20. ],
    21. view: new View({ // 地图视图
    22. center: [0, 0],
    23. projection: "EPSG:3857",
    24. zoom: 8,
    25. }),
    26. });
    27. },
    28. },
    29. mounted() {
    30. this.createMap();
    31. },
    32. };
    33. script>
    34. <style>
    35. #map {
    36. position:relative;
    37. height: 100%;
    38. width: 100%;
    39. }
    40. style>

    运行可以看到OpenStreetMap地图已经显示出来了 


    实战:

    上面已经掌握了基本的创建地图的知识,下面来实战一下

    在此之前,先安装ol-ext库

    npm i ol-ext

    在main.js全局引入ol和ol-ext的样式表

    管理底图及控件

    components文件夹下新建MapView用于存放我们的相关vue组件和js文件

    baselayers.js:

    1. //用于管理底图
    2. import {Group as LayerGroup, Tile as TileLayer, Vector as VectorLayer} from "ol/layer"
    3. import {OSM, Stamen, BingMaps, Vector as VectorSource} from "ol/source"
    4. import {Style, Fill, Stroke, Circle} from "ol/style"
    5. export default class Baselayers{
    6. //创建底图组
    7. static BaseLayersGroup(layers){
    8. return new LayerGroup({
    9. title: 'Base Layers',
    10. allwaysOnTop: true,//总是位于地图的最顶层
    11. openInLayerSwitcher: true,//指示在图层切换器中默认是展开的
    12. layers: layers
    13. });
    14. }
    15. //创建Open Street Map
    16. static OSMLayer(isBaseLayer, isVisible){
    17. return new TileLayer({
    18. title: 'OSM',
    19. baseLayer: isBaseLayer,
    20. source: new OSM(),
    21. visible: isVisible
    22. });
    23. }
    24. //https://www.bingmapsportal.com/Application,申请key的地址
    25. //创建Bing Map
    26. static BingMapLayer(layerName){
    27. let apiKey = '自己去申请一个key';
    28. return new TileLayer({
    29. preload: Infinity,
    30. baseLayer: true,
    31. title: upperCaseFirst.call(this, layerName),
    32. visible: true,
    33. source: new BingMaps({
    34. key: apiKey,
    35. imagerySet: layerName
    36. })
    37. });
    38. }
    39. }
    40. //Bing Map的类型
    41. Baselayers.BingMapLayerTypes = {
    42. Road: 'Road',
    43. Aerial: 'Aerial',
    44. AerialWithLabels: 'AerialWithLabels',
    45. collinsBart: 'collinBart',
    46. ordnanceSurvey: 'ordnanceSurvey'
    47. }
    48. function upperCaseFirst(str){
    49. return str[0].toUpperCase() + str.substring(1);
    50. }

    controls.js:

    1. //管理相关地图控件
    2. import {defaults} from 'ol/control' //defaults方法返回一个包含OpenLayers地图默认控件的对象
    3. import LayerSwitcher from 'ol-ext/control/LayerSwitcher' //LayerSwitcher是一个扩展控件,它提供了一个用户界面来切换地图上的不同图层。
    4. /**
    5. * 地图控件
    6. */
    7. export const controls = {
    8. // 地图图层切换
    9. switcher: new LayerSwitcher({
    10. show_progress: true, //在图层加载时显示进度条
    11. extent: true //显示图层的范围
    12. }),
    13. // 默认控件
    14. default: defaults() // 没有new defaults是一个函数
    15. };

    BaseMap.vue:

    1. <template>
    2. <div id="map">div>
    3. template>
    4. <script>
    5. import { Map, View } from "ol"; //地图,视图
    6. import Baselayers from "./js/baselayers.js"; //地图管理
    7. import { controls } from "./js/controls"; //地图交互控件
    8. import { fromLonLat } from "ol/proj"; //经纬度转投影
    9. import TileLayer from "ol/layer/Tile"; //可以理解为图层
    10. export default {
    11. data() {
    12. return {
    13. map: null,
    14. bingMap: Baselayers.BingMapLayer(
    15. Baselayers.BingMapLayerTypes.AerialWithLabels
    16. ), //卫星地图
    17. osm: Baselayers.OSMLayer(true, false),
    18. baseLayerGroup: null,
    19. view: new View({
    20. center: fromLonLat([118.8, 32.0]), //南京的经纬度
    21. zoom: 11,
    22. }),
    23. };
    24. },
    25. methods: {
    26. createMap() {
    27. this.map = new Map({
    28. target: "map", // 关联到对应的div容器
    29. layers: [this.baseLayerGroup],
    30. overlays: [],
    31. controls: [controls.switcher],
    32. loadTilesWhileInteracting: true,
    33. view: this.view,
    34. });
    35. },
    36. },
    37. mounted() {
    38. this.baseLayerGroup=Baselayers.BaseLayersGroup([this.bingMap, this.osm])
    39. this.createMap();
    40. },
    41. };
    42. script>
    43. <style>
    44. #map {
    45. position: relative;
    46. height: 100%;
    47. width: 100%;
    48. }
    49. style>

    参考文章:

    WebGIS实战:Vue+Openlayers实现网络地图的加载与切换_openlayers加载甘肃省地图-CSDN博客 OpenLayers教程二:实现简单的地图显示 - 知乎 (zhihu.com)

  • 相关阅读:
    R语言绘制散点密度图ggdentity
    3.29每日一题(微分方程的几何应用题:重点考察)
    介绍一款数据准实时复制(CDC)中间件 `Debezium`
    Unirech阿里云国际版云服务器代充-使用Python批量创建实例
    Unity-PDF分割器(iTextSharp)
    IDEA 对单个的java class文件打成jar包
    FFmpeg开发笔记(十八)FFmpeg兼容各种音频格式的播放
    RK3568开发笔记(六):开发板烧写ubuntu固件(支持mipi屏镜像+支持hdmi屏镜像)
    鲜花在线销售平台的设计与实现/鲜花商城/网上花店管理系统
    UNCTF-日常训练-reverse-ezRust
  • 原文地址:https://blog.csdn.net/2301_78796401/article/details/137807264