17#include <geos/export.h>
18#include <geos/constants.h>
20#include <unordered_set>
29#pragma warning(disable: 4251)
36struct CoordinateLessThan;
41enum class CoordinateType : std::uint8_t {
48enum class Ordinate : std::uint8_t {
55GEOS_DLL std::ostream& operator<< (std::ostream&,
const CoordinateType);
57class GEOS_DLL CoordinateXY {
59 const static CoordinateXY _nullCoord;
62 constexpr const static double DEFAULT_X = 0.0;
63 constexpr const static double DEFAULT_Y = 0.0;
64 constexpr const static double DEFAULT_Z = DoubleNotANumber;
65 constexpr const static double DEFAULT_M = DoubleNotANumber;
73 CoordinateXY(
double xNew,
double yNew)
82 static constexpr bool has();
91 GEOS_DLL
friend bool operator==(
const CoordinateXY& a,
const CoordinateXY& b)
97 GEOS_DLL
friend bool operator!=(
const CoordinateXY& a,
const CoordinateXY& b)
99 return ! a.equals2D(b);
104 return std::isfinite(x) && std::isfinite(y);
107 bool equals2D(
const CoordinateXY& other)
const
118 bool equals2D(
const CoordinateXY& other,
double tolerance)
const
120 if (std::abs(x - other.x) > tolerance) {
123 if (std::abs(y - other.y) > tolerance) {
130 bool equals(
const CoordinateXY& other)
const
132 return equals2D(other);
136 inline int compareTo(
const CoordinateXY& other)
const
153 static const CoordinateXY& getNull();
155 double distance(
const CoordinateXY& p)
const
159 return std::sqrt(dx * dx + dy * dy);
162 double distanceSquared(
const CoordinateXY& p)
const
166 return dx * dx + dy * dy;
171 return (std::isnan(x) && std::isnan(y));
176 x = DoubleNotANumber;
177 y = DoubleNotANumber;
180 struct GEOS_DLL HashCode
182 inline std::size_t operator()(
const CoordinateXY& c)
const
184 size_t h = std::hash<double>{}(c.x);
185 h ^= std::hash<double>{}(c.y) << 1;
191 using UnorderedSet = std::unordered_set<Coordinate, HashCode>;
194 std::string toString()
const;
228 typedef std::set<const Coordinate*, CoordinateLessThan>
ConstSet;
229 typedef std::set<const CoordinateXY*, CoordinateLessThan> ConstXYSet;
238 typedef std::vector<Coordinate>
Vect;
241 typedef std::map<const CoordinateXY*, int, CoordinateLessThan>
ConstIntMap;
251 Coordinate(
double xNew,
double yNew,
double zNew = DEFAULT_Z)
252 : CoordinateXY(xNew, yNew)
256 explicit Coordinate(
const CoordinateXY& other)
257 : CoordinateXY(other)
262 static constexpr bool has();
269 CoordinateXY::setNull();
270 z = DoubleNotANumber;
273 static const Coordinate& getNull();
277 return CoordinateXY::isNull() && std::isnan(z);
283 return (x == other.x) && (y == other.y) &&
284 ((z == other.
z) || (std::isnan(z) && std::isnan(other.
z)));
290 Coordinate& operator=(
const CoordinateXY& other){
300class GEOS_DLL CoordinateXYM :
public CoordinateXY {
302 static const CoordinateXYM _nullCoord;
305 CoordinateXYM() : CoordinateXYM(DEFAULT_X, DEFAULT_Y, DEFAULT_M) {}
307 explicit CoordinateXYM(
const CoordinateXY& c)
311 CoordinateXYM(
double x_,
double y_,
double m_)
312 : CoordinateXY(x_, y_)
318 static constexpr bool has();
323 static const CoordinateXYM& getNull();
327 CoordinateXY::setNull();
328 m = DoubleNotANumber;
333 return CoordinateXY::isNull() && std::isnan(m);
335 bool equals3D(
const CoordinateXYM& other)
const {
336 return x == other.x && y == other.y && (m == other.m || (std::isnan(m) && std::isnan(other.m)));
339 CoordinateXYM& operator=(
const CoordinateXYZM& other);
341 CoordinateXYM& operator=(
const CoordinateXY& other) {
349 std::string toString()
const;
353class GEOS_DLL CoordinateXYZM :
public Coordinate {
355 static const CoordinateXYZM _nullCoord;
358 CoordinateXYZM() : CoordinateXYZM(DEFAULT_X, DEFAULT_Y, DEFAULT_Z, DEFAULT_M) {}
360 explicit CoordinateXYZM(
const CoordinateXY& c)
364 explicit CoordinateXYZM(
const CoordinateXYM& c)
368 explicit CoordinateXYZM(
const Coordinate& c)
372 CoordinateXYZM(
double x_,
double y_,
double z_,
double m_)
373 : Coordinate(x_, y_, z_)
379 static constexpr bool has();
384 static const CoordinateXYZM& getNull();
388 Coordinate::setNull();
389 m = DoubleNotANumber;
395 return Coordinate::isNull() && std::isnan(m);
398 bool equals4D(
const CoordinateXYZM& other)
const {
399 return x == other.x && y == other.y &&
400 (z == other.z || (std::isnan(z) && std::isnan(other.z))) &&
401 (m == other.m || (std::isnan(m) && std::isnan(other.m)));
404 CoordinateXYZM& operator=(
const CoordinateXY& other) {
413 CoordinateXYZM& operator=(
const Coordinate& other) {
422 CoordinateXYZM& operator=(
const CoordinateXYM& other) {
431 std::string toString()
const;
435CoordinateXYM::operator=(
const CoordinateXYZM& other) {
447 bool operator()(
const CoordinateXY* a,
const CoordinateXY* b)
const
449 if(a->compareTo(*b) < 0) {
457 bool operator()(
const CoordinateXY& a,
const CoordinateXY& b)
const
459 if(a.compareTo(b) < 0) {
470inline bool operator<(
const CoordinateXY& a,
const CoordinateXY& b)
479constexpr bool CoordinateXY::has<Ordinate::X>()
485constexpr bool CoordinateXY::has<Ordinate::Y>()
491constexpr bool CoordinateXY::has<Ordinate::Z>()
497constexpr bool CoordinateXY::has<Ordinate::M>()
503inline double CoordinateXY::get<Ordinate::X>()
const
509inline double CoordinateXY::get<Ordinate::Y>()
const
515inline double CoordinateXY::get<Ordinate::Z>()
const
521inline double CoordinateXY::get<Ordinate::M>()
const
529constexpr bool Coordinate::has<Ordinate::X>()
535constexpr bool Coordinate::has<Ordinate::Y>()
541constexpr bool Coordinate::has<Ordinate::Z>()
547constexpr bool Coordinate::has<Ordinate::M>()
553inline double Coordinate::get<Ordinate::X>()
const
559inline double Coordinate::get<Ordinate::Y>()
const
565inline double Coordinate::get<Ordinate::Z>()
const
571inline double Coordinate::get<Ordinate::M>()
const
579constexpr bool CoordinateXYM::has<Ordinate::X>()
585constexpr bool CoordinateXYM::has<Ordinate::Y>()
591constexpr bool CoordinateXYM::has<Ordinate::Z>()
597constexpr bool CoordinateXYM::has<Ordinate::M>()
603inline double CoordinateXYM::get<Ordinate::X>()
const
609inline double CoordinateXYM::get<Ordinate::Y>()
const
615inline double CoordinateXYM::get<Ordinate::Z>()
const
621inline double CoordinateXYM::get<Ordinate::M>()
const
629constexpr bool CoordinateXYZM::has<Ordinate::X>()
635constexpr bool CoordinateXYZM::has<Ordinate::Y>()
641constexpr bool CoordinateXYZM::has<Ordinate::Z>()
647constexpr bool CoordinateXYZM::has<Ordinate::M>()
653inline double CoordinateXYZM::get<Ordinate::X>()
const
659inline double CoordinateXYZM::get<Ordinate::Y>()
const
665inline double CoordinateXYZM::get<Ordinate::Z>()
const
671inline double CoordinateXYZM::get<Ordinate::M>()
const
676GEOS_DLL std::ostream& operator<< (std::ostream& os,
const CoordinateXY& c);
677GEOS_DLL std::ostream& operator<< (std::ostream& os,
const Coordinate& c);
678GEOS_DLL std::ostream& operator<< (std::ostream& os,
const CoordinateXYM& c);
679GEOS_DLL std::ostream& operator<< (std::ostream& os,
const CoordinateXYZM& c);
686 template<>
struct common_type<
geos::geom::CoordinateXY, geos::geom::CoordinateXY> {
using type = geos::geom::CoordinateXY; };
688 template<>
struct common_type<
geos::geom::CoordinateXY, geos::geom::CoordinateXYM> {
using type = geos::geom::CoordinateXYM; };
689 template<>
struct common_type<
geos::geom::CoordinateXY, geos::geom::CoordinateXYZM> {
using type = geos::geom::CoordinateXYZM; };
693 template<>
struct common_type<
geos::geom::Coordinate, geos::geom::CoordinateXYM> {
using type = geos::geom::CoordinateXYZM; };
694 template<>
struct common_type<
geos::geom::Coordinate, geos::geom::CoordinateXYZM> {
using type = geos::geom::CoordinateXYZM; };
696 template<>
struct common_type<
geos::geom::CoordinateXYM, geos::geom::CoordinateXY> {
using type = geos::geom::CoordinateXYM; };
697 template<>
struct common_type<
geos::geom::CoordinateXYM,
geos::geom::Coordinate> {
using type = geos::geom::CoordinateXYZM; };
698 template<>
struct common_type<
geos::geom::CoordinateXYM, geos::geom::CoordinateXYM> {
using type = geos::geom::CoordinateXYM; };
699 template<>
struct common_type<
geos::geom::CoordinateXYM, geos::geom::CoordinateXYZM> {
using type = geos::geom::CoordinateXYZM; };
701 template<>
struct common_type<
geos::geom::CoordinateXYZM, geos::geom::CoordinateXY> {
using type = geos::geom::CoordinateXYZM; };
702 template<>
struct common_type<
geos::geom::CoordinateXYZM,
geos::geom::Coordinate> {
using type = geos::geom::CoordinateXYZM; };
703 template<>
struct common_type<
geos::geom::CoordinateXYZM, geos::geom::CoordinateXYM> {
using type = geos::geom::CoordinateXYZM; };
704 template<>
struct common_type<
geos::geom::CoordinateXYZM, geos::geom::CoordinateXYZM> {
using type = geos::geom::CoordinateXYZM; };
Coordinate is the lightweight class used to store coordinates.
Definition Coordinate.h:220
std::string toString() const
Returns a string of the form (x,y,z) .
std::map< const CoordinateXY *, int, CoordinateLessThan > ConstIntMap
A map of const Coordinate pointers to integers.
Definition Coordinate.h:241
std::set< const Coordinate *, CoordinateLessThan > ConstSet
A set of const Coordinate pointers.
Definition Coordinate.h:228
std::vector< Coordinate > Vect
A vector of Coordinate objects (real object, not pointers)
Definition Coordinate.h:238
std::vector< const Coordinate * > ConstVect
A vector of const Coordinate pointers.
Definition Coordinate.h:232
std::stack< const Coordinate * > ConstStack
A stack of const Coordinate pointers.
Definition Coordinate.h:235
bool equals3D(const Coordinate &other) const
3D comparison
Definition Coordinate.h:281
double z
z-coordinate
Definition Coordinate.h:244
bool operator<(const CoordinateXY &a, const CoordinateXY &b)
Strict weak ordering operator for Coordinate.
Definition Coordinate.h:470
Basic namespace for all GEOS functionalities.
Definition geos.h:38
Strict weak ordering Functor for Coordinate.
Definition Coordinate.h:445