25 #include <QPainterPath>
40 Q_FOREACH (
const QgsCurveV2* c, curve.mCurves )
42 mCurves.
append( static_cast<QgsCurveV2*>( c->
clone() ) );
51 Q_FOREACH (
const QgsCurveV2* c, curve.mCurves )
53 mCurves.
append( static_cast<QgsCurveV2*>( c->
clone() ) );
66 qDeleteAll( mCurves );
73 if ( mCurves.
size() < 1 )
79 for (
int i = 1; i < mCurves.
size(); ++i )
106 int currentCurveSize = 0;
107 for (
int i = 0; i <
nCurves; ++i )
112 wkbPtr -= ( 1 +
sizeof( int ) );
125 currentCurve->
fromWkb( wkbPtr );
126 currentCurveSize = currentCurve->
wkbSize();
127 mCurves.
append( currentCurve );
128 wkbPtr += currentCurveSize;
158 if ( !mCurves.
back()->fromWkt( childWkt ) )
169 Q_FOREACH (
const QgsCurveV2* curve, mCurves )
171 hasZ = hasZ || curve->
is3D();
186 int size =
sizeof( char ) +
sizeof( quint32 ) +
sizeof( quint32 );
187 Q_FOREACH (
const QgsCurveV2 *curve, mCurves )
197 unsigned char* geomPtr =
new unsigned char[binarySize];
200 wkb << static_cast<quint32>(
wkbType() );
201 wkb << static_cast<quint32>( mCurves.
size() );
202 Q_FOREACH (
const QgsCurveV2* curve, mCurves )
205 unsigned char* curveWkb = curve->
asWkb( curveWkbLen );
206 memcpy( wkb, curveWkb, curveWkbLen );
216 Q_FOREACH (
const QgsCurveV2* curve, mCurves )
219 if ( dynamic_cast<const QgsLineStringV2*>( curve ) )
222 childWkt = childWkt.
mid( childWkt.
indexOf(
"(" ) );
224 wkt += childWkt +
",";
249 Q_FOREACH (
const QgsCurveV2* curve, mCurves )
251 if ( dynamic_cast<const QgsLineStringV2*>( curve ) )
260 else if ( dynamic_cast<const QgsCircularStringV2*>( curve ) )
287 for ( ; curveIt != mCurves.
constEnd(); ++curveIt )
289 length += ( *curveIt )->length();
296 if ( mCurves.
size() < 1 )
300 return mCurves.
at( 0 )->startPoint();
305 if ( mCurves.
size() < 1 )
315 if ( mCurves.
size() < 1 )
320 mCurves[0]->points( pts );
321 for (
int i = 1; i < mCurves.
size(); ++i )
324 mCurves[i]->points( pList );
339 for (
int i = 0; i <
nCurves; ++i )
341 nPoints += mCurves.
at( i )->numPoints() - 1;
352 for ( ; curveIt != mCurves.
constEnd(); ++curveIt )
355 line->
append( currentLine );
363 if ( i >= mCurves.
size() )
367 return mCurves.
at( i );
385 if ( mCurves.
size() - 1 < i )
390 delete( mCurves[i] );
403 if ( mCurves.
size() > 0 )
405 lastCurve = mCurves.
at( mCurves.
size() - 1 );
409 if ( !lastCurve || lastCurve->
geometryType() !=
"LineString" )
429 for ( ; it != mCurves.
constEnd(); ++it )
438 for ( ; it != mCurves.
end(); ++it )
440 ( *it )->transform( ct, d );
447 for ( ; it != mCurves.
end(); ++it )
449 ( *it )->transform( t );
457 for ( ; it != mCurves.
constEnd(); ++it )
459 ( *it )->addToPainterPath( pp );
468 for ( ; it != mCurves.
constEnd(); ++it )
470 ( *it )->addToPainterPath( pp );
478 if ( curveIds.
size() < 1 )
482 int curveId = curveIds.
at( 0 ).first;
483 if ( curveId >= mCurves.
size() )
488 bool success = mCurves[curveId]->insertVertex( curveIds.
at( 0 ).second, vertex );
500 for ( ; idIt != curveIds.
constEnd(); ++idIt )
502 mCurves[idIt->
first]->moveVertex( idIt->second, newPos );
505 bool success = curveIds.
size() > 0;
517 for ( ; idIt != curveIds.
constEnd(); ++idIt )
519 mCurves[idIt->
first]->deleteVertex( idIt->second );
522 bool success = curveIds.
size() > 0;
534 int currentVertexIndex = 0;
535 for (
int i = 0; i < mCurves.
size(); ++i )
537 int increment = mCurves.
at( i )->numPoints() - 1;
538 if (
id.vertex >= currentVertexIndex &&
id.vertex <= currentVertexIndex + increment )
540 int curveVertexId =
id.vertex - currentVertexIndex;
542 curveIds.
append( qMakePair( i, vid ) );
543 if ( curveVertexId == increment && i < ( mCurves.
size() - 1 ) )
546 curveIds.
append( qMakePair( i + 1, vid ) );
549 currentVertexIndex += increment;
562 int currentVertexId = 0;
563 for (
int j = 0; j < mCurves.
size(); ++j )
565 int nCurvePoints = mCurves.
at( j )->numPoints();
566 if (( i - currentVertexId ) < nCurvePoints )
568 return ( mCurves.
at( j )->pointAt( i - currentVertexId, vertex, type ) );
570 currentVertexId += ( nCurvePoints - 1 );
578 for ( ; curveIt != mCurves.
constEnd(); ++curveIt )
580 ( *curveIt )->sumUpArea( sum );
596 for ( ; curveIt != mCurves.
constEnd(); ++curveIt )
598 if (( *curveIt )->hasCurvedSegments() )
609 if ( curveIds.
size() == 1 )
614 else if ( curveIds.
size() > 1 )
618 double angle1 = curve1->
vertexAngle( curveIds.
at( 0 ).second );
619 double angle2 = curve2->
vertexAngle( curveIds.
at( 1 ).second );
void addPath(const QPainterPath &path)
int indexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
QgsWKBTypes::Type wkbType() const
Returns the WKB type of the geometry.
A rectangle specified with double values.
QDomElement asGML2(QDomDocument &doc, int precision=17, const QString &ns="gml") const override
Returns a GML2 representation of the geometry.
virtual QgsLineStringV2 * curveToLine() const override
Returns a new line string geometry corresponding to a segmentized approximation of the curve...
virtual double vertexAngle(const QgsVertexId &vertex) const =0
Returns approximate rotation angle for a vertex.
static QPair< QgsWKBTypes::Type, QString > wktReadBlock(const QString &wkt)
Parses a WKT block of the format "TYPE( contents )" and returns a pair of geometry type to contents (...
void close()
Appends first point if not already closed.
virtual QgsAbstractGeometryV2 & operator=(const QgsAbstractGeometryV2 &geom)
QDomNode appendChild(const QDomNode &newChild)
bool pointAt(int i, QgsPointV2 &vertex, QgsVertexId::VertexType &type) const override
Returns the point and vertex id of a point within the curve.
bool hasCurvedSegments() const override
Returns true if the geometry contains curved segments.
static double averageAngle(double x1, double y1, double x2, double y2, double x3, double y3)
Angle between two linear segments.
Circular string geometry type.
virtual void points(QList< QgsPointV2 > &pt) const =0
Returns a list of points within the curve.
virtual QgsPointV2 endPoint() const override
Returns the end point of the curve.
virtual bool deleteVertex(const QgsVertexId &position) override
Deletes a vertex within the geometry.
virtual QgsPointV2 startPoint() const override
Returns the starting point of the curve.
void transform(const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d=QgsCoordinateTransform::ForwardTransform) override
Transforms the geometry using a coordinate transform.
const T & at(int i) const
QDomElement asGML2(QDomDocument &doc, int precision=17, const QString &ns="gml") const override
Returns a GML2 representation of the geometry.
virtual bool insertVertex(const QgsVertexId &position, const QgsPointV2 &vertex) override
Inserts a vertex into the geometry.
static QStringList wktGetChildBlocks(const QString &wkt, const QString &defaultType="")
Parses a WKT string and returns of list of blocks contained in the WKT.
TransformDirection
Enum used to indicate the direction (forward or inverse) of the transform.
unsigned char * asWkb(int &binarySize) const override
Returns a WKB representation of the geometry.
static double closestSegmentFromComponents(T &container, componentType ctype, const QgsPointV2 &pt, QgsPointV2 &segmentPt, QgsVertexId &vertexAfter, bool *leftOf, double epsilon)
virtual QgsRectangle calculateBoundingBox() const override
Calculates the minimal bounding box for the geometry.
void append(const QgsLineStringV2 *line)
void sumUpArea(double &sum) const override
Calculates the area of the curve.
double vertexAngle(const QgsVertexId &vertex) const override
Returns approximate rotation angle for a vertex.
QDomElement createElementNS(const QString &nsURI, const QString &qName)
void addToPainterPath(QPainterPath &path) const override
Adds a curve to a painter path.
static endian_t endian()
Returns whether this machine uses big or little endian.
QString wktTypeStr() const
Returns the WKT type string of the geometry.
virtual int wkbSize() const =0
Returns the size of the WKB representation of the geometry.
QgsCompoundCurveV2 & operator=(const QgsCompoundCurveV2 &curve)
void removeCurve(int i)
Removes a curve from the geometry.
virtual bool addMValue(double mValue=0)=0
Adds a measure to the geometry, initialized to a preset value.
virtual QgsLineStringV2 * curveToLine() const override
Returns a new line string geometry corresponding to a segmentized approximation of the curve...
QgsWKBTypes::Type readHeader() const
static Type flatType(Type type)
bool is3D() const
Returns true if the geometry is 3D and contains a z-value.
void combineExtentWith(QgsRectangle *rect)
expand the rectangle so that covers both the original rectangle and the given rectangle ...
void append(const T &value)
static bool hasM(Type type)
Tests whether a WKB type contains m values.
Utility class for identifying a unique vertex within a geometry.
bool isMeasure() const
Returns true if the geometry contains m values.
void drawAsPolygon(QPainter &p) const override
Draws the curve as a polygon on the specified QPainter.
Line string geometry type.
void draw(QPainter &p) const override
Draws the geometry using the specified QPainter.
virtual QString geometryType() const override
Returns a unique string representing the geometry type.
void addVertex(const QgsPointV2 &pt)
Adds a vertex to the end of the geometry.
static Type addZ(Type type)
Adds the z dimension to a WKB type and returns the new type.
virtual bool fromWkb(const unsigned char *wkb)=0
Sets the geometry from a WKB string.
QString asJSON(int precision=17) const override
Returns a GeoJSON representation of the geometry.
QgsWKBTypes::Type mWkbType
QString asWkt(int precision=17) const override
Returns a WKT representation of the geometry.
static bool hasZ(Type type)
Tests whether a WKB type contains the z-dimension.
virtual unsigned char * asWkb(int &binarySize) const =0
Returns a WKB representation of the geometry.
bool endsWith(const QString &s, Qt::CaseSensitivity cs) const
const QgsCurveV2 * curveAt(int i) const
Returns the curve at the specified index.
void setZMTypeFromSubGeometry(const QgsAbstractGeometryV2 *subggeom, QgsWKBTypes::Type baseGeomType)
Updates the geometry type based on whether sub geometries contain z or m values.
virtual bool addZValue(double zValue=0)=0
Adds a z-dimension to the geometry, initialized to a preset value.
virtual bool addMValue(double mValue=0) override
Adds a measure to the geometry, initialized to a preset value.
QString asJSON(int precision=17) const override
Returns a GeoJSON representation of the geometry.
Compound curve geometry type.
static QDomElement pointsToGML3(const QList< QgsPointV2 > &points, QDomDocument &doc, int precision, const QString &ns, bool is3D)
Returns a gml::posList DOM element.
virtual QString geometryType() const =0
Returns a unique string representing the geometry type.
void addCurve(QgsCurveV2 *c)
Adds a curve to the geometr (takes ownership)
void addVertex(const QgsPointV2 &pt)
virtual QgsPointV2 endPoint() const =0
Returns the end point of the curve.
QString mid(int position, int n) const
void drawPath(const QPainterPath &path)
virtual bool fromWkt(const QString &wkt) override
Sets the geometry from a WKT string.
virtual QgsCompoundCurveV2 * clone() const override
Clones the geometry by performing a deep copy.
virtual bool moveVertex(const QgsVertexId &position, const QgsPointV2 &newPos) override
Moves a vertex within the geometry.
virtual bool isClosed() const
Returns true if the curve is closed.
int wkbSize() const override
Returns the size of the WKB representation of the geometry.
virtual void points(QList< QgsPointV2 > &pts) const override
Returns a list of points within the curve.
virtual QString asWkt(int precision=17) const =0
Returns a WKT representation of the geometry.
QgsRectangle mBoundingBox
virtual double closestSegment(const QgsPointV2 &pt, QgsPointV2 &segmentPt, QgsVertexId &vertexAfter, bool *leftOf, double epsilon) const override
Searches for the closest segment of the geometry to a given point.
static Type parseType(const QString &wktStr)
double ANALYSIS_EXPORT leftOf(Point3D *thepoint, Point3D *p1, Point3D *p2)
Returns whether 'thepoint' is left or right of the line from 'p1' to 'p2'.
const_iterator constEnd() const
const_iterator constBegin() const
virtual QgsAbstractGeometryV2 * clone() const =0
Clones the geometry by performing a deep copy.
Abstract base class for curved geometry type.
virtual bool fromWkb(const unsigned char *wkb) override
Sets the geometry from a WKB string.
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
virtual int numPoints() const override
Returns the number of points in the curve.
QDomElement asGML3(QDomDocument &doc, int precision=17, const QString &ns="gml") const override
Returns a GML3 representation of the geometry.
virtual double length() const override
Returns the length of the geometry.
int nCurves() const
Returns the number of curves in the geometry.
static Type addM(Type type)
Adds the m dimension to a WKB type and returns the new type.
virtual void clear() override
Clears the geometry, ie reset it to a null geometry.
virtual bool addZValue(double zValue=0) override
Adds a z-dimension to the geometry, initialized to a preset value.