QGIS二次开发地图添加标记添加注记Svg小图标SvgItem

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图层上,并显示在右边了。如果有啥问题请指教。

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄猿欲度愁攀援

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值