Skip to content

Commit eda3396

Browse files
committedSep 24, 2018
update spatial index only when mesh or CRS changed
1 parent 7ad1b71 commit eda3396

File tree

2 files changed

+85
-10
lines changed

2 files changed

+85
-10
lines changed
 

‎src/core/mesh/qgstriangularmesh.cpp

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,42 @@
2525
#include "qgsfeatureid.h"
2626
#include "qgsgeometry.h"
2727
#include "qgsrectangle.h"
28+
#include "qgsfeatureiterator.h"
29+
30+
///@cond PRIVATE
31+
32+
QgsMeshFeatureIterator::QgsMeshFeatureIterator( QgsMesh *mesh )
33+
: QgsAbstractFeatureIterator( QgsFeatureRequest() )
34+
, mMesh( mesh )
35+
{}
36+
37+
QgsMeshFeatureIterator::~QgsMeshFeatureIterator() = default;
38+
39+
bool QgsMeshFeatureIterator::rewind()
40+
{
41+
it = 0;
42+
return true;
43+
}
44+
bool QgsMeshFeatureIterator::close()
45+
{
46+
mMesh = nullptr;
47+
return true;
48+
}
49+
50+
bool QgsMeshFeatureIterator::fetchFeature( QgsFeature &f )
51+
{
52+
if ( !mMesh || mMesh->faces.size() <= it )
53+
return false;
54+
55+
const QgsMeshFace &face = mMesh->faces.at( it ) ;
56+
QgsGeometry geom = QgsMeshUtils::toGeometry( face, mMesh->vertices );
57+
f.setGeometry( geom );
58+
++it;
59+
return true;
60+
}
61+
62+
63+
///@endcond
2864

2965
static void ENP_centroid_step( const QPolygonF &pX, double &cx, double &cy, double &signedArea, int i, int i1 )
3066
{
@@ -75,21 +111,28 @@ void QgsTriangularMesh::update( QgsMesh *nativeMesh, QgsRenderContext *context )
75111
Q_ASSERT( nativeMesh );
76112
Q_ASSERT( context );
77113

78-
mSpatialIndex = QgsSpatialIndex();
114+
// FIND OUT IF UPDATE IS NEEDED
115+
if ( mTriangularMesh.vertices.size() >= nativeMesh->vertices.size() &&
116+
mTriangularMesh.faces.size() >= nativeMesh->faces.size() &&
117+
mCoordinateTransform.sourceCrs() == context->coordinateTransform().sourceCrs() &&
118+
mCoordinateTransform.destinationCrs() == context->coordinateTransform().destinationCrs() )
119+
return;
120+
121+
// CLEAN-UP
79122
mTriangularMesh.vertices.clear();
80123
mTriangularMesh.faces.clear();
81124
mTrianglesToNativeFaces.clear();
82125
mNativeMeshFaceCentroids.clear();
83126

84127
// TRANSFORM VERTICES
85-
QgsCoordinateTransform transform = context->coordinateTransform();
128+
mCoordinateTransform = context->coordinateTransform();
86129
mTriangularMesh.vertices.resize( nativeMesh->vertices.size() );
87130
for ( int i = 0; i < nativeMesh->vertices.size(); ++i )
88131
{
89132
const QgsMeshVertex &vertex = nativeMesh->vertices.at( i );
90-
if ( transform.isValid() )
133+
if ( mCoordinateTransform.isValid() )
91134
{
92-
QgsPointXY mapPoint = transform.transform( QgsPointXY( vertex.x(), vertex.y() ) );
135+
QgsPointXY mapPoint = mCoordinateTransform.transform( QgsPointXY( vertex.x(), vertex.y() ) );
93136
QgsMeshVertex mapVertex( mapPoint );
94137
mapVertex.setZ( vertex.z() );
95138
mapVertex.setM( vertex.m() );
@@ -152,12 +195,7 @@ void QgsTriangularMesh::update( QgsMesh *nativeMesh, QgsRenderContext *context )
152195
}
153196

154197
// CALCULATE SPATIAL INDEX
155-
for ( int i = 0; i < mTriangularMesh.faces.size(); ++i )
156-
{
157-
const QgsMeshFace &face = mTriangularMesh.faces.at( i ) ;
158-
QgsGeometry geom = QgsMeshUtils::toGeometry( face, mTriangularMesh.vertices );
159-
( void )mSpatialIndex.insertFeature( i, geom.boundingBox() );
160-
}
198+
mSpatialIndex = QgsSpatialIndex( new QgsMeshFeatureIterator( &mTriangularMesh ) );
161199
}
162200

163201
const QVector<QgsMeshVertex> &QgsTriangularMesh::vertices() const

‎src/core/mesh/qgstriangularmesh.h

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727
#include "qgsgeometry.h"
2828
#include "qgsfeatureid.h"
2929
#include "qgsspatialindex.h"
30+
#include "qgsfeatureiterator.h"
3031

3132
class QgsRenderContext;
33+
class QgsCoordinateTransform;
3234

3335
//! Mesh - vertices and faces
3436
struct CORE_EXPORT QgsMesh
@@ -39,6 +41,40 @@ struct CORE_EXPORT QgsMesh
3941
QVector<QgsMeshFace> faces;
4042
};
4143

44+
///@cond PRIVATE
45+
46+
/**
47+
* \ingroup core
48+
*
49+
* Delivers features from mesh
50+
*
51+
* \since QGIS 3.4
52+
*/
53+
class CORE_NO_EXPORT QgsMeshFeatureIterator : public QgsAbstractFeatureIterator
54+
{
55+
public:
56+
57+
/**
58+
* This constructor creates a feature iterator, that delivers all features
59+
*
60+
* \param mesh The mesh to use
61+
*/
62+
QgsMeshFeatureIterator( QgsMesh *mesh );
63+
~QgsMeshFeatureIterator();
64+
65+
bool rewind() override;
66+
bool close() override;
67+
68+
protected:
69+
bool fetchFeature( QgsFeature &f ) override;
70+
71+
private:
72+
QgsMesh *mMesh = nullptr;
73+
int it = 0;
74+
};
75+
76+
///@endcond
77+
4278
/**
4379
* \ingroup core
4480
*
@@ -102,6 +138,7 @@ class CORE_EXPORT QgsTriangularMesh
102138
QVector<QgsMeshVertex> mNativeMeshFaceCentroids;
103139

104140
QgsSpatialIndex mSpatialIndex;
141+
QgsCoordinateTransform mCoordinateTransform; //coordinate transform used to convert native mesh vertices to map vertices
105142
};
106143

107144
namespace QgsMeshUtils

0 commit comments

Comments
 (0)
Please sign in to comment.