17 #include <geos/export.h>
18 #include <geos/constants.h>
20 #include <unordered_set>
28 #pragma warning(disable: 4251)
35 struct CoordinateLessThan;
40 enum class CoordinateType : std::uint8_t {
47 enum class Ordinate : std::uint8_t {
54 GEOS_DLL std::ostream& operator<< (std::ostream&,
const CoordinateType);
56 class GEOS_DLL CoordinateXY {
58 const static CoordinateXY _nullCoord;
61 constexpr
const static double DEFAULT_X = 0.0;
62 constexpr
const static double DEFAULT_Y = 0.0;
63 constexpr
const static double DEFAULT_Z = DoubleNotANumber;
64 constexpr
const static double DEFAULT_M = DoubleNotANumber;
72 CoordinateXY(
double xNew,
double yNew)
87 GEOS_DLL
friend bool operator==(
const CoordinateXY& a,
const CoordinateXY& b)
93 GEOS_DLL
friend bool operator!=(
const CoordinateXY& a,
const CoordinateXY& b)
95 return ! a.equals2D(b);
100 return std::isfinite(x) && std::isfinite(y);
103 bool equals2D(
const CoordinateXY& other)
const
114 bool equals2D(
const CoordinateXY& other,
double tolerance)
const
116 if (std::abs(x - other.x) > tolerance) {
119 if (std::abs(y - other.y) > tolerance) {
126 bool equals(
const CoordinateXY& other)
const
128 return equals2D(other);
132 inline int compareTo(
const CoordinateXY& other)
const
149 static const CoordinateXY& getNull();
151 double distance(
const CoordinateXY& p)
const
155 return std::sqrt(dx * dx + dy * dy);
158 double distanceSquared(
const CoordinateXY& p)
const
162 return dx * dx + dy * dy;
167 return (std::isnan(x) && std::isnan(y));
172 x = DoubleNotANumber;
173 y = DoubleNotANumber;
176 struct GEOS_DLL HashCode
178 inline std::size_t operator()(
const CoordinateXY& c)
const
180 size_t h = std::hash<double>{}(c.x);
181 h ^= std::hash<double>{}(c.y) << 1;
187 using UnorderedSet = std::unordered_set<Coordinate, HashCode>;
190 std::string toString()
const;
224 typedef std::set<const Coordinate*, CoordinateLessThan>
ConstSet;
233 typedef std::vector<Coordinate>
Vect;
243 Coordinate(
double xNew,
double yNew,
double zNew = DEFAULT_Z)
244 : CoordinateXY(xNew, yNew)
248 explicit Coordinate(
const CoordinateXY& other)
249 : CoordinateXY(other)
258 CoordinateXY::setNull();
259 z = DoubleNotANumber;
262 static const Coordinate& getNull();
266 return CoordinateXY::isNull() && std::isnan(z);
272 return (x == other.x) && (y == other.y) &&
273 ((z == other.
z) || (std::isnan(z) && std::isnan(other.
z)));
279 Coordinate& operator=(
const CoordinateXY& other){
289 class GEOS_DLL CoordinateXYM :
public CoordinateXY {
291 static const CoordinateXYM _nullCoord;
294 CoordinateXYM() : CoordinateXYM(DEFAULT_X, DEFAULT_Y, DEFAULT_M) {}
296 explicit CoordinateXYM(
const CoordinateXY& c)
300 CoordinateXYM(
double x_,
double y_,
double m_)
301 : CoordinateXY(x_, y_)
309 static const CoordinateXYM& getNull();
313 CoordinateXY::setNull();
314 m = DoubleNotANumber;
319 return CoordinateXY::isNull() && std::isnan(m);
321 bool equals3D(
const CoordinateXYM& other)
const {
322 return x == other.x && y == other.y && (m == other.m || (std::isnan(m) && std::isnan(other.m)));
325 CoordinateXYM& operator=(
const CoordinateXYZM& other);
327 CoordinateXYM& operator=(
const CoordinateXY& other) {
335 std::string toString()
const;
339 class GEOS_DLL CoordinateXYZM :
public Coordinate {
341 static const CoordinateXYZM _nullCoord;
344 CoordinateXYZM() : CoordinateXYZM(DEFAULT_X, DEFAULT_Y, DEFAULT_Z, DEFAULT_M) {}
346 explicit CoordinateXYZM(
const CoordinateXY& c)
350 explicit CoordinateXYZM(
const CoordinateXYM& c)
354 explicit CoordinateXYZM(
const Coordinate& c)
358 CoordinateXYZM(
double x_,
double y_,
double z_,
double m_)
359 : Coordinate(x_, y_, z_)
367 static const CoordinateXYZM& getNull();
371 Coordinate::setNull();
372 m = DoubleNotANumber;
378 return Coordinate::isNull() && std::isnan(m);
381 bool equals4D(
const CoordinateXYZM& other)
const {
382 return x == other.x && y == other.y &&
383 (z == other.z || (std::isnan(z) && std::isnan(other.z))) &&
384 (m == other.m || (std::isnan(m) && std::isnan(other.m)));
387 CoordinateXYZM& operator=(
const CoordinateXY& other) {
396 CoordinateXYZM& operator=(
const Coordinate& other) {
405 CoordinateXYZM& operator=(
const CoordinateXYM& other) {
414 std::string toString()
const;
417 inline CoordinateXYM&
418 CoordinateXYM::operator=(
const CoordinateXYZM& other) {
430 bool operator()(
const CoordinateXY* a,
const CoordinateXY* b)
const
432 if(a->compareTo(*b) < 0) {
440 bool operator()(
const CoordinateXY& a,
const CoordinateXY& b)
const
442 if(a.compareTo(b) < 0) {
453 inline bool operator<(
const CoordinateXY& a,
const CoordinateXY& b)
462 inline double CoordinateXY::get<Ordinate::X>()
const
468 inline double CoordinateXY::get<Ordinate::Y>()
const
474 inline double CoordinateXY::get<Ordinate::Z>()
const
480 inline double CoordinateXY::get<Ordinate::M>()
const
488 inline double Coordinate::get<Ordinate::X>()
const
494 inline double Coordinate::get<Ordinate::Y>()
const
500 inline double Coordinate::get<Ordinate::Z>()
const
506 inline double Coordinate::get<Ordinate::M>()
const
514 inline double CoordinateXYM::get<Ordinate::X>()
const
520 inline double CoordinateXYM::get<Ordinate::Y>()
const
526 inline double CoordinateXYM::get<Ordinate::Z>()
const
532 inline double CoordinateXYM::get<Ordinate::M>()
const
540 inline double CoordinateXYZM::get<Ordinate::X>()
const
546 inline double CoordinateXYZM::get<Ordinate::Y>()
const
552 inline double CoordinateXYZM::get<Ordinate::Z>()
const
558 inline double CoordinateXYZM::get<Ordinate::M>()
const
563 GEOS_DLL std::ostream& operator<< (std::ostream& os,
const CoordinateXY& c);
564 GEOS_DLL std::ostream& operator<< (std::ostream& os,
const Coordinate& c);
565 GEOS_DLL std::ostream& operator<< (std::ostream& os,
const CoordinateXYM& c);
566 GEOS_DLL std::ostream& operator<< (std::ostream& os,
const CoordinateXYZM& c);
573 template<>
struct common_type<
geos::geom::CoordinateXY, geos::geom::CoordinateXY> {
using type = geos::geom::CoordinateXY; };
575 template<>
struct common_type<
geos::geom::CoordinateXY, geos::geom::CoordinateXYM> {
using type = geos::geom::CoordinateXYM; };
576 template<>
struct common_type<
geos::geom::CoordinateXY, geos::geom::CoordinateXYZM> {
using type = geos::geom::CoordinateXYZM; };
580 template<>
struct common_type<
geos::geom::Coordinate, geos::geom::CoordinateXYM> {
using type = geos::geom::CoordinateXYZM; };
581 template<>
struct common_type<
geos::geom::Coordinate, geos::geom::CoordinateXYZM> {
using type = geos::geom::CoordinateXYZM; };
583 template<>
struct common_type<
geos::geom::CoordinateXYM, geos::geom::CoordinateXY> {
using type = geos::geom::CoordinateXYM; };
584 template<>
struct common_type<
geos::geom::CoordinateXYM,
geos::geom::Coordinate> {
using type = geos::geom::CoordinateXYZM; };
585 template<>
struct common_type<
geos::geom::CoordinateXYM, geos::geom::CoordinateXYM> {
using type = geos::geom::CoordinateXYM; };
586 template<>
struct common_type<
geos::geom::CoordinateXYM, geos::geom::CoordinateXYZM> {
using type = geos::geom::CoordinateXYZM; };
588 template<>
struct common_type<
geos::geom::CoordinateXYZM, geos::geom::CoordinateXY> {
using type = geos::geom::CoordinateXYZM; };
589 template<>
struct common_type<
geos::geom::CoordinateXYZM,
geos::geom::Coordinate> {
using type = geos::geom::CoordinateXYZM; };
590 template<>
struct common_type<
geos::geom::CoordinateXYZM, geos::geom::CoordinateXYM> {
using type = geos::geom::CoordinateXYZM; };
591 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:216
std::string toString() const
Returns a string of the form (x,y,z) .
std::set< const Coordinate *, CoordinateLessThan > ConstSet
A set of const Coordinate pointers.
Definition: Coordinate.h:224
std::vector< Coordinate > Vect
A vector of Coordinate objects (real object, not pointers)
Definition: Coordinate.h:233
std::vector< const Coordinate * > ConstVect
A vector of const Coordinate pointers.
Definition: Coordinate.h:227
std::stack< const Coordinate * > ConstStack
A stack of const Coordinate pointers.
Definition: Coordinate.h:230
bool equals3D(const Coordinate &other) const
3D comparison
Definition: Coordinate.h:270
double z
z-coordinate
Definition: Coordinate.h:236
bool operator<(const CoordinateXY &a, const CoordinateXY &b)
Strict weak ordering operator for Coordinate.
Definition: Coordinate.h:453
Basic namespace for all GEOS functionalities.
Definition: Angle.h:25
Strict weak ordering Functor for Coordinate.
Definition: Coordinate.h:428