#include "QgsMapToolIdentifyBox.h"
#include <qgsvertexmarker.h>
#include <qgssymbollayer.h>
#include "qgsapplication.h"
#include "QgsMessageLog.h"
QgsMapToolIdentifyAllFeaturesEX::QgsMapToolIdentifyAllFeaturesEX(QgsMapCanvas* canvas)
: QgsMapToolIdentify(canvas)
{
mToolName = tr("Identify All Features");
// set cursor
mCursor = QCursor(Qt::CrossCursor);
}
void QgsMapToolIdentifyAllFeaturesEX::canvasReleaseEvent(QgsMapMouseEvent* e)
{
QPoint point = e->pos() - mInitDragPos;
//点
if (!mSelectionActive || (point.manhattanLength() < QApplication::startDragDistance()))
{
mSelectionActive = false;
mSelectGeometry = QgsGeometry::fromPointXY(toMapCoordinates(e->pos()));
identifyFromGeometry();
}
//矩形
if (mpRubberBand && mSelectionActive)
{
mSelectGeometry = mpRubberBand->asGeometry();
mpRubberBand.reset();
identifyFromGeometry();
}
mSelectionActive = false;
}
void QgsMapToolIdentifyAllFeaturesEX::identifyFromGeometry()
{
if (mCanvas)
{
mCanvas->setSelectionColor(Qt::red);//设置颜色
QList< QgsMapLayer* > layers = mCanvas->layers();
foreach(QgsMapLayer * l, layers)
{
QgsVectorLayer* l1 = qobject_cast<QgsVectorLayer*>(l);
l1->removeSelection();
}
}
//返回选中的结果
QDateTime start = QDateTime::currentDateTime();
QList<IdentifyResult> results = QgsMapToolIdentify::identify(mSelectGeometry, m_mod, LayerType::enum_type::AllLayers);
QDateTime end = QDateTime::currentDateTime();
//QgsMessageLog::logMessage("耗时:"+QString::number((end - start).seconds()), "Messages");
//QList<IdentifyResult> results = QgsMapToolIdentify::identify(mSelectGeometry, m_mod, LayerType::enum_type::AllLayers);
//选择的Features集合
QMap<QString, QList<QgsFeature>> maplist;
//用于显示
QMap<QString,QgsFeatureIds> ids;
for (IdentifyResult var : results)
{
QgsFeature _Feature = var.mFeature;
if (ids.contains(var.mLayer->id())) {
QgsFeatureIds ids1 = ids.value(var.mLayer->id());
ids1.insert(_Feature.id());
ids.insert(var.mLayer->id(), ids1);
}
else {
QgsFeatureIds ids1;
ids1.insert(_Feature.id());
ids.insert(var.mLayer->id(), ids1);
}
}
for (int i = 0; i < results.count(); ++i)
{
QgsVectorLayer* layer = qobject_cast<QgsVectorLayer*>(results.at(i).mLayer);
//只针对开启编辑图层
/*if (!layer->isEditable()) {
continue;
}*/
if (ids.count() > 0)
layer->selectByIds(ids.value(layer->id()));
QgsFeature feature = results.at(i).mFeature;
if (maplist.contains(layer->id())) {
QList<QgsFeature> sfeatures = maplist.value(layer->id());
sfeatures.append(feature);
maplist.insert(layer->id(), sfeatures);
}
else {
QList<QgsFeature> selectFeatures;
selectFeatures.append(feature);
maplist.insert(layer->id(), selectFeatures);
}
}
//发出选中的Feature信息信号
emit AllfeatureIdentified(maplist);
}
void QgsMapToolIdentifyAllFeaturesEX::clearRubberBand()
{
}
bool QgsMapToolIdentifyAllFeaturesEX::init()
{
open();
return true;
}
void QgsMapToolIdentifyAllFeaturesEX::setMode(IdentifyMode mode)
{
m_mod = mode;
}
void QgsMapToolIdentifyAllFeaturesEX::keyPressEvent(QKeyEvent* e)
{
if (e->key() == Qt::Key_Escape)
{
close();
mCanvas->unsetMapTool(this);
clearRubberBand();
}
emit keyPressEventEx(e);
}
void QgsMapToolIdentifyAllFeaturesEX::keyReleaseEvent(QKeyEvent* e)
{
emit keyReleaseEventEX(e);
}
void QgsMapToolIdentifyAllFeaturesEX::canvasPressEvent(QgsMapMouseEvent* e)
{
if (!mpRubberBand) {
mpRubberBand.reset(new QgsRubberBand(mCanvas, Qgis::GeometryType::Polygon));
/*mpRubberBand->setFillColor(mFillColor);
mpRubberBand->setStrokeColor(mStrokeColor);*/
}
mInitDragPos = e->pos();
}
void QgsMapToolIdentifyAllFeaturesEX::canvasMoveEvent(QgsMapMouseEvent* e)
{
if (e->buttons() != Qt::LeftButton)
return;
QRect rect;
if (!mSelectionActive)
{
mSelectionActive = true;
rect = QRect(e->pos(), e->pos());
}
else
{
rect = QRect(e->pos(), mInitDragPos);
}
if (mpRubberBand)
mpRubberBand->setToCanvasRectangle(rect);
}
zhangiser
- 粉丝: 174
- 资源: 12
最新资源
- 基于微信小程序图书馆座位再利用系统-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 基于微信小程序校园订餐的设计与开发+ssm-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- 基于微信小程序的科创微应用平台设计与实现+ssm-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- Python 实现粒子群优化(PSO)算法的深度置信网络(DBN)进行多输入单输出回归预测的实例(含完整的程序,GUI设计和代码详解)
- 基于小程序的物流管理系统---论文-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 基于小程序的购物系统设计与实现+ssm-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- 基于微信小程序的教学质量评价系统ssm-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- Python 实现贝叶斯优化卷积神经网络(BO-CNN)进行时间序列预测的详细项目实例(含完整的程序,GUI设计和代码详解)
- 基于小程序的老孙电子点菜系统开发设计与实现+ssm-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- 基于微信小程序的社区垃圾回收管理系统ssm-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- Python 项目实例,展示如何使用LSTM(长短期记忆)神经网络进行时间序列预测(含完整的程序,GUI设计和代码详解)
- 基于微信小程序的企业职工薪资查询系统设计与实现+ssm-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- 基于微信小程序的商品展示+ssm-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- 基于智能推荐的校园社区服务微信小程序_5x8ot-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 基于微信小程序的体育课评分系统+ssm-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- Python 实现BO-CNN(贝叶斯优化卷积神经网络)模型的详细项目实例(含完整的程序,GUI设计和代码详解)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