Openlayers 实战 - 地图视野(View)- 图层 -(layer)- 资源(source)显示等级设置

news2024/11/17 9:26:39

Openlayers 实战 - 地图视野(View)- 图层 -(layer)- 资源(source)显示等级设置

    • 问题原因
    • 核心代码
    • 完整代码:
    • 在线示例

在以往的项目维护中,出现一个问题,使用最新高清底图发现,设置地图最大等级(21级)之后,地图虽然可以渲染 21 级图层,但是并没有请求 21 级图层瓦片数据

思考之后,认为是地图等级参数限制,经过调试发现问题所在不仅于此,后来解决问题,这里记录一下。

本文包括问题原因、问题解决核心代码以及在线示例。


问题原因

地图图层想要设置缩放等级,需要三个条件:

1. 地图视野 View 对象设置 minzoom maxzoom 参数。

2. 图层 layer 对象设置 minzoom maxzoom 参数。

3. 资源 source 设置分辨率 tileGrid-resolutions 参数。


三个条件缺一不可,以下分别设置部分对象属性出现的问题:

1.只设置地图,不设置图层,地图可以放大,但是不会请求资源;由于图层没有资源,会显示空白。

PS: 下图额外加载了一个显示 zoom 的图层。

在这里插入图片描述

2. 只设置图层,不设置地图,地图不能继续放大,因此也不会加载高等级图层瓦片。

在这里插入图片描述

3. 设置地图以及图层,不设置资源,地图和图层可以放大,但是不会请求资源,只是图片放大了,看起来会模糊。

在这里插入图片描述

4. 地图视野、图层、资源同时设置,会正常请求相应的数据

在这里插入图片描述

核心代码

这里放上控制地图视野(View)、图层(Layer)、资源(Source)对象缩放等级的代码:

其中加载了一个显示瓦片索引的图层,用来查看图层瓦片请求情况:瓦片索引的图层


// 地图视野等级设置
function viewZoom() {
    view.setMaxZoom(maxZoom);
    view.setZoom(defaultMaxZoom + 1);
}

// 图层等级设置
function layerZoom() {
    layer.setMaxZoom(maxZoom);
}

// 图层资源等级设置
function sourceZoom() {
    layer.setSource(getOptional(getUrl(),maxZoom))
}

// 还原所有缩放等级
function restoreZoom() {
    view.setMaxZoom(defaultMaxZoom);
    layer.setMaxZoom(defaultMaxZoom);
    layer.setSource(getOptional(getUrl(),defaultMaxZoom))
    view.setZoom(defaultMaxZoom);
}


完整代码:


<html lang="en">
<head>
    <meta charset="utf-8">
    <!--注意:openlayers 原版的比较慢,这里引起自己服务器版-->
    <link rel="stylesheet" href="http://openlayers.vip/examples/css/ol.css" type="text/css">
    <style>
        /* 注意:这里必须给高度,否则地图初始化之后不显示;一般是计算得到高度,然后才初始化地图 */
        .map {
            height: 400px;
            width: 100%;
            float: left;
        }
    </style>
    <!--注意:openlayers 原版的比较慢,这里引起自己服务器版-->
    <script src="http://openlayers.vip/examples/resources/ol.js"></script>
    <title>OpenLayers example</title>
