QGIS二次开发 加载离线瓦片地图
准备瓦片地图
可以用QGIS插件QMetaTiles或QTiles直接下载瓦片地图,或者QGIS下载tif再用插件切割瓦片。
新建编辑tms.xml
瓦片地图根目录
QGIS下载tif再用插件切割生成的瓦片
<GDAL_WMS>
<Service name="TMS">
<ServerUrl>file:///F:/4.ziyuan/GIS_DATA/TileFile/earthImage/${z}/${x}/${y}.png</ServerUrl>
<ImageFormat>image/png</ImageFormat>
</Service>
<DataWindow>
<UpperLeftX>-180</UpperLeftX>
<UpperLeftY>90</UpperLeftY>
<LowerRightX>180</LowerRightX>
<LowerRightY>-90</LowerRightY>
<TileLevel>7</TileLevel>
<TileCountX>2</TileCountX>
<TileCountY>1</TileCountY>
<YOrigin>bottom</YOrigin>
</DataWindow>
<Projection>WGS84</Projection>
<BlockSizeX>256</BlockSizeX>
<BlockSizeY>256</BlockSizeY>
<BandsCount>3</BandsCount>
<Cache />
</GDAL_WMS>
QMetaTiles直接下载的瓦片地图
<GDAL_WMS>
<Service name="TMS">
<ServerUrl>file:///F:/tile/Mapnik/${z}/${x}/${y}.png</ServerUrl>
<ImageFormat>image/png</ImageFormat>
</Service>
<DataWindow>
<UpperLeftX>-20037508.34</UpperLeftX>
<UpperLeftY>20037508.34</UpperLeftY>
<LowerRightX>20037508.34</LowerRightX>
<LowerRightY>-20037508.34</LowerRightY>
<TileLevel>4</TileLevel>
<TileCountX>1</TileCountX>
<TileCountY>1</TileCountY>
<YOrigin>top</YOrigin>
</DataWindow>
<Projection>WGS84</Projection>
<BlockSizeX>256</BlockSizeX>
<BlockSizeY>256</BlockSizeY>
<BandsCount>3</BandsCount>
<Cache />
</GDAL_WMS>
对于不同的瓦片数据来源,需要注意的修改
<DataWindow>
<!--修改地图的长宽比例-->
<UpperLeftX>-180</UpperLeftX>
<UpperLeftY>90</UpperLeftY>
<LowerRightX>180</LowerRightX>
<LowerRightY>-90</LowerRightY>
<!--瓦片地图级数-->
<TileLevel>7</TileLevel>
<!--地图各级别下,加载的块数比例-->
<TileCountX>2</TileCountX>
<TileCountY>1</TileCountY>
<!--Y方向的起点位置-->
<YOrigin>bottom</YOrigin>
</DataWindow>
注意
我个人在编辑tms.xml时,遇到<Projection>WGS84</Projection>
改成<Projection>EPSG:4326</Projection>
,用代码加载地图时,图层无效。
代码加载离线瓦片地图
QString strPath = "F:/4.ziyuan/GIS_DATA/TileFile/earthImage/tms.xml";
QgsRasterLayer *pLayer = new QgsRasterLayer(strPath , "mapbox_tiles");
// 判断图层是否创建成功
if (pLayer == nullptr)
{
qDebug() << "load map tiles fail";
return;
}
// 判断图层是否有效
if (!pLayer->isValid())
{
delete pLayer;
pLayer = nullptr;
qDebug() << "map layer is unvalid";
return;
}
// 添加图层
QgsProject::instance()->addMapLayer(pLayer);
ui.pMapCanvas->setExtent(pLayer->extent());