如何在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加载调用各种在线地图服务的方法,以及加载调用本地离线地图的方法。

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

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值