乐趣区

关于程序员:SkeyeGisMap地图扩展一添加形状

1、扩大地图

  • 1、注意事项:

    在任何时候都不要间接操作地图节点 (即 Map*Node ), 因为地图节点位于渲染线程。

    要操作地图节点, 正确的做法有三种:

    • 自定义节点:

    可将节点继承 QObject, 而后应用线程平安的信号槽操作即可。

    • 自定义事件:

      继承 MapEvent 并应用 MapItem::pushEvent() 推送到地图中, 而后在 processUserEvent() 中处理事件。

    • 适当加锁来保障操作为线程平安即可, 但阻塞渲染线程通常不是一个好主见。
  • 2、继承 MapItem:

    MapItem 有两个虚函数, 这两个函数调用位于渲染线程:

    • void preLoadProcess(): 预加载解决 {每次从新加载地图时触发}。

      要启用它须要 setProcessFlag(ProcessFlag::UsePreLoadProcess, true);

    • void processUserEvent(MapEvent *): 解决用户事件, 对于用户自定义事件时会调用它。

      要启用它须要 setProcessFlag(ProcessFlag::UseUserEvent, true);

  • 3、应用图层治理形态:

    MapItem 中有一个根节点 MapRootNode, 它是整个地图的根, 要获取它请应用 MapItem::rootMap()

    MapRootNode 不负责管理任何形态节点, 它只负责管理图层。

    其中, 有两种类型的图层:

    • 世界图层 WorldLayer

      世界图层即无关任何地图变换的图层, 因而, 如果应用此图层则用户必须本人解决变换。

      另外, 所有世界图层位于变换图层之上 (视觉层级)。

    • 变换图层 TransformLayer

      变换图层即蕴含所有地图变换的图层, 因而, 如果应用此图层则所有形态都会蕴含地图变换。

    地图的变换矩阵应用 MapRootNode::transformMatrix() 获取。

    而地图图层负责管理形态, 要向其中增加形态请应用 MapLayerNode::appendShape()

2、增加形态

想要在 SkeyeGisMap 中增加形态, 必须扩大地图, 因而咱们先继承 MapItem:

class AddShapeExample: public MapItem
{
public:
    AddShapeExample()
    {setProcessFlag(MapItem::ProcessFlag::UsePreLoadProcess);
    }

    virtual void preLoadProcess() override
    {auto assistant = rootMap()->assistant();

        // 创立一个矩形
        auto leftTop = assistant->mapToDisplay(CoordinateReference::lonlatToWorld({ 40.0365, 90.7359}));
        auto leftBottom = assistant->mapToDisplay(CoordinateReference::lonlatToWorld({ 24.9160, 94.8131}));
        auto rightTop = assistant->mapToDisplay(CoordinateReference::lonlatToWorld({ 43.1443, 116.2369}));
        auto rightBottom = assistant->mapToDisplay(CoordinateReference::lonlatToWorld({ 26.7637, 116.6262}));
        QPolygonF polygon;
        polygon << leftTop << leftBottom << rightBottom << rightTop << leftTop;

        // 增加到最初一个图层中
        auto lastLayer = rootMap()->lastLayer();
        if (lastLayer)
            lastLayer->appendShape(new MapPolygonNode(polygon, Qt::black, 2, QColor("#a0b80000")));
    }
};

咱们在 preLoadProcess() 中增加形态:

首先是矩形的四个点, 咱们先用 CoordinateReference::lonlatToWorld() 将经纬度转换为世界坐标, 而后应用 MapAssistant::mapToDisplay() 将世界坐标转换为显示坐标。

留神: CoordinateReference::lonlatToWorld() 的参数, x 为纬度, y 为经度。

接着咱们获取到最初一个图层 rootMap()->lastLayer(), 创立 MapPolygonNode 多边形节点退出进去即可。

3、成果展现

源码地址: https://gitee.com/visual-open…

退出移动版