当前位置:   article > 正文

QGIS 点位标注(续)_qgslabelfeature

qgslabelfeature

在上一篇中,我们图层所有的点位图标都是一样的,但是实际应用中可能每个点位所对应的图标确是不一样的,例如城镇里面的医院、超市、学校等等,都需要用不同的图标来进行标注。

  1. #include <qgis/core.h>
  2. #include <qgis/gui.h>
  3. #include <QApplication>
  4. #include <QIcon>
  5. int main(int argc, char* argv[])
  6. {
  7. // 初始化QGIS应用程序
  8. QgsApplication app(argc, argv, true);
  9. // 加载QGIS提供的GUI工具
  10. QgsGui::initResources();
  11. // 创建地图Canvas(地图画布)
  12. QgsMapCanvas canvas;
  13. canvas.setCanvasColor(Qt::white);
  14. canvas.enableAntiAliasing(true);
  15. canvas.setMinimumSize(800, 600);
  16. // 创建地图Layer(图层)
  17. QgsVectorLayer* layer = new QgsVectorLayer("Point?crs=EPSG:4326", "Points", "memory");
  18. if (!layer)
  19. {
  20. qDebug() << "Failed to create layer!";
  21. return -1;
  22. }
  23. // 添加属性字段,用于区分不同的点位
  24. layer->dataProvider()->addAttributes({QgsField("category", QVariant::String)});
  25. // 创建Feature(要素)并设置点位属性
  26. QgsFeature feature;
  27. QgsGeometry* geometry = new QgsGeometry();
  28. // 设置经纬度坐标,这里假设经度为x,纬度为y
  29. double x1 = 123.456;
  30. double y1 = 78.9;
  31. geometry->addPointXY(x1, y1);
  32. feature.setGeometry(geometry);
  33. feature.setAttribute("category", "category1"); // 设置点位的属性值
  34. // 将Feature添加到图层中
  35. QgsVectorLayerEditBuffer editBuffer(layer);
  36. editBuffer.addFeature(feature);
  37. // 获取不同的点位图标
  38. QString iconPath1 = ":/icons/marker1.png"; // 假设marker1.png是资源文件中的图标1
  39. QString iconPath2 = ":/icons/marker2.png"; // 假设marker2.png是资源文件中的图标2
  40. QIcon icon1(iconPath1);
  41. QIcon icon2(iconPath2);
  42. // 创建符号渲染器
  43. QgsRuleBasedRendererV2* renderer = new QgsRuleBasedRendererV2();
  44. // 创建规则1,根据"category"属性值为"category1"设置图标1
  45. QgsSymbolV2* symbol1 = QgsSymbolV2::defaultSymbol(layer->geometryType());
  46. QgsMarkerSymbolV2* markerSymbol1 = qobject_cast<QgsMarkerSymbolV2*>(symbol1);
  47. markerSymbol1->setIcon(icon1);
  48. QgsRuleBasedRendererV2::Rule* rule1 = new QgsRuleBasedRendererV2::Rule(markerSymbol1);
  49. rule1->setLabel("Category 1");
  50. rule1->setFilterExpression("\"category\" = 'category1'");
  51. renderer->insertChildNode(0, rule1);
  52. // 创建规则2,根据"category"属性值为"category2"设置图标2
  53. QgsSymbolV2* symbol2 = QgsSymbolV2::defaultSymbol(layer->geometryType());
  54. QgsMarkerSymbolV2* markerSymbol2 = qobject_cast<QgsMarkerSymbolV2*>(symbol2);
  55. markerSymbol2->setIcon(icon2);
  56. QgsRuleBasedRendererV2::Rule* rule2 = new QgsRuleBasedRendererV2::Rule(markerSymbol2);
  57. rule2->setLabel("Category 2");
  58. rule2->setFilterExpression("\"category\" = 'category2'");
  59. renderer->insertChildNode(1, rule2);
  60. layer->setRendererV2(renderer);
  61. // 将图层添加到地图Canvas中
  62. QgsMapLayerRegistry::instance()->addMapLayer(layer);
  63. canvas.setExtent(layer->extent());
  64. canvas.setLayers(QgsMapLayerRegistry::instance()->mapLayers().values());
  65. // 显示地图Canvas
  66. canvas.show();
  67. // 运行QGIS应用程序
  68. return app.exec();
  69. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/354335
推荐阅读
  

闽ICP备14008679号