</head>
<body>
<h2>View Layer Zoom</h2>
<!--地图容器,需要指定 id -->
<div id="map" class="map"></div>
<script type="text/javascript">

    // 自己的tk
    let TK = '2b7cbf61123cbe4e9ec6267a87e7442f';

    // 默认地图等级
    const defaultMaxZoom = 14;

    // 设置新的最大等级
    const maxZoom = 18;

    // 定位测试等级
    const moveToZoom = 16;

    // 获取天地图资源地址
    let getUrl = function (type = 'IMG_C') {
        let url = 'http://t{randomNumber}.tianditu.gov.cn/DataServer?T={type}&x={x}&y={y}&l={z}';
        url = url.replace('{randomNumber}', Math.round(Math.random() * 7).toString());
        url = url.replace('{type}', type);
        url = url + "&tk=" + TK;
        return url;
    }

    // 获取分辨率数组
    let getResolutionsExpert = function (size, maxZoom = defaultMaxZoom) {

        let resolutions = new Array(maxZoom);
        let matrixIds = new Array(maxZoom);
        for (let z = 0; z < maxZoom + 1; ++z) {
            //分辨率
            resolutions[z] = size / Math.pow(2, z);
            //放大等级
            matrixIds[z] = z;
        }
        return resolutions;
    }

    // 获取图层资源对象
    let getOptional = function (url, maxZoom) {

        let projection = ol.proj.get('EPSG:4326');
        let projectionExtent = projection.getExtent();
        let size = ol.extent.getWidth(projectionExtent) / 256;

        return new ol.source.XYZ({
            crossOrigin: 'anonymous',
            wrapX: true,
            //切片xyz获取方法
            tileUrlFunction: function (tileCoord) {
                const z = tileCoord[0];
                const x = tileCoord[1];
                let y = tileCoord[2];
                let completeUrl = url.replace('{z}', z.toString())
                    .replace('{y}', y.toString())
                    .replace('{x}', x.toString());
                return completeUrl;
            },
            //坐标系
            projection: projection,
            tileGrid: new ol.tilegrid.TileGrid({
                origin: ol.extent.getTopLeft(projectionExtent),
                tileSize: [256, 256],
                //分辨率数组 天地图为 1.40625
                resolutions: getResolutionsExpert(size, maxZoom)
            }),
        })
    }

    // 初始图层资源对象
    const source = getOptional(getUrl());

    //影像图
    function getIMG_CLayer() {
        let layer = new ol.layer.Tile({
            name: "天地图影像图层",
            source: source,
            maxZoom: defaultMaxZoom,
            minZoom: 1,
        });
        return layer;
    }

    // 地图视野对象
    const view = new ol.View({
        projection: "EPSG:4326",
        // 定位
        center: [116, 39],
        // 缩放
        zoom: defaultMaxZoom,
        maxZoom: defaultMaxZoom,
        minZoom: 1,
    });

    // 图层对象
    const layer = getIMG_CLayer();

    // 网格图层参数
    const size = 256;
    const canvas = document.createElement('canvas');
    canvas.width = size;
    canvas.height = size;
    const context = canvas.getContext('2d');
    context.strokeStyle = 'white';
    context.textAlign = 'center';
    context.font = '40px sans-serif';
    const lineHeight = 15;

    // 地图对象
    const map = new ol.Map({
        // 地图容器
        target: 'map',
        // 地图图层,比如底图、矢量图等
        layers: [
            layer,
            // 添加网格图层,显示等级:Z
            new ol.layer.WebGLTile({
                source: new ol.source.DataTile({
                    loader: function (z, x, y) {
                        const half = size / 2;
                        context.clearRect(0, 0, size, size);
                        context.fillStyle = 'rgba(100, 100, 100, 0.1)';
                        context.fillRect(0, 0, size, size);
                        context.fillStyle = 'white';
                        context.fillText(`z: ${z}`, half, half + lineHeight);
                        // context.fillText(`x: ${x}`, half, half);
                        // context.fillText(`y: ${y}`, half, half + lineHeight);
                        context.strokeRect(0, 0, size, size);
                        const data = context.getImageData(0, 0, size, size).data;
                        // converting to Uint8Array for increased browser compatibility
                        return new Uint8Array(data.buffer);
                    },
                    // disable opacity transition to avoid overlapping labels during tile loading
                    transition: 0,
                }),
            }),
        ],
        // 地图视野
        view: view
    });

    // 地图视野等级设置
    function viewZoom() {
        view.setMaxZoom(maxZoom);
        view.setZoom(defaultMaxZoom + 1);
    }

    // 图层等级设置
    function layerZoom() {
        layer.setMaxZoom(maxZoom);
    }

    // 图层资源等级设置
    function sourceZoom() {
        layer.setSource(getOptional(getUrl(),maxZoom))
    }

    // 还原所有缩放等级
    function restoreZoom() {
        view.setMaxZoom(defaultMaxZoom);
        layer.setMaxZoom(defaultMaxZoom);
        layer.setSource(getOptional(getUrl(),defaultMaxZoom))
        view.setZoom(defaultMaxZoom);
    }
