QGIS API Documentation
3.14.0-Pi (9f7028fd23)
|
Go to the documentation of this file.
28 #include <QRegularExpression>
29 #include <QJsonObject>
31 #include <nlohmann/json.hpp>
50 else if ( std::isnan(
z ) )
52 if ( std::isnan(
m ) )
57 else if ( std::isnan(
m ) )
66 , mZ( std::numeric_limits<double>::quiet_NaN() )
67 , mM( std::numeric_limits<double>::quiet_NaN() )
72 mX = std::numeric_limits<double>::quiet_NaN();
73 mY = std::numeric_limits<double>::quiet_NaN();
80 , mZ( std::numeric_limits<double>::quiet_NaN() )
81 , mM( std::numeric_limits<double>::quiet_NaN() )
89 , mZ(
QgsWkbTypes::hasZ( wkbType ) ? z : std::numeric_limits<double>::quiet_NaN() )
90 , mM(
QgsWkbTypes::hasM( wkbType ) ? m : std::numeric_limits<double>::quiet_NaN() )
110 auto gridifyValue = [](
double value,
double spacing,
bool extraCondition = true ) ->
double
112 if ( spacing > 0 && extraCondition )
113 return std::round( value / spacing ) * spacing;
119 auto x = gridifyValue( mX, hSpacing );
120 auto y = gridifyValue( mY, vSpacing );
171 if (
parts.second.compare( QLatin1String(
"EMPTY" ), Qt::CaseInsensitive ) == 0 )
174 QRegularExpression
rx( QStringLiteral(
"\\s" ) );
175 QStringList coordinates =
parts.second.split(
rx, QString::SkipEmptyParts );
176 if ( coordinates.size() < 2 )
181 else if ( coordinates.size() == 3 && !
is3D() && !
isMeasure() )
187 else if ( coordinates.size() >= 4 && ( !
is3D() || !
isMeasure() ) )
196 mX = coordinates[idx++].toDouble();
197 mY = coordinates[idx++].toDouble();
198 if (
is3D() && coordinates.length() > 2 )
199 mZ = coordinates[idx++].toDouble();
201 mM = coordinates[idx++].toDouble();
214 int binarySize =
sizeof( char ) +
sizeof( quint32 );
215 binarySize += ( 2 +
is3D() +
isMeasure() ) *
sizeof(
double );
218 wkbArray.resize( binarySize );
221 wkb << static_cast<quint32>(
wkbType() );
239 wkt += QStringLiteral(
" EMPTY" );
242 wkt += QLatin1String(
" (" );
255 QDomElement elemPoint = doc.createElementNS( ns, QStringLiteral(
"Point" ) );
256 QDomElement elemCoordinates = doc.createElementNS( ns, QStringLiteral(
"coordinates" ) );
259 QString cs = QStringLiteral(
"," );
261 QString ts = QStringLiteral(
" " );
263 elemCoordinates.setAttribute( QStringLiteral(
"cs" ), cs );
264 elemCoordinates.setAttribute( QStringLiteral(
"ts" ), ts );
266 QString strCoordinates;
267 if ( axisOrder == QgsAbstractGeometry::AxisOrder::XY )
271 elemCoordinates.appendChild( doc.createTextNode( strCoordinates ) );
272 elemPoint.appendChild( elemCoordinates );
278 QDomElement elemPoint = doc.createElementNS( ns, QStringLiteral(
"Point" ) );
279 QDomElement elemPosList = doc.createElementNS( ns, QStringLiteral(
"pos" ) );
280 elemPosList.setAttribute( QStringLiteral(
"srsDimension" ),
is3D() ? 3 : 2 );
281 QString strCoordinates;
282 if ( axisOrder == QgsAbstractGeometry::AxisOrder::XY )
289 elemPosList.appendChild( doc.createTextNode( strCoordinates ) );
290 elemPoint.appendChild( elemPosList );
300 {
"coordinates", json::array() },
321 p.drawRect( QRectF( mX - 2, mY - 2, 4, 4 ) );
326 mX = mY = std::numeric_limits<double>::quiet_NaN();
330 mZ = std::numeric_limits<double>::quiet_NaN();
335 mM = std::numeric_limits<double>::quiet_NaN();
378 if (
id.vertex != 0 )
433 Q_UNUSED( segmentPt )
434 Q_UNUSED( vertexAfter )
533 void QgsPoint::transform(
const QTransform &t,
double zTranslate,
double zScale,
double mTranslate,
double mScale )
537 t.map( mX, mY, &
x, &
y );
543 mZ = mZ * zScale + zTranslate;
547 mM = mM * mScale + mTranslate;
558 mZ = std::numeric_limits<double>::quiet_NaN();
569 mM = std::numeric_limits<double>::quiet_NaN();
590 mZ = std::numeric_limits<double>::quiet_NaN();
591 mM = std::numeric_limits<double>::quiet_NaN();
596 mM = std::numeric_limits<double>::quiet_NaN();
600 mZ = std::numeric_limits<double>::quiet_NaN();
632 double zDistSquared = 0.0;
633 if (
is3D() || !std::isnan(
z ) )
634 zDistSquared = ( mZ -
z ) * ( mZ -
z );
636 return std::sqrt( ( mX -
x ) * ( mX -
x ) + ( mY -
y ) * ( mY -
y ) + zDistSquared );
641 double zDistSquared = 0.0;
643 zDistSquared = ( mZ - other.
z() ) * ( mZ - other.
z() );
645 return std::sqrt( ( mX - other.
x() ) * ( mX - other.
x() ) + ( mY - other.
y() ) * ( mY - other.
y() ) + zDistSquared );
650 double zDistSquared = 0.0;
651 if (
is3D() || !std::isnan(
z ) )
652 zDistSquared = ( mZ -
z ) * ( mZ -
z );
654 return ( mX -
x ) * ( mX -
x ) + ( mY -
y ) * ( mY -
y ) + zDistSquared;
659 double zDistSquared = 0.0;
661 zDistSquared = ( mZ - other.
z() ) * ( mZ - other.
z() );
663 return ( mX - other.
x() ) * ( mX - other.
x() ) + ( mY - other.
y() ) * ( mY - other.
y() ) + zDistSquared;
668 double dx = other.
x() - mX;
669 double dy = other.
y() - mY;
670 return ( std::atan2( dx, dy ) * 180.0 / M_PI );
680 double dz = other.
z() - mZ;
682 return ( std::acos( dz /
distance ) * 180.0 / M_PI );
688 double radsXy =
azimuth * M_PI / 180.0;
689 double dx = 0.0, dy = 0.0, dz = 0.0;
704 dx =
distance * std::sin( radsZ ) * std::sin( radsXy );
705 dy =
distance * std::sin( radsZ ) * std::cos( radsXy );
709 return QgsPoint( mX + dx, mY + dy, mZ + dz, mM, pType );
714 return std::isnan( mX ) || std::isnan( mY );
724 return QStringLiteral(
"Point" );
739 Q_ASSERT( index == 0 );
745 double nan = std::numeric_limits<double>::quiet_NaN();
int partCount() const override
Returns count of parts contained in the geometry.
QgsPoint project(double distance, double azimuth, double inclination=90.0) const
Returns a new point which correspond to this point projected by a specified distance with specified a...
QVector< QgsRingSequence > QgsCoordinateSequence
QDomElement asGml3(QDomDocument &doc, int precision=17, const QString &ns="gml", QgsAbstractGeometry::AxisOrder axisOrder=QgsAbstractGeometry::AxisOrder::XY) const override
Returns a GML3 representation of the geometry.
double distance(double x, double y) const
Returns the Cartesian 2D distance between this point and a specified x, y coordinate.
QgsWkbTypes::Type wkbType() const
Returns the WKB type of the geometry.
int ringCount(int=0) const override
Returns the number of rings of which this geometry is built.
json asJsonObject(int precision=17) const override
Returns a json object representation of the geometry.
virtual void clearCache() const
Clears any cached parameters associated with the geometry, e.g., bounding boxes.
QgsPoint(double x=std::numeric_limits< double >::quiet_NaN(), double y=std::numeric_limits< double >::quiet_NaN(), double z=std::numeric_limits< double >::quiet_NaN(), double m=std::numeric_limits< double >::quiet_NaN(), QgsWkbTypes::Type wkbType=QgsWkbTypes::Unknown)
Construct a point with the provided initial coordinate values.
QgsPoint vertexAt(QgsVertexId) const override
Returns the point corresponding to a specified vertex id.
bool fromWkb(QgsConstWkbPtr &wkb) override
Sets the geometry from a WKB string.
Point geometry type, with support for z-dimension and m-values.
QgsRectangle boundingBox() const override
Returns the minimal bounding box for the geometry.
bool addZValue(double zValue=0) override
Adds a z-dimension to the geometry, initialized to a preset value.
QString asWkt(int precision=17) const override
Returns a WKT representation of the geometry.
void draw(QPainter &p) const override
Draws the geometry using the specified QPainter.
QgsGeometryConstPartIterator parts() const
Returns Java-style iterator for traversal of parts of the geometry.
double closestSegment(const QgsPoint &pt, QgsPoint &segmentPt, QgsVertexId &vertexAfter, int *leftOf=nullptr, double epsilon=4 *std::numeric_limits< double >::epsilon()) const override
Searches for the closest segment of the geometry to a given point.
void adjacentVertices(QgsVertexId vertex, QgsVertexId &previousVertex, QgsVertexId &nextVertex) const override
Returns the vertices adjacent to a specified vertex within a geometry.
void clear() override
Clears the geometry, ie reset it to a null geometry.
QString wktTypeStr() const
Returns the WKT type string of the geometry.
double inclination(const QgsPoint &other) const
Calculates Cartesian inclination between this point and other one (starting from zenith = 0 to nadir ...
QgsCoordinateSequence coordinateSequence() const override
Retrieves the sequence of geometries, rings and nodes.
Type
The WKB type describes the number of dimensions a geometry has.
static bool hasZ(Type type)
Tests whether a WKB type contains the z-dimension.
QgsWkbTypes::Type mWkbType
static Type dropM(Type type)
Drops the m dimension (if present) for a WKB type and returns the new type.
static Type addM(Type type)
Adds the m dimension to a WKB type and returns the new type.
QgsPoint * toCurveType() const override
Returns the geometry converted to the more generic curve type.
int vertexCount(int=0, int=0) const override
Returns the number of vertices of which this geometry is built.
int vertexNumberFromVertexId(QgsVertexId id) const override
Returns the vertex number corresponding to a vertex id.
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
void transformVertices(const std::function< QgsPoint(const QgsPoint &) > &transform) override
Transforms the vertices from the geometry in place, applying the transform function to every vertex.
bool dropMValue() override
Drops any measure values which exist in the geometry.
QgsPoint * clone() const override
Clones the geometry by performing a deep copy.
QgsPoint * snappedToGrid(double hSpacing, double vSpacing, double dSpacing=0, double mSpacing=0) const override
Makes a new geometry with all the points or vertices snapped to the closest point of the grid.
double ANALYSIS_EXPORT leftOf(const QgsPoint &thepoint, const QgsPoint *p1, const QgsPoint *p2)
Returns whether 'thepoint' is left or right of the line from 'p1' to 'p2'. Negative values mean left ...
double azimuth(const QgsPoint &other) const
Calculates Cartesian azimuth between this point and other one (clockwise in degree,...
bool isValid(QString &error, int flags=0) const override
Checks validity of the geometry, and returns true if the geometry is valid.
double & rx()
Returns a reference to the x-coordinate of this point.
double segmentLength(QgsVertexId startVertex) const override
Returns the length of the segment of the geometry which begins at startVertex.
bool addMValue(double mValue=0) override
Adds a measure to the geometry, initialized to a preset value.
AxisOrder
Axis order for GML generation.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
double qgsRound(double number, int places)
Returns a double number, rounded (as close as possible) to the specified number of places.
bool dropZValue() override
Drops any z-dimensions which exist in the geometry.
double distanceSquared3D(double x, double y, double z) const
Returns the Cartesian 3D squared distance between this point and a specified x, y,...
double vertexAngle(QgsVertexId vertex) const override
Angle undefined.
static endian_t endian()
Returns whether this machine uses big or little endian.
double distance3D(double x, double y, double z) const
Returns the Cartesian 3D distance between this point and a specified x, y, z coordinate.
bool is3D() const
Returns true if the geometry is 3D and contains a z-value.
QgsAbstractGeometry * boundary() const override
Returns the closure of the combinatorial boundary of the geometry (ie the topological boundary of the...
QVector< QgsPointSequence > QgsRingSequence
int childCount() const override
Returns number of child geometries (for geometries with child geometries) or child points (for geomet...
Abstract base class for all geometries.
QString geometryType() const override
Returns a unique string representing the geometry type.
QDomElement asGml2(QDomDocument &doc, int precision=17, const QString &ns="gml", QgsAbstractGeometry::AxisOrder axisOrder=QgsAbstractGeometry::AxisOrder::XY) const override
Returns a GML2 representation of the geometry.
bool removeDuplicateNodes(double epsilon=4 *std::numeric_limits< double >::epsilon(), bool useZValues=false) override
Removes duplicate nodes from the geometry, wherever removing the nodes does not result in a degenerat...
static Type addZ(Type type)
Adds the z dimension to a WKB type and returns the new type.
void swapXy() override
Swaps the x and y coordinates from the geometry.
static bool hasM(Type type)
Tests whether a WKB type contains m values.
bool moveVertex(QgsVertexId position, const QgsPoint &newPos) override
Moves a vertex within the geometry.
bool fromWkt(const QString &wkt) override
Sets the geometry from a WKT string.
bool isEmpty() const override
Returns true if the geometry is empty.
QVector< QgsPoint > QgsPointSequence
QgsPoint childPoint(int index) const override
Returns point at index (for geometries without child geometries - i.e.
void transform(const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d=QgsCoordinateTransform::ForwardTransform, bool transformZ=false) override SIP_THROW(QgsCsException)
Transforms the geometry using a coordinate transform.
int nCoordinates() const override
Returns the number of nodes contained in the geometry.
bool nextVertex(QgsVertexId &id, QgsPoint &vertex) const override
Returns next vertex id and coordinates.
bool isEmpty() const
Returns true if the geometry is empty.
Utility class for identifying a unique vertex within a geometry.
int dimension() const override
Returns the inherent dimension of the geometry.
bool isMeasure() const
Returns true if the geometry contains m values.
bool convertTo(QgsWkbTypes::Type type) override
Converts the geometry to a specified type.
QgsPoint * createEmptyWithSameType() const override
Creates a new geometry with the same class and same WKB type as the original and transfers ownership.
Handles storage of information regarding WKB types and their properties.
static Type dropZ(Type type)
Drops the z dimension (if present) for a WKB type and returns the new type.
QgsWkbTypes::Type readHeader() const
readHeader
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 (...
QString asKml(int precision=17) const override
Returns a KML representation of the geometry.
void filterVertices(const std::function< bool(const QgsPoint &) > &filter) override
Filters the vertices from the geometry in place, removing any which do not return true for the filter...
QByteArray asWkb(QgsAbstractGeometry::WkbFlags=nullptr) const override
bool deleteVertex(QgsVertexId position) override
Deletes a vertex within the geometry.
static Type flatType(Type type)
Returns the flat type for a WKB type.
bool insertVertex(QgsVertexId position, const QgsPoint &vertex) override
Inserts a vertex into the geometry.