如何在WeMapEngine中加载显示地图

我们在《全新跨平台GIS引擎将问世》一文中,为你分享了我们自主研发了一款全新跨平台的国产化GIS引擎——WeMapEngine。

现在再为你分享一下,如何在WeMapEngine中加载地图服务的方法,不过该产品暂未发布,因此暂时还无法立即体验。

如何在WeMapEngine中加载显示地图

基础地图是大多数GIS应用的数字“基座”,因为有了基础图层,我们可以在上面进行各种类型的业务拓展开发。

例如,规划设计、指挥调度、地图制图、植被生长检测、自然灾害防治、热力分布等专业功能研发。

我们的WeMapEngine和其它二次开发SDK相同,也支持多种形式的基础地图加载显示,主要包括WMTS瓦片地图服务、自定义/模板URL和本地缓存瓦片等。

你通过WeMapEngine开发GIS系统时,只需要编写少量的代码就可以完成基础地图的加载与显示。   

加载显示WMTS瓦片地图

WMTS是开发地理信息联盟(Open Geospatial Consortium OGC)制定的瓦片地图标准。

它基于静态缓存技术,实现该标准的服务通常具有支持高并发、高性能的技术特性, 大多数GIS服务端或客户端都支持该标准。

可以通过WeServer、GeoServer、ArcGIS Server或其它地图服务端来发布该标准的地图服务。

(1)加载显示WeServer发布的地图

加载WeServer发布的地图服务时,只需要添加类似以下的代码即可。

//准备服务地址const QString strUrl =QStringLiteral("https://test.ditushuju.cn:8086/WeServer/wmts?service=wmts&request=getcapabilities");           //创建WMTS图层pLayer = new WeWmtsLayer("GlobalMap", strUrl, "acimage");           //把图层添加到视图mMapView->addLayer(pLayer);

在Demo中运行代码后,就可以查看WeServer发布地图的加载显示效果。

图片

WeServer发布地图的加载显示效果

(2)加载显示ArcGIS Server发布的地图

加载显示ArcGIS Server发布的地图服务时,只需要添加类似以下代码即可。

//准备服务地址const QString strUrl =QStringLiteral("http://sampleserver6.arcgisonline.com/arcgis/rest/services/WorldTimeZones/MapServer/WMTS");           //创建WMTS图层pLayer = new WeWmtsLayer("WorldTimeZones", strUrl, "WorldTimeZones");               //把图层添加到视图mMapView->addLayer(pLayer);

在Demo中运行代码后,就可以查看ArcGIS Server发布地图的加载显示效果。

图片

ArcGIS Server发布地图的加载显示效果

以上为你分享了如何使用WeMapEngine加载WeServer和ArcGIS Server发布的WMTS服务,如果要加载其它地图服务端发布的服务,方法也基本相同。

对于这样的标准地图服务,在加载WMTS图层时仅需要提供服务的元信息地址,并指定要访问的图层名称就可以了。   

加载显示URL自定义地图

对于提供了地图服务API申请的数据服务商,大多都提供了WMTS服务的元信息地址,例如星图地球或天地图等。

但这并不能应对所有情况,因为有的地图服务我们只能获取到瓦片的访问地址,比如OpenStreetMap地图。

有时我们也希望自主构建更灵活的请求方式,能够自定义瓦片请求地址。

从而设置自定义请求头信息,对需要附带Token的请求临时更换Token等操作。

该功能只需要通过继承WeServiceImageTiledLayer就可以实现自定义URL图层,下面的代码演示了如何自定义一个图层来加载星图地球的图源。

