摘要: 1.原理 加载矢量数据,首先要指明此数据的类型及其驱动程序。 加载相关数据。 在主窗口中进行显示。 2.QGIS图层数据管理方式 (1)驱动 QGIS中,所有驱动由QgsProviderRegistry类统一管理(单例)。提供对当前工程中驱动的管理。 (2)数...
1.原理
加载矢量数据,首先要指明此数据的类型及其驱动程序。
加载相关数据。
在主窗口中进行显示。
2.QGIS图层数据管理方式
(1)驱动
QGIS中,所有驱动由QgsProviderRegistry类统一管理(单例)。提供对当前工程中驱动的管理。
(2)数据管理
QGIS中,所有图层数据由QgsMapLayerRgistry类统一管理(单例)。监测图层的加载、删除,维护所有图层的内存指针列表。
(3)状态管理
QGIS中,所有图层的状态,由QgsLayerTreeGroup(QgsLayerTreeNode的容器)进行管理。
(4)连接显示
所有显示都在主窗口QgsMapCanvas中进行。QgsMapCanvas通过QgsLayerTreeMapCanvas进行连接显示。
3.加载矢量地图
添加矢量图层前需要将QgsMapCanvas 先冻结,加载完成后再解冻,refresh()就可以显示了。注意,要zoomToFullExtent()才能显示全图。
注:由于vs2008的智能提示实在是不够完善,以后将改为vs2010(vs2012的相关qt-addin-1.2只支持qt5,所以用的1.1,最高支持2010)。使用方法与vs2008相同,只需在工程属性的平台工具集中选择vc9就可以使用vc2008编译了。还有Qt的引用目录有变化,要添加C:/osgeo4w/include/qt4。
在vs/qt中,在blankpro工程中加入以下代码
//loadlayer pMapCanvas->freeze(true); QgsVectorLayer*pVectorLayer=newQgsVectorLayer("D:/test/shapefiles/states.shp","states","ogr",true); //managelayer QgsMapLayerRegistry::instance()->addMapLayer(pVectorLayer); QgsLayerTreeGroup*pGroup=newQgsLayerTreeGroup("myLayerTreeGroup",Qt::Checked); pGroup->addLayer(pVectorLayer); //connectanddisplay QgsLayerTreeMapCanvasBridge*pBridge=newQgsLayerTreeMapCanvasBridge(pGroup,pMapCanvas,this); pMapCanvas->zoomToFullExtent(); pMapCanvas->setDestinationCrs(pVectorLayer->crs()); pMapCanvas->freeze(false); pMapCanvas->refresh();
4.加载栅格地图
栅格地图和矢量地图在Qgis中以相同的方式管理。只要将矢量中的QgsVectorLayer对象更换为QgsRasterLayer来加载栅格图像,就可以了。
在vs/qt中,在blankpro工程中加入以下代码
//loadraster pMapCanvas->freeze(true); QgsRasterLayer*pRasterLayer=newQgsRasterLayer("D:/output/raster.tif","raster",true); //managerlayer QgsMapLayerRegistry::instance()->addMapLayer(pRasterLayer); QgsLayerTreeGroup*pGroup=newQgsLayerTreeGroup("myLayerTreeeGroup",Qt::Checked); pGroup->addLayer(pRasterLayer); //connectanddisplay QgsLayerTreeMapCanvasBridge*pBridge=newQgsLayerTreeMapCanvasBridge(pGroup,pMapCanvas,this); pMapCanvas->zoomToFullExtent(); pMapCanvas->setDestinationCrs(pRasterLayer->crs()); pMapCanvas->freeze(false); pMapCanvas->refresh();