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...