SkeyeGisMap地图扩展(一)---添加形状
扩展 添加 地图 --- 形状
2023-06-13 09:18:50 时间
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-opening/skeyegismap/tree/master/coremap/example
相关文章
- 为wordpress增加function模板应用-以后不用修改模板函数添加扩展功能
- curl_init php_宝塔php开启curl扩展
- 在Perl中扩展C库(1):XS语言(更新中)
- es6扩展运算符、concat方法合并多个数组
- Spring中11个最常用的扩展点,你知道几个?
- Hplus框架动态添加选项卡功能(扩展)
- PyQt5编程扩展 3.2 资源文件的使用
- 如何使用PHP的swoole扩展提高服务器并发能力
- Redis集群水平扩展、集群中添加以及删除节点的操作
- 18款扩展使Firefox成为渗透测试工具
- Oracle 详解添加实例步骤,快速扩展数据库性能(oracle添加实例)
- 探索XAMPP运行REDIS的可能性(xampp扩展redis)
- Oracle中添加新的SQL语句实现智能扩展(oracle中添加的语句)
- 实现Redis集群无缝扩展添加新机器方案(redis集群添加机器)
- linux下为php添加curl扩展的方法
- oracle分区表之hash分区表的使用及扩展
- PHP添加Xdebug扩展的方法
- C#实现Array添加扩展实例