二丶openlayer之视图View

View就是这样的,作为地图的窗口,做一些改变,就能看到变化,便于初学者学习。同时,View是OpenLayers地图组成部分中非常重要的一个概念,涉及到地图移动,放大,缩小,旋转等,这些功能是任何一个GIS引擎必不可少的。为此,我们把它作为最先介绍和学习的组成部分。

1.view之视图导航

在深入学习之前,还是先来个开胃菜,见识一下View所承载的功能。下面将演示地图导航功能,关于导航相关功能,在前面操作地图的时候,已经有了充分的理解和认识。为什么我们还要再讨论它呢?因为这次的导航功能,需要自己来实现,而且只使用ol.View提供的方法就可以做到。
我们先创建地图,实现左移,右移,上移,下移,移动到重庆,放大,缩小这几个功能

我们还是以vue3中的代码为案例

<script setup lang="ts">import "ol/ol.css";import { ref, onMounted } from "vue";import * as ol from "ol";import { Projection, addProjection } from "ol/proj";import { XYZ } from "ol/source";import Tile from "ol/layer/Tile";const mapRef = ref();const olmap = ref();onMounted(() => {// 4490处理const projection = new Projection({code: "EPSG:4490",units: "degrees",axisOrientation: "neu"});projection.setExtent([-180, -90, 180, 90]);projection.setWorldExtent([-180, -90, 180, 90]);addProjection(projection);const GJ_TDT_HOST = () =>`http://t${Math.round(Math.random() * 7)}.tianditu.com/DataServer?T=`;const GJ_TDT_TOKEN = "13a4fee837babd2b8c569ebff100fe9f";olmap.value = new ol.Map({layers: [new Tile({source: new XYZ({projection: "EPSG:4490",url: `${GJ_TDT_HOST()}vec_c&x={x}&y={y}&l={z}&tk=${GJ_TDT_TOKEN}`})}),new Tile({source: new XYZ({projection: "EPSG:4490",url: `${GJ_TDT_HOST()}cva_c&x={x}&y={y}&l={z}&tk=${GJ_TDT_TOKEN}`})})],view: new ol.View({projection: "EPSG:4490",center: [107.530635013, 29.5446061089],zoom: 8,minZoom: 6}),target: mapRef.value});});
</script>
<template><div id="map" ref="mapRef"><div id="navigate"><el-button @click="moveToLeft()">左移</el-button><el-button @click="moveToRight()">右移</el-button><el-button @click="moveToUp()">上移</el-button><el-button onClick="moveToDown();">下移</el-button><el-button @click="moveToChengDu()">移到成都</el-button><el-button @click="zoomIn()">放大</el-button><el-button @click="zoomOut()">缩小</el-button></div></div>
</template><style scoped>#map {position: absolute;left: 0;width: 100%;height: 100%;border: 1px solid #ccc;}
</style>
1.1实现左移方法
const moveToLeft = () => {const view = olmap.value.getView();const mapCenter = view.getCenter();// 让地图中心的x值增加,即可使得地图向左移动,增加的值根据效果可自由设定mapCenter[0] += 1;view.setCenter(mapCenter);olmap.value.render();};
1.2实现右移方法
  const moveToLeft = () => {const view = olmap.value.getView();const mapCenter = view.getCenter();// 让地图中心的x值增加,即可使得地图向左移动,增加的值根据效果可自由设定mapCenter[0] += 1;view.setCenter(mapCenter);olmap.value.render();};
1.3 实现上移方法
 const moveToUp = () => {const view = olmap.value.getView();const mapCenter = view.getCenter();mapCenter[1] -= 1;view.setCenter(mapCenter);olmap.value.render();
};
1.4实现下移方法
const moveToDown = () => {const view = olmap.value.getView();const mapCenter = view.getCenter();mapCenter[1] += 1;view.setCenter(mapCenter);olmap.value.render();
};
1.5 定位到重庆
const moveToCq = () => {const view = olmap.value.getView();view.setCenter([107.530635013, 29.5446061089]);
};
1.6 放大
const zoomIn = () => {const view = olmap.value.getView();view.setZoom(view.getZoom() + 1);
};
1.7 缩小
const zoomOut = () => {const view = olmap.value.getView();view.setZoom(view.getZoom() - 1);
};

2.坐标

关于原点,方向,单位等等的相关定义和描述,组成了我们常说的坐标系。

2.1 坐标系及投影

在GIS中我们需要地理坐标系。但它并不像笛卡尔坐标系那样简单,学过地理知识就知道,地球并不是一个完全规则的球体。在不同的地区,为了在数学上表示它,就出现了多种不同的参考椭球体,比如克拉索夫斯基(Krasovsky)椭球体,WGS1984椭球体,更多的椭球体参见参考椭球体。在参考椭球体的基础上,就发展出了不同的地理坐标系,比如我国常用的WGS84,北京54,西安80坐标系,欧洲,北美也有不同的坐标系。北京54使用的是克拉索夫斯基(Krasovsky)椭球体,WGS84使用的是WGS1984椭球体。由此可见,多个坐标系是源于地理的复杂性

由于存在着多种坐标系,即使同样的坐标,在不同的坐标系中,也表示的是不同的位置,这就是大家经常遇到的偏移问题的根源,要解决这类问题,就需要纠偏,把一个坐标系的坐标转换成另一个坐标系的坐标。由于WGS84是全球通用的坐标系,涉及到多个坐标系与它之间的转换

有了坐标系后,我们就能精确的表示地球上的每一个位置,但为什么还需要投影呢?投影是为了把不可展的椭球面描绘到平面上,它使用几何透视方法或数学分析的方法,将地球上的点和线投影到可展的曲面(平面、园柱面或圆锥面)上,再将此可展曲面展成平面,建立该平面上的点、线和地球椭球面上的点、线的对应关系。正是因为有投影,大家才能在网页上看到二维平面的地球地图。

2.2 ol中使用的坐标系

目前OpenLayers 3支持两种投影,一个是EPSG:4326,等同于WGS84坐标系,参见详情。另一个是EPSG:3857,等同于900913,由Mercator投影而来,经常用于web地图,参见详情。一个是全球通用的,一个是web地图专用的,自然OpenLayers支持它们。在使用过程中,需要注意OpenLayers默认使用的是EPSG:3857。这也是为什么前面的代码里需要进行坐标转换的原因。 既然支持EPSG:4326,为什么还要转换?当然是可以不用转换的,但前提是你得指定使用具体那种投影,就像下面这样。

import { Projection, addProjection } from "ol/proj";const projection = new Projection({code: "EPSG:4490",units: "degrees",axisOrientation: "neu"});projection.setExtent([-180, -90, 180, 90]);projection.setWorldExtent([-180, -90, 180, 90]);addProjection(projection);

3.ol.View的应用

1.限制地图的范围

在实际使用中,往往只关心某一个区域的地图,而无需显示整个地球的地图,这样可以聚焦于业务,同时可以减少前端和后台的地图数据。无疑,这样的功能是非常有用的。下面我们就将看到,地图只能在经度29度到31度,纬度在102到104度之间显示.

   view: new ol.View({projection: "EPSG:4490",center: [107.530635013, 29.5446061089],extent: [102, 29, 104, 31],zoom: 8,minZoom: 6}),

就只是添加了 extent: [102, 29, 104, 31],这行代码就实现了功能。extent参数类型为[minX, minY, maxX, maxY]的ol.Extent,很容易记住

2.自适配区域

在实际应用中,会有一些地图查找和标注的业务,比如查看重庆渝北区。而这时,地图所在区域可能是北京,我们需要能够让地图直接定位到渝北区,并且最大化完全地显示这块区。

const fitToyubei = () => {olmap.value.getView().fit([106.631187, 29.718143, 107.631187, 30.718143]);
};

只用了一行代码,ol.View的fit函数很强大,希望能认真仔细的查看API文档,它的第三个参数还可以设置更多的选项,以适应更多的需要。

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

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

相关文章

SQL注入-数据库基础/SQL语法

目录 一&#xff0c;数据库概述 1.1 数据库 1.2 了解 ACID 理论 1.3 识别数据库 二&#xff0c;SQL 语法基础 三&#xff0c;SQL语句实例 3.1 SQL基础语句 3.2 SQL高级语句 四&#xff0c;基于SQL注入理解语法/函数 4.1 语法 4.2 函数 五&#xff0c;目录数据库info…

C++之算术生成算法

C之算术生成算法 accumulate #include<iostream> using namespace std; #include<vector> #include<numeric>void test() {vector<int> v;for (int i 0; i < 10; i){v.push_back(i);}int total accumulate(v.begin(), v.end(),0);cout << t…

车规激光雷达再商用车前装市场的应用

1、商用车需要什么样的激光雷达 2、如何实现车规级&#xff08;商用车&#xff09;的激光雷达 3、激光雷达安装部署方案

使用conan包 - 调试软件包

使用conan包 - 调试软件包 主目录 conan Using packagesDebugging packages 本文是基于对conan官方文档Debugging packages的翻译而来&#xff0c; 更详细的信息可以去查阅conan官方文档。 This section shows how to setup your project and manage dependencies (i.e., inst…

【源码】医院安全(不良)事件管理系统,11种不良事件类型,覆盖全院全部科室及所有可能发生的不良事件

医疗不良事件报告系统旨在建立全面的、统一的医疗不良事件标准分类系统和患者安全术语&#xff0c;使不良事件上报管理更加标准化和科学化。 通过借鉴国内外医疗不良事件报告系统的先进经验&#xff0c;根据医疗不良事件的事件类型、处理事件的不同部门&#xff0c;灵活设置上报…

【redis主从架构】

文章目录 Redis主从架构Redis主从工作原理数据部分复制管道&#xff08;Pipeline&#xff09;Redis Lua脚本Redis哨兵高可用架构StringRedisTemplate与RedisTemplate详解 Redis主从架构 Redis主从工作原理 如果你为master配置了一个slave&#xff0c;不管这个slave是否是第一…

Android UnsatisfiedLinkError问题定位

文章目录 UnsatisfiedLinkError 通常发生在 Java Native Interface (JNI) 中&#xff0c;表示 Java 代码尝试加载本地库&#xff08;Native Library&#xff09;时失败。以下是一些常见导致 UnsatisfiedLinkError 的情况&#xff1a; 库名称不匹配&#xff1a; Java 代码中加载…

【我的创作纪念日】

机缘 大家好&#xff0c;我是圥忈ゼ&#xff0c; 2023 年 07 月 20 日&#xff0c;我撰写了第 1 篇技术博客&#xff1a;《我的编程未来规划》&#xff0c;也是由于我高考后的专业选择&#xff0c;和就业方向的选择&#xff0c;加上想立志成为一名专业 IT 作者&#xff0c;我结…

蓝桥杯每日一题2023.11.26

题目描述 奖券数目 - 蓝桥云课 (lanqiao.cn) 将每一个数字进行一一枚举&#xff0c;如果检查时不带有数字4则答案可以加1 #include<bits/stdc.h> using namespace std; int ans; bool check(int n) {while(n){if(n % 10 4)return false;n / 10; }return true; } int m…

京东秒杀之秒杀详情

1 编写前端页面&#xff08;商品详情&#xff09; <!DOCTYPE html> <head><title>商品详情</title><meta http-equiv"Content-Type" content"text/html; charsetUTF-8" /><script type"text/javascript" src&…

drool 7 multiThread 测试

基本信息 通过option &#xff0c;使用如下代码进行设置 //线程数量10MaxThreadsOption optionMaxThreadsOption.get(10);kieBaseConf.setOption(option);kieBaseConf.setOption(MultithreadEvaluationOption.YES);并发是以CompositeDefaultAgenda/Rule为颗粒度来的&#xff0…

世微AP5125 DC-DC降压恒流 LED车灯电源驱动IC SOT23-6

产品描述 AP5125 是一款外围电路简单的 Buck 型平均电流检测模式的 LED 恒流驱动器&#xff0c;适用于 8-100V 电压范围的非隔离式大功率恒流 LED 驱动领域。芯片采用固定频率 140kHz 的 PWM 工作模式&#xff0c; 利用平均电流检测模式&#xff0c;因此具有优异的负载调整 率…

【微服务】java 规则引擎使用详解

目录 一、什么是规则引擎 1.1 规则引擎概述 1.2 规则引擎执行过程 二、为什么要使用规则引擎 2.1 使用规则引擎的好处 2.1.1 易于维护和更新 2.1.2 增强应用程序的准确性和效率 2.1.3 加快应用程序的开发和部署 2.1.4 支持可视化和可管理性 2.2 规则引擎使用场景 三、…

如何在C/C++中测量一个函数或者功能的运行时间(串行和并行,以及三种方法的实际情况对比)

本文算是一个比较完整的关于在 C/C 中测量一个函数或者功能的总结&#xff0c;最后会演示三种方法的对比。 最常用的clock() 最常用的测量方法是使用clock()来记录两个 CPU 时间点clock_t&#xff0c;然后做差。这个方法的好处在于非常简单易写&#xff0c;如下&#xff08;第…

在龙蜥 anolis os 23 上 源码安装 PostgreSQL 16.1

在龙蜥 OS 23上&#xff0c;本来想使用二进制安装&#xff0c;结果发现没有针对龙蜥的列表&#xff1a; 于是想到了源码安装&#xff0c;下面我们列出了PG源码安装的步骤&#xff1a; 1.安装准备 1.1.创建操作系统组及用户 groupadd postgres useradd -g postgres -m postgr…

10、静态数码管显示

数码管介绍 LED数码管:是一种简单、廉价的显示器&#xff0c;是由多个发光二极管封装在一起组成“8”字型的器件 数码管引脚的定义 共阴极、共阳极 例如&#xff1a;显示数字1&#xff08;b,c段&#xff09; 3、8&#xff1a;接VCC或者GND/低电平 10011111 0110000 共阴极、…

Vue框架学习笔记——条件渲染:v-show和v-if

文章目录 前文提要条件渲染v-showv-ifv-else-if和v-else特殊写法&#xff0c;很多个一致的v-if如何消除 总结 前文提要 本人仅做个人学习记录&#xff0c;如有错误&#xff0c;请多包涵 主要学习链接&#xff1a;尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 条件渲染 条…

Android frameworks 开发总结十一

1.修改GMS的setup wizard 1.1 找到需要修改的文件 打开vendor/partner_gms/apps/GmsSampleIntegration/res/values/config.xml文件。以Arashi R为例: <resources><string name="wizard_script_uri" translatable="false">android.resource…

百度人工智能培训第一天笔记

参加了百度人工智能初步培训&#xff0c;主要是了解一下现在人工智能的基本情况&#xff0c;以便后续看可以参与一些啥&#xff1f; 下面就有关培训做一些记录&#xff0c;以便后续可以继续学习。 一、理论基础部分 二、实际操作部分 主要学习的百度人工智能平台如下&#xf…

编程语言发展史:Swift语言的应用和影响

一、引言 Swift是苹果公司于2014年发布的一种编程语言&#xff0c;旨在取代Objective-C成为iOS和macOS等苹果操作系统的主要编程语言。Swift的出现彻底改变了苹果的开发生态&#xff0c;对于iOS和macOS开发者来说&#xff0c;Swift已经成为了必备的技能之一。本文将介绍Swift语…