Skip to content

Commit

Permalink
QgsGeometryValidator init curve support
Browse files Browse the repository at this point in the history
  • Loading branch information
lbartoletti committed Sep 27, 2021
1 parent 1b5b7d9 commit 36f1bec
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 15 deletions.
28 changes: 16 additions & 12 deletions src/core/qgsgeometryvalidator.cpp
Expand Up @@ -20,6 +20,8 @@ email : jef at norbit dot de
#include "qgsgeos.h"
#include "qgsgeometrycollection.h"
#include "qgspolygon.h"
#include "qgscurvepolygon.h"
#include "qgscurve.h"

QgsGeometryValidator::QgsGeometryValidator( const QgsGeometry &geometry, QVector<QgsGeometry::Error> *errors, Qgis::GeometryValidationEngine method )
: mGeometry( geometry )
Expand Down Expand Up @@ -223,12 +225,12 @@ void QgsGeometryValidator::validatePolyline( int i, const QgsLineString *line, b
}
}

void QgsGeometryValidator::validatePolygon( int partIndex, const QgsPolygon *polygon )
void QgsGeometryValidator::validatePolygon( int partIndex, const QgsCurvePolygon *polygon )
{
// check if holes are inside polygon
for ( int i = 0; !mStop && i < polygon->numInteriorRings(); ++i )
{
if ( !ringInRing( static_cast< const QgsLineString * >( polygon->interiorRing( i ) ), static_cast< const QgsLineString * >( polygon->exteriorRing() ) ) )
if ( !ringInRing( static_cast< const QgsCurve * >( polygon->interiorRing( i ) ), static_cast< const QgsCurve * >( polygon->exteriorRing() ) ) )
{
const QString msg = QObject::tr( "ring %1 of polygon %2 not in exterior ring" ).arg( i + 1 ).arg( partIndex );
QgsDebugMsg( msg );
Expand Down Expand Up @@ -315,18 +317,20 @@ void QgsGeometryValidator::run()
}

case QgsWkbTypes::Polygon:
validatePolygon( 0, qgsgeometry_cast< const QgsPolygon * >( mGeometry.constGet() ) );
case QgsWkbTypes::CurvePolygon:
validatePolygon( 0, qgsgeometry_cast< const QgsCurvePolygon * >( mGeometry.constGet() ) );
break;

case QgsWkbTypes::MultiPolygon:
case QgsWkbTypes::MultiSurface:
{
const QgsGeometryCollection *collection = qgsgeometry_cast< const QgsGeometryCollection * >( mGeometry.constGet() );
for ( int i = 0; !mStop && i < collection->numGeometries(); i++ )
validatePolygon( i, qgsgeometry_cast< const QgsPolygon * >( collection->geometryN( i ) ) );
validatePolygon( i, qgsgeometry_cast< const QgsCurvePolygon * >( collection->geometryN( i ) ) );

for ( int i = 0; !mStop && i < collection->numGeometries(); i++ )
{
const QgsPolygon *poly = qgsgeometry_cast< const QgsPolygon * >( collection->geometryN( i ) );
const QgsCurvePolygon *poly = qgsgeometry_cast< const QgsCurvePolygon * >( collection->geometryN( i ) );
if ( !poly->exteriorRing() || poly->exteriorRing()->isEmpty() )
{
emit errorFound( QgsGeometry::Error( QObject::tr( "Polygon %1 has no rings" ).arg( i ) ) );
Expand All @@ -336,18 +340,18 @@ void QgsGeometryValidator::run()

for ( int j = i + 1; !mStop && j < collection->numGeometries(); j++ )
{
const QgsPolygon *poly2 = qgsgeometry_cast< const QgsPolygon * >( collection->geometryN( j ) );
const QgsCurvePolygon *poly2 = qgsgeometry_cast< const QgsCurvePolygon * >( collection->geometryN( j ) );
if ( !poly2->exteriorRing() || poly2->exteriorRing()->isEmpty() )
continue;

if ( ringInRing( qgsgeometry_cast< const QgsLineString * >( poly->exteriorRing() ),
qgsgeometry_cast< const QgsLineString * >( poly2->exteriorRing() ) ) )
if ( ringInRing( qgsgeometry_cast< const QgsCurve * >( poly->exteriorRing() ),
qgsgeometry_cast< const QgsCurve * >( poly2->exteriorRing() ) ) )
{
emit errorFound( QgsGeometry::Error( QObject::tr( "Polygon %1 lies inside polygon %2" ).arg( i ).arg( j ) ) );
mErrorCount++;
}
else if ( ringInRing( static_cast< const QgsLineString * >( poly2->exteriorRing() ),
static_cast< const QgsLineString * >( poly->exteriorRing() ) ) )
else if ( ringInRing( static_cast< const QgsCurve * >( poly2->exteriorRing() ),
static_cast< const QgsCurve * >( poly->exteriorRing() ) ) )
{
emit errorFound( QgsGeometry::Error( QObject::tr( "Polygon %1 lies inside polygon %2" ).arg( j ).arg( i ) ) );
mErrorCount++;
Expand Down Expand Up @@ -437,7 +441,7 @@ bool QgsGeometryValidator::intersectLines( double px, double py, QgsVector v, do
return true;
}

bool QgsGeometryValidator::pointInRing( const QgsLineString *ring, double pX, double pY )
bool QgsGeometryValidator::pointInRing( const QgsCurve *ring, double pX, double pY )
{
if ( !ring->boundingBox().contains( pX, pY ) )
return false;
Expand Down Expand Up @@ -468,7 +472,7 @@ bool QgsGeometryValidator::pointInRing( const QgsLineString *ring, double pX, do
return inside;
}

bool QgsGeometryValidator::ringInRing( const QgsLineString *inside, const QgsLineString *outside )
bool QgsGeometryValidator::ringInRing( const QgsCurve *inside, const QgsCurve *outside )
{
if ( !outside->boundingBox().contains( inside->boundingBox() ) )
return false;
Expand Down
8 changes: 5 additions & 3 deletions src/core/qgsgeometryvalidator.h
Expand Up @@ -22,6 +22,8 @@ email : jef at norbit dot de

#include "qgsgeometry.h"

class QgsCurvePolygon;

/**
* \ingroup core
* \class QgsGeometryValidator
Expand Down Expand Up @@ -72,12 +74,12 @@ class CORE_EXPORT QgsGeometryValidator : public QThread

private:
void validatePolyline( int i, const QgsLineString *line, bool ring = false );
void validatePolygon( int partIndex, const QgsPolygon *polygon );
void validatePolygon( int partIndex, const QgsCurvePolygon *polygon );
void checkRingIntersections( int partIndex0, int ringIndex0, const QgsLineString *ring0, int partIndex1, int ringIndex1, const QgsLineString *ring1 );
double distLine2Point( double px, double py, QgsVector v, double qX, double qY );
bool intersectLines( double px, double py, QgsVector v, double qx, double qy, QgsVector w, double &sX, double &sY );
bool ringInRing( const QgsLineString *inside, const QgsLineString *outside );
bool pointInRing( const QgsLineString *ring, double pX, double pY );
bool ringInRing( const QgsCurve *inside, const QgsCurve *outside );
bool pointInRing( const QgsCurve *ring, double pX, double pY );

QgsGeometry mGeometry;
QVector<QgsGeometry::Error> *mErrors;
Expand Down

0 comments on commit 36f1bec

Please sign in to comment.