QGIS二次开发地图添加标记添加注记Svg小图标
即QgsAnnotationLayer、QgsMarkerSymbol和QgsAnnotationMarkerItem的用法,我把QGIS3.20软件切换成英文才看到注记这个词英文叫Annotation,然后再API手册里一个一个尝试出来的。
QgsCoordinateTransformContext* coordinateTransformContext = new QgsCoordinateTransformContext;
//先构造出一个能加注记的图层
QgsAnnotationLayer* annotationLayer= new QgsAnnotationLayer("annotationLayer",QgsAnnotationLayer::LayerOptions(*coordinateTransformContext));
//第一个小SvgMarkerSymbol,加载资源路径相对路径绝对路径都行
QgsSvgMarkerSymbolLayer* svgMarker = new QgsSvgMarkerSymbolLayer("F:/QtDocument/QgisSecDevel/images/themes/default/money_bank2.svg");
//第二个小SvgMarkerSymbol
QgsSvgMarkerSymbolLayer* svgMarker2 = new QgsSvgMarkerSymbolLayer("F:/QtDocument/QgisSecDevel/images/themes/default/mActionTouch.svg");
//设置第一个和第二个SvgMarkerSymbol的尺寸
svgMarker->setSize(10);
svgMarker2->setSize(8);
//调整了第二个SvgMarkerSymbol的偏移
svgMarker2->setOffset(QPointF(0,-5));
//可以svg的叠加
QgsSymbolLayerList symList;
symList.append( svgMarker->clone());//最好用这个clone要不然删除会有内存泄漏
symList.append(svgMarker2->clone());//最好全都上clone,否则annotationLayer的clear()函数无效,然后这个图层删除会内存泄露
//new出QgsMarkerSymbol类的对象
QgsMarkerSymbol* markSym = new QgsMarkerSymbol( symList );
//构造时传入地理坐标,有必要后期改成鼠标事件点击来创建QgsAnnotationMarkerItem
QgsAnnotationMarkerItem* annotationMarkerItem= new QgsAnnotationMarkerItem(QgsPoint(117.5,32));
QgsAnnotationMarkerItem* annotationMarkerItem2= new QgsAnnotationMarkerItem(QgsPoint(118,32));
annotationMarkerItem->setSymbol(markSym->clone());//给Item加上Svg图像
annotationMarkerItem2->setSymbol(markSym->clone());
annotationLayer->addItem(annotationMarkerItem->clone());//画布添加Item
annotationLayer->addItem(annotationMarkerItem2->clone());
//一系列画布的设置,这个看个人喜好来了
m_mapcanvas->setLayers(m_layers << annotationLayer);//annotationLayer图层添加到我的图层容器中
m_mapcanvas->setCurrentLayer(annotationLayer);
m_mapcanvas->setExtent(QgsCoordinateReferenceSystem("EPSG:4326").bounds());
m_mapcanvas->setExtent(annotationLayer->extent());
//m_mapcanvas->zoomWithCenter(parent->width()/2,parent->height()/2,true);
m_mapcanvas->setVisible(true);
m_mapcanvas->refresh();
m_mapcanvas->fullExtent();
QgsProject::instance()->addMapLayer(annotationLayer);//加入右侧属性栏显示图层名称用的
updateCanvasLayerSet();
m_mapcanvas->zoomToFullExtent();
我svg图是QGIS环境里提供的,我拿来乱用的。不出意外添加QGIS添加文本标记还有一些其他的标记也是这个用法。写完我要去看看QgsAnnotationPolygonItem类、QgsAnnotationPointTextItem类了。看图:
添加了两个标记,一个标记是两张图,在一个QgsAnnotationLayer图层上,并显示在右边了。如果有啥问题请指教。