17 #include <geos/export.h> 18 #include <geos/constants.h> 20 #include <unordered_set> 28 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class 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)));
277 std::string toString()
const;
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
Definition: Coordinate.h:572
bool operator<(const CoordinateXY &a, const CoordinateXY &b)
Strict weak ordering operator for Coordinate.
Definition: Coordinate.h:453
std::vector< const Coordinate * > ConstVect
A vector of const Coordinate pointers.
Definition: Coordinate.h:227
bool equals3D(const Coordinate &other) const
3D comparison
Definition: Coordinate.h:270
Basic namespace for all GEOS functionalities.
Definition: Angle.h:25
std::vector< Coordinate > Vect
A vector of Coordinate objects (real object, not pointers)
Definition: Coordinate.h:233
std::set< const Coordinate *, CoordinateLessThan > ConstSet
A set of const Coordinate pointers.
Definition: Coordinate.h:224
Strict weak ordering Functor for Coordinate.
Definition: Coordinate.h:428
double z
z-coordinate
Definition: Coordinate.h:236
std::stack< const Coordinate * > ConstStack
A stack of const Coordinate pointers.
Definition: Coordinate.h:230