-
-
Notifications
You must be signed in to change notification settings - Fork 3k
/
qgsmaptoolsimplify.h
137 lines (100 loc) · 4.18 KB
/
qgsmaptoolsimplify.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/***************************************************************************
qgsmaptoolsimplify.h - simplify vector layer features
---------------------
begin : April 2009
copyright : (C) 2009 by Richard Kostecky
email : csf dot kostej at mail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGSMAPTOOLSIMPLIFY_H
#define QGSMAPTOOLSIMPLIFY_H
#include "qgsmaptooledit.h"
#include "ui_qgssimplifytolerancedialog.h"
#include <QVector>
#include "qgsfeature.h"
class QgsRubberBand;
class QgsMapToolSimplify;
class QgsCoordinateTransform;
class APP_EXPORT QgsSimplifyDialog : public QDialog, private Ui::SimplifyLineDialog
{
Q_OBJECT
public:
QgsSimplifyDialog( QgsMapToolSimplify* tool, QWidget* parent = NULL );
void updateStatusText();
private:
QgsMapToolSimplify* mTool;
};
/** Map tool to simplify line/polygon features */
class APP_EXPORT QgsMapToolSimplify: public QgsMapToolEdit
{
Q_OBJECT
public:
QgsMapToolSimplify( QgsMapCanvas* canvas );
virtual ~QgsMapToolSimplify();
void canvasPressEvent( QMouseEvent * e ) override;
void canvasMoveEvent( QMouseEvent * e ) override;
void canvasReleaseEvent( QMouseEvent * e ) override;
//! called when map tool is being deactivated
void deactivate() override;
double tolerance() const { return mTolerance; }
enum ToleranceUnits { LayerUnits = 0, MapUnits = 1 };
ToleranceUnits toleranceUnits() const { return mToleranceUnits; }
QString statusText() const;
public slots:
/** slot to change display when slidebar is moved */
void setTolerance( double tolerance );
void setToleranceUnits( int units );
/** slot to store feture after simplification */
void storeSimplified();
void clearSelection();
private:
void selectOneFeature( const QPoint& canvasPoint );
void selectFeaturesInRect();
void updateSimplificationPreview();
int vertexCount( QgsGeometry* g ) const;
// data
/** Dialog with slider to set correct tolerance value */
QgsSimplifyDialog* mSimplifyDialog;
/** Rubber bands to draw current state of simplification */
QList<QgsRubberBand*> mRubberBands;
/** Features with which we are working */
QList<QgsFeature> mSelectedFeatures;
/** real value of tolerance */
double mTolerance;
ToleranceUnits mToleranceUnits;
//! stores actual selection rect
QRect mSelectionRect;
//! shows actual selection rect
QgsRubberBand* mSelectionRubberBand;
//! Flag to indicate a map canvas drag operation is taking place
bool mDragging;
int mOriginalVertexCount;
int mReducedVertexCount;
};
/**
Implementation of Douglas-Peucker simplification algorithm.
*/
class APP_EXPORT QgsSimplifyFeature
{
/** structure for one entry in stack for simplification algorithm */
struct StackEntry
{
int anchor;
int floater;
};
public:
/** simplify line/polygon feature with specified tolerance. Returns true on success */
static bool simplify( QgsFeature& feature, double tolerance, QgsMapToolSimplify::ToleranceUnits units, const QgsCoordinateTransform* ctLayerToMap );
protected:
/** simplify a line given by a vector of points and tolerance. Returns simplified vector of points */
static QVector<QgsPoint> simplifyPoints( const QVector<QgsPoint>& pts, double tolerance, QgsMapToolSimplify::ToleranceUnits units, const QgsCoordinateTransform* ctLayerToMap );
/** get indices of points that should be preserved after simplification */
static QList<int> simplifyPointsIndices( const QVector<QgsPoint>& pts, double tolerance );
};
#endif