class MyCustomLayer : public WeServiceImageTiledLayer{ MyCustomLayer(const WeTiledInfo& tiledInfo, const WeRectangle& fullExtent)               : WeServiceImageTiledLayer(tiledInfo, fullExtent, QStringLiteral("GeoVisearth"))        {        /* 瓦片请求配置 */        WeRequestConfiguration reqestConfig;              reqestConfig.setRetryCount(5);                  reqestConfig.setTimeout(3000);              QMapheaders;              reqestConfig.setUserHeaders(headers);              setRequestConfiguration(reqestConfig);                         /* 监听瓦片请求时回调信号 */              connect(this, &MyCustomLayer::tileUrlRequest, [&](const WeTileKey& tk)              {            //星图地球瓦片URL模板,用到的token可以在星图申请                     const QString strUrlTemplate = QStringLiteral("https://tiles.geovisearth.com/base/v1/img/mercator/%1/%2/%3?format=webp&tmsIds=w&token=5196de35d4c1cf288b3ecf4c9e819b33c0e3bffad707ea9caeed599bf2a378ac");            //格式化URL            const QString strUrlTile = strUrlTemplate.arg(tk.level()).arg(tk.column()).arg(tk.row());                        //将URL设置给接口                     setTileUrl(tk, stTileUrl);                  });       }                  ~MyCustomLayer() {};}

在Demo中运行代码后,就可以查看URL自定义地图的加载显示效果。

图片

URL自定义地图的加载显示效果

同样地,通过以上方法也可调用吉林一号的在线卫星影像,前提是你已经申请了你的专属图源。

申请的具体方法,请参阅《如何申请吉林一号专属图源》一文中的详细说明。   

加载显示XYZ瓦片模板地图

所谓“模板URL”是指具有特定占位符的地图瓦片URL地址,配合引擎提供的Web瓦片图层接口,就可以轻松实现瓦片地图的加载。

占位符是引擎内置的关键字,因此它不具有通用性。

WeMapEngine的内置占位符以及他们所代表的含义如下:

URL模板:https://{subDomain}.server.org/path/{level}/{col}/{row}.png

{level}     : 级别

{col}       : 瓦片列

{row}       : 瓦片行

{subDomain} : 子域名(可选)      

明白模板URL的接口以后,下面我们通过在来看一下如果使用模板URL图层来加载OpenStreetMap图源。​​​​​​​

//OSM 瓦片地址const QString strOSMTemplate = QStringLiteral("https://tile.openstreetmap.org/{level}/{col}/{row}.png");           //创建图层    pLayer = new WeWebTiledLayer(QStringLiteral("OSM"), strOSMTemplate);           //添加到视图pMapView->addLayer(pLayer);

由于SDK内置了OpenStreetMap图层,对于上面的示例我们还可以简化成如下形式。​​​​​​​

//创建图层pLayer = new WeOpenStreetMapLayer();           //添加到视图pMapView->addLayer(pLayer);

在Demo中运行代码后,就可以查看XYZ瓦片模板地图的加载显示效果。   

图片

XYZ瓦片模板地图的加载显示效果

最常见的XYZ瓦片的模板地图,有谷歌地图、高德地图和腾讯地图等,因此这些地图都可以在WeMapEngine中进行加载。

加载显示本地松散型瓦片地图

WeMapEngine除了可以加载在线服务的地图外,还可以加载显示本地的松散型瓦片地图。

但我们通常不建立将瓦片地图在本地进行松散型存储,尤其是全球范围这样的海量地图数据。

关于这一点,我们在《合作,不是无条件的服从》一文中已为大家作过“血泪”分享。

不过在数据范围较小,一般不超过两三个中型省份这样的数据体量时,还是可以勉强存储为松散型瓦片后再调用。   

松散型瓦片的存储方式,一般以“z/x/y.jpg”目录形式来表达的瓦片层级关系,如下图所示。

图片

松散型地图瓦片目录

WeMapEngine可以通过继承WeImageTiledLayer图层来加载此类数据源,下面的示例演示了如何构建一个本地文件加载图层。​​​​​​​

class MyLocalLayer : public WeImageTiledLayer{       Q_OBJECTpublic:       MyLocalLayer(const WeTiledInfo& tiledInfo, const WeRectangle& fullExtent)                  : WeImageTiledLayer(tiledInfo, fullExtent, QString::fromLocal8Bit("本地瓦片")) {               /* 监听瓦片请求 */              connect(this, &MyLocalLayer::tileRequest, [&](const WeTileKey& tk) {                                          const QString strRootDir  = QStringLiteral("G:\\Data\\Data.Publish\\tiled_google\\%1\\%2\\%3.jpg");                     const QString strFileName = strRootDir.arg(tk.level()).arg(tk.column()).arg(tk.row());                                       QFile f(strFileName);                     if (!f.exists())                     {                            //瓦片不存在,设置为NoData                            setNoDataTile(tk);                     }                     else if (!f.open(QIODevice::OpenModeFlag::ReadOnly))                     {                                //打开文件失败,设置错误                            setTileError(tk, QString("Cannot open: %1").arg(strFileName));                     }                     else                     {                            //正常读取,设置瓦片数据                            setTileData(tk, f.readAll());                     }              });       }                  ~MyLocalLayer() {}};

在Demo中运行代码后,就可以查看本地松散型瓦片的加载显示效果。   

图片

本地松散型瓦片的加载显示效果

通过扩展开发,也支持加载调用存储为SQlite或MbTiles本地瓦片离线包。

本地数据的加载,通常用于私有化地图的部署,而私有化地图的部署一般适用于有保密需要的企事业单位。

如果想进一步了解私有部署相关方面的技术或方案,请参阅《私有化地图离线部署整体解决方案》和《难以置信,谁还会用离线地球》等文中的详细说明。

WeMapEngine的地图加载能力

基于WeMapEngine的二次开发,可调用加载各种地图的方法,且仅需要编写少量的代码就可以实现。

因此当采用WeMapEngine作为GIS开发平台时,你可以将更多的时间和精力放在核心业务功能的研发上。   

另外,WeMapEngine引擎也支持对WMS、TMS服务的加载调用,以及可能涉及的权限认证能力,这里只是限于篇幅的原因暂略。

随着引擎的不断更新迭代,我们还会加入对矢量瓦片的兼容,从而实现更丰富自由多元化的地理元素信息渲染表达。

鉴于相应的帮助文档还在完善过程中,WeMapEngine的SDK开发包暂不对外提供

如果你想了解该WeMapEngine引擎的更多功能,请扫下方二维码添加微信,并发送“WeMapEngine”以说明来意。

图片

扫码联系

写在最后

本文为你分享了WeMapEngine加载调用各种在线地图服务的方法,以及加载调用本地离线地图的方法。

你可以立即点击“分享”按钮,将本文免费分享给你的朋友!

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

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

相关文章

HormonyOs之 路由简单跳转

Navigation路由相关的操作都是基于页面栈NavPathStack提供的方法进行,每个Navigation都需要创建并传入一个NavPathStack对象,用于管理页面。主要涉及页面跳转、页面返回、页面替换、页面删除、参数获取、路由拦截等功能。 Entry Component struct Index …

Spring -- 三层架构

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 今天你敲代码了吗 应用分层 介绍 在阿里的开发手册里,关于工程结构部分,定义的常见工程的应用分层结构 那么什么是应用分层呢? 应用分层是一种软件开发设计思想,他将应用程序分层N个层次.这N个层次分别负责各…

vue3【详解】内置组件 Transition

用于给元素或组件进入和离开页面添加过渡动画 使用场景 v-if 切换 <button click"show !show">Toggle</button> <Transition><p v-if"show">hello</p> </Transition>v-show 切换 动态组件切换 <Transition name&…

Adobe国际认证详解-ae视频剪辑

AE视频剪辑&#xff0c;即After Effects视频剪辑&#xff0c;是数字媒体时代的一项重要技能。AE不仅提供了丰富的特效和动画功能&#xff0c;还让视频剪辑变得更加高效和有趣。对于想要在职场上脱颖而出、拓宽就业机遇的人来说&#xff0c;掌握AE视频剪辑技能无疑是一个明智的选…

小程序基础总结

组件标签 html wxml div span img a view text image navigator css wxss rpx 小程序响应式单位,在不同设备上自动进行换算 js app.js 项目入口文件 ,通过App()函数启动整个小程序 页面的 .js ,页面入口文件,通过Page()函数创建运行页面 通信模型 渲染层 逻辑层 第三方…

Q*s‘ AGI

最近这段时间&#xff0c;不论是产业界还是学术界&#xff0c;均发表了不少围绕「Q*」的探索和实验&#xff0c;同时随着OpenAI的「草莓QQ糖(皮一下)」计划的曝光与训练的进行&#xff0c;似乎又为当前围绕Q*、AGI、AI4S等领域带来了不少业界争鸣和讨论&#xff0c;而且周围更多…

Electron案例解析——切换主题颜色的案例

效果图 核心 Electron的 nativeTheme.themeSource属性&#xff0c;值是string。有三个参数&#xff1a;system, light 和 dark&#xff0c;用来覆盖、重写Chromium内部的相应的值 Election的api描述值nativeTheme.themeSource被用来覆盖、重写Chromium内部的相应的值system, …

谷粒商城实战笔记-45-商品服务-API-三级分类-查询-递归树形结构数据获取

文章目录 一&#xff0c;准备工作1&#xff0c;启动虚拟机2&#xff0c;启动mysql3&#xff0c;执行MySQL脚本插入分类数据4&#xff0c;关于三级分类 二&#xff0c;Controller层新增接口三&#xff0c;Service层新增接口1&#xff0c;代码实现2&#xff0c;测试 从这一节开始…

实验二 FPGA使用Verilog HDL设计分频器

实验目的 掌握使用Vivado软件进行设计、综合、仿真、布线的方法。掌握FPGA程序的下载方法。掌握使用Verilog HDL设计分频器的方法。 实验要求 采用Verilog HDL语言设计分频器&#xff0c;实现以下功能&#xff1a; 输出时钟周期为1s的分频时钟信号&#xff1b;通过LED灯或数码…

15个在线地图瓦片URL分享

数据是GIS的血液&#xff0c;我们在《10个在线地图瓦片URL分享》一文中为你分享了10个地图瓦片URL链接&#xff0c;现在再为你分享5个在线的瓦片地图URL图源&#xff01; 该在线地图瓦片URL支持在GIS软件或开发平台进行调用&#xff0c;比如ArcGIS、QGIS、Global Mapper、Open…

PowerBI宝藏级资料分享推荐

有同学留言想学习PowerBI&#xff0c;求推荐可以免费学习的网站&#xff0c;最好是比较系统的&#xff0c;不要那种广告或诱导付费才能学习的网站。 这样的学习网站确实有&#xff0c;主打大家要求的免费。 推荐大家几个我一直私藏的宝藏级&#xff0c;学习和使用资料网站. …

《经典图论算法》贝尔曼-福特算法(Bellman-Ford)

摘要&#xff1a; 1&#xff0c;Bellman-Ford 算法的介绍 2&#xff0c;Bellman-Ford 算法为什么可以解决有负权边的图 3&#xff0c;Bellman-Ford 算法为什么不能解决有负权回路的图 4&#xff0c;Bellman-Ford 算法的代码实现和负权回路的判断 5&#xff0c;Bellman-Ford 算法…

测试——Selenium

内容大纲: 什么是自动化测试 什么是Selenium Selenium工作原理 Selenium环境搭建 Selenium API 目录 1. 什么是自动化测试 2. 什么是Selenium 3. Selenium工作原理 4. Selenium环境搭建(java) 5. Selenium API 5.1 定位元素 5.1.1 CSS选择器定位元素 5.1.2 XPath定位元…

# Redis 入门到精通(十一)-- 集群

Redis 入门到精通&#xff08;十一&#xff09;-- 集群 一、redis 集群 – 集群简介 1、现状问题&#xff1a;业务发展过程中遇到的峰值瓶颈 redis提供的服务OPS可以达到10万/秒&#xff0c;当前业务OPS已经达到10万/秒。内存单机容量达到256G&#xff0c;当前业务需求内存容…

【机器学习】模型验证曲线(Validation Curves)解析

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 模型验证曲线(Validation Curves)解析什么是模型验证曲线?模型验证曲线的解读模…

微信答题小程序产品研发-确定产品的定位

盛夏蝉鸣起&#xff0c;荷风香十里。我前面说过&#xff0c;我决意仿一款答题小程序&#xff0c;所以我做了大量的调研。 答题小程序软件产品开发不仅仅是写代码这一环&#xff0c;它包含从需求调研、分析与构思、设计到开发、测试再到部署上线一系列复杂过程。 在软件开发中…

增材制造与智能制造关系

在撰写的增材制造技术与装备书籍中有着明确的描述&#xff0c;增材制造是智能制造的典型范例&#xff0c;是智能制造“类”的实例化过程。这种借助于计算机编程面向对象思想的解释可以更全面的理解增材制造和智能制造的关系。增材制造实例具备了智能制造类的属性&#xff0c;智…

数据库中字符串连接符的使用

在数据库操作中&#xff0c;字符串处理是日常工作中不可或缺的一部分。无论是构建动态查询&#xff0c;还是处理数据输出&#xff0c;字符串连接符的使用都是至关重要的。那么&#xff0c;如何正确地使用字符串连接符&#xff0c;才能高效地进行字符串操作呢&#xff1f; 在数据…

网站安全-CDN篇

为了保证 CDN 不被恶意刷流量导致高额账单&#xff0c;可以对 CDN 做防护措施&#xff0c;或使用高防 CDN。 ‍ ‍ ‍ 普通 CDN 普通 CDN 受到恶意攻击&#xff0c;也是会计费的。目前国内大部分 CDN 厂商都是这样的套路&#xff1a;即使你的 CDN 流量用完了&#xff0c;还…

Pyside6绘制折线图并计算面积

Pyside6绘制折线图并计算面积 import sys import random from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QMainWindow from PySide6.QtCore import Qt, QRectF, QPointF, Signal from PySide6.QtGui import QPainter, QPen, QColor, QMouseEventclass P…