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…