</script>

<button id="viewZoom" onClick="viewZoom()">设置地图缩放等级(不改变 layer 和 source)</button>
<button id="layerZoom" onClick="layerZoom()">设置图层缩放等级(不改变 map 和 source)</button>
<button id="sourceZoom" onClick="sourceZoom()">设置资源缩放等级(不改变 map 和 layer)</button>
<button id="restoreZoom" onClick="restoreZoom()">还原所有缩放等级</button>
</body>
</html>



在线示例

在线示例:Openlayers 显示等级设置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/899506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于traccar快捷搭建gps轨迹应用

0. 环境 - win10 虚拟机ubuntu18 - i5 ubuntu22笔记本 - USB-GPS模块一台&#xff0c;比如华大北斗TAU1312-232板 - 双笔记本组网设备&#xff1a;路由器&#xff0c;使得win10笔记本ip&#xff1a;192.168.123.x&#xff0c;而i5笔记本IP是192.168.123.215。 - 安卓 手机 1.…

PHP酒店点菜管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 酒店点菜管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 代码下载 https://download.csdn.net/download/qq_41221322/88232051 论文 https://…

ARM体系结构学习笔记:NZCV

NZCV N: negative 算术逻辑运算单元运算结果为负1/正0 Z: zero 算术逻辑运算单元运算结果为零1/非零0 C: 3cases:1 0加法 Carray | Not Carray减法 Not Borrow | Borrow(Not Carray)移位 Bit Shifted | Rotated Out V: 后面详细阐述[外…

【C语言】数组概述

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 &#x1f525;该篇将带你了解 一维数组&#xff0c;二维数组等相关知识。 目录&#xff1a; &#x1f4d8;前言&#xff1a;&#x1f…

【探索Linux】—— 强大的命令行工具 P.6(调试器-gdb、项目自动化构建工具-make/Makefile)

阅读导航 前言一、什么是调试器二、详解 GDB - 调试器1.使用前提2.经常使用的命令3.使用小技巧 三、项目自动化构建工具 - make/Makefile1. make命令⭕语法⭕常用选项⭕常用操作⭕make命令的工作原理⭕make命令的优势&#xff1a; 2.Makefile文件⭕Makefile的基本结构⭕Makefil…

jvm-运行时数据区概述及线程

1.运行时数据区内部结构 不同的jvm对于内存的划分方式和管理机制存在着部分差异 java虚拟机定义了若干种程序运行期间会使用到的运行时数据区&#xff0c;其中有一些会随着虚拟机的启动而创建&#xff0c;随着虚拟机的退出而销毁&#xff0c;另外一些则是与线程一一对应的&…

过来,我告诉你个秘密:送给程序员男友最好的礼物,快教你对象学习磁盘分区啦!小点声哈,别让其他人学会了!

[原文连接:来自给点知识](过来&#xff0c;我告诉你个秘密&#xff1a;送给程序员男友最好的礼物&#xff0c;快教你对象学习磁盘分区啦&#xff01;小点声哈&#xff0c;别让其他人学会了&#xff01;) 再唱不出那样的歌曲 听到都会红着脸躲避 虽然会经常忘了我依然爱着你 …

linux学习(文件描述符)[13]

所以fork的时候函数执行完毕&#xff0c;但是数据还在缓冲区中未刷新。 所以会有父子两份数据 在fork&#xff08;&#xff09;之前ffush&#xff08;&#xff09;&#xff08;c语言的接口&#xff0c;刷新缓冲区&#xff09;fflush(stdout)&#xff0c;就不会有重复 缓冲区的…

公网远程连接Redis数据库详解

文章目录 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址4.3 使用固定的tcp地址连接 前言 洁洁的个人主页 我就问你有没有发挥&#xff0…

动态loading中转页

动态loading中转页 template <div class"loading"><div class"wavy"><!-- --i是自定义属性&#xff0c;可通过var函数调用 --><span style"--i: 1">登</span><span style"--i: 2">录</span>…

银行数据分析师面试题

回答&#xff1a; 1.自我介绍&#xff1a; "大家好&#xff0c;我是XXX&#xff0c;一名数据分析师。我有着对数据的热爱和深入的了解&#xff0c; 希望能够利用我的技能和知识为企业解决问题、做出有效的决策。 在过去的X年里&#xff0c;我一直从事数据分析相关的工作…

【福建事业单位-公基-法】02国家基本制度、公民的基本权利和义务 国家机构

【福建事业单位-公基-法】02国家基本制度 一、国家基本制度1.1 自然资源归属1.2 选举制度1.3 民族区域自治制度总结 二、公民的基本权利和义务1.1 权力1.2 义务总结 三、国家机构3.1 全国人民代表大会3.2全国人民代表大会常务委员会3.3 国家主席3.4国务院3.5监察委3.6 人民法院…

终于找到了这款最好的文献下载网站

在我们文献资源匮乏时&#xff0c;查找下载文献是件非常困难的事。在网上搜索了许多文献下载网站&#xff0c;不是文献资源太少&#xff0c;就是性价比太低&#xff0c;经过筛检比对终于找到了这款文献资源既丰富&#xff0c;又经济适用的文献下载网站。 这款文献下载网站就是…

6.Web后端开发【SpringBoot入门】

文章目录 1 SpringBoot快速入门1.1 Web分析 2. HTTP协议2.1 HTTP-概述2.1.1 介绍2.2.2 特点 2.2 HTTP-请求协议2.3 HTTP-响应协议2.3.1 格式介绍2.3.2 响应状态码 常见的相应状态码 3 WEB服务器3.1 服务器概述 1 SpringBoot快速入门 Spring的官网Spring Boot 可以帮助我们非常…

根据源码,模拟实现 RabbitMQ - 实现消息持久化,统一硬盘操作(3)

目录 一、实现消息持久化 1.1、消息的存储设定 1.1.1、存储方式 1.1.2、存储格式约定 1.1.3、queue_data.txt 文件内容 1.1.4、queue_stat.txt 文件内容 1.2、实现 MessageFileManager 类 1.2.1、设计目录结构和文件格式 1.2.2、实现消息的写入 1.2.3、实现消息的删除…

使用VS2015打开.pro文件后,编译报错

编译报错内容&#xff1a; MSB8036 找不到 Windows SDK 版本10.0.18362.0。请安装所需的版本的 Windows SDK 或者在项目属性页中或通过右键单击解决方案并选择“重定解决方案目标”来更改 SD 方法&#xff1a; 1.右键点击 Solution上&#xff0c;在弹出的框中点击“Retarget…

高速PCB设计初学者容易犯的一些错误

高速PCB设计初学者容易犯的一些错误 硬件开发人员设计PCB时&#xff0c;应力求所设计PCB满足以下条件&#xff1a; PCB应首先满足规定的电气性能指标&#xff0c;原则上时电流越大&#xff0c;走线越宽&#xff1b;电压越大&#xff0c;线与线之间的距离越大&#xff1b;PCB应…

c#的委托事件

声明一个委托 //声明一个委托&#xff0c;指定该委托的每个实例都包含一个方法的引用&#xff0c;方法必须带有一个Int参数&#xff0c;并返回Void delegate void Add(int x); //定义委托基本上是定义一个新类&#xff0c;所以可以再定义类的任何相同地方定义委托&#xff0c;…

【Leetcode】103.二叉树的锯齿形层序遍历

一、题目 1、题目描述 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。 示例1: 输入:root = [3,9,20,null,null,15,7] 输出:[[3],[20,9],[15,7]]示例2: 输入:root = [1] 输…

response-headers,reqqust-headers 请求头大部分字段介绍以及总结

http标头的一些字段的介绍以及使用 公司大下周&#xff0c;趁着摸鱼的时间总结一下大部分标头的大概意思和用法。不是很全&#xff0c;但是大部分应该都在平时需要知道的一些标头的用意 1.Access-Control-Allow-Origin 通过设置这个属性表示可以被哪些网站进行跨域资源共享 …