Loading src/geo/GeographicNode.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -34,10 +34,10 @@ GeographicNode::GeographicNode() { } GeographicNode::GeographicNode(int id, double lat, double lon) : GeographicPosition<double>(lat, lon), _id(id) { : GeographicPosition(lat, lon), _id(id) { } GeographicNode::GeographicNode(const GeographicNode& other) : GeographicPosition<double>(other._latitude, other._longitude), _id(other._id) { GeographicNode::GeographicNode(const GeographicNode& other) : GeographicPosition(other._latitude, other._longitude), _id(other._id) { } GeographicNode& GeographicNode::operator=(const GeographicNode& other) { Loading src/geo/GeographicNode.hpp +1 −1 Original line number Diff line number Diff line Loading @@ -34,7 +34,7 @@ #include <vector> #include <memory> class GeographicNode : public GeographicPosition<double> { class GeographicNode : public GeographicPosition { public: GeographicNode(); GeographicNode(const GeographicNode& other); Loading src/geo/GeographicPosition.hpp +9 −10 Original line number Diff line number Diff line #ifndef GEOGRAPHICPOSITION_HPP #define GEOGRAPHICPOSITION_HPP #include "util/Util.hpp" #include <cassert> #include <utility> typedef std::pair<double,double> GeographicPositionTuple; template <typename T> class GeographicPosition { public: GeographicPosition() : _latitude(0), _longitude(0), _valid(false) {} GeographicPosition(T latitude, T longitude) : _latitude(latitude), _longitude(longitude), _valid(true) { assert(-90.0 <= latitude && latitude <= 90.0); assert(-180.0 <= longitude && longitude <= 180.0); GeographicPosition(double latitude, double longitude) : _latitude(latitude), _longitude(longitude), _valid(true) { assert(Util::checkBounds(latitude, longitude)); } virtual void setLat(T val) { virtual void setLat(double val) { _latitude = val; } virtual void setLon(T val) { virtual void setLon(double val) { _longitude = val; } T lat() { double lat() { return _latitude; } T lon() { double lon() { return _longitude; } Loading @@ -45,8 +44,8 @@ public: } protected: T _latitude; T _longitude; double _latitude; double _longitude; bool _valid; }; Loading src/geo/GeometricHelpers.cpp +13 −17 Original line number Diff line number Diff line Loading @@ -41,42 +41,38 @@ static const double DEG_TO_RAD = 0.017453292519943295769236907684886; // http://blog.julien.cayzac.name/2008/10/arc-and-distance-between-two-points-on.html // use the law of haversines for numerical stability double GeometricHelpers::sphericalDist(Position& from, Position& to) { double latitudeArc = (from.lat - to.lat) * DEG_TO_RAD; double longitudeArc = (from.lon - to.lon) * DEG_TO_RAD; double GeometricHelpers::sphericalDist(GeographicPosition& from, GeographicPosition& to) { double latitudeArc = (from.lat() - to.lat()) * DEG_TO_RAD; double longitudeArc = (from.lon() - to.lon()) * DEG_TO_RAD; double latitudeH = sin(latitudeArc * 0.5); latitudeH *= latitudeH; double lontitudeH = sin(longitudeArc * 0.5); lontitudeH *= lontitudeH; double tmp = cos(from.lat * DEG_TO_RAD) * cos(to.lat * DEG_TO_RAD); double tmp = cos(from.lat() * DEG_TO_RAD) * cos(to.lat() * DEG_TO_RAD); return 2.0 * asin(sqrt(latitudeH + tmp * lontitudeH)); } double GeometricHelpers::sphericalDist(GeographicNode_Ptr& from, GeographicNode_Ptr& to) { Position p1; p1.lat = from->lat(); p1.lon = from->lon(); Position p2; p2.lat = to->lat(); p2.lon = to->lon(); GeographicPosition p1(from->lat(), from->lon()); GeographicPosition p2(to->lat(), to->lon()); return GeometricHelpers::sphericalDist(p1, p2); } GeographicPositionTuple GeometricHelpers::getMidPointCoordinates(GeographicNode_Ptr& from, GeographicNode_Ptr& to) { Position p1(from->lat(), from->lon()); Position p2(to->lat(), to->lon()); GeographicPosition p1(from->lat(), from->lon()); GeographicPosition p2(to->lat(), to->lon()); return GeometricHelpers::getMidPointCoordinates(p1, p2); } GeographicPositionTuple GeometricHelpers::getMidPointCoordinates(Position& n1, Position& n2) { GeographicPositionTuple GeometricHelpers::getMidPointCoordinates(GeographicPosition& n1, GeographicPosition& n2) { // calculate midpoint // http://www.movable-type.co.uk/scripts/latlong.html double lat1 = deg2rad(n1.lat); double lon1 = deg2rad(n1.lon); double lat2 = deg2rad(n2.lat); double lat1 = deg2rad(n1.lat()); double lon1 = deg2rad(n1.lon()); double lat2 = deg2rad(n2.lat()); double dLon = deg2rad(n2.lon - n1.lon); double dLon = deg2rad(n2.lon() - n1.lon()); double Bx = cos(lat2) * cos(dLon); double By = cos(lat2) * sin(dLon); Loading src/geo/GeometricHelpers.hpp +2 −3 Original line number Diff line number Diff line Loading @@ -32,7 +32,6 @@ #include "GeographicNode.hpp" #include "GeographicPosition.hpp" #include "Position.hpp" #include <utility> namespace GeometricHelpers { Loading @@ -40,11 +39,11 @@ double deg2rad(double deg); double rad2deg(double rad); double sphericalDist(GeographicNode_Ptr& from, GeographicNode_Ptr& to); double sphericalDist(Position& from, Position& to); double sphericalDist(GeographicPosition& from, GeographicPosition& to); double sphericalDistToKM(double dist); GeographicPositionTuple getMidPointCoordinates(GeographicNode_Ptr& n1, GeographicNode_Ptr& n2); GeographicPositionTuple getMidPointCoordinates(Position& n1, Position& n2); GeographicPositionTuple getMidPointCoordinates(GeographicPosition& n1, GeographicPosition& n2); }; #endif Loading
src/geo/GeographicNode.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -34,10 +34,10 @@ GeographicNode::GeographicNode() { } GeographicNode::GeographicNode(int id, double lat, double lon) : GeographicPosition<double>(lat, lon), _id(id) { : GeographicPosition(lat, lon), _id(id) { } GeographicNode::GeographicNode(const GeographicNode& other) : GeographicPosition<double>(other._latitude, other._longitude), _id(other._id) { GeographicNode::GeographicNode(const GeographicNode& other) : GeographicPosition(other._latitude, other._longitude), _id(other._id) { } GeographicNode& GeographicNode::operator=(const GeographicNode& other) { Loading
src/geo/GeographicNode.hpp +1 −1 Original line number Diff line number Diff line Loading @@ -34,7 +34,7 @@ #include <vector> #include <memory> class GeographicNode : public GeographicPosition<double> { class GeographicNode : public GeographicPosition { public: GeographicNode(); GeographicNode(const GeographicNode& other); Loading
src/geo/GeographicPosition.hpp +9 −10 Original line number Diff line number Diff line #ifndef GEOGRAPHICPOSITION_HPP #define GEOGRAPHICPOSITION_HPP #include "util/Util.hpp" #include <cassert> #include <utility> typedef std::pair<double,double> GeographicPositionTuple; template <typename T> class GeographicPosition { public: GeographicPosition() : _latitude(0), _longitude(0), _valid(false) {} GeographicPosition(T latitude, T longitude) : _latitude(latitude), _longitude(longitude), _valid(true) { assert(-90.0 <= latitude && latitude <= 90.0); assert(-180.0 <= longitude && longitude <= 180.0); GeographicPosition(double latitude, double longitude) : _latitude(latitude), _longitude(longitude), _valid(true) { assert(Util::checkBounds(latitude, longitude)); } virtual void setLat(T val) { virtual void setLat(double val) { _latitude = val; } virtual void setLon(T val) { virtual void setLon(double val) { _longitude = val; } T lat() { double lat() { return _latitude; } T lon() { double lon() { return _longitude; } Loading @@ -45,8 +44,8 @@ public: } protected: T _latitude; T _longitude; double _latitude; double _longitude; bool _valid; }; Loading
src/geo/GeometricHelpers.cpp +13 −17 Original line number Diff line number Diff line Loading @@ -41,42 +41,38 @@ static const double DEG_TO_RAD = 0.017453292519943295769236907684886; // http://blog.julien.cayzac.name/2008/10/arc-and-distance-between-two-points-on.html // use the law of haversines for numerical stability double GeometricHelpers::sphericalDist(Position& from, Position& to) { double latitudeArc = (from.lat - to.lat) * DEG_TO_RAD; double longitudeArc = (from.lon - to.lon) * DEG_TO_RAD; double GeometricHelpers::sphericalDist(GeographicPosition& from, GeographicPosition& to) { double latitudeArc = (from.lat() - to.lat()) * DEG_TO_RAD; double longitudeArc = (from.lon() - to.lon()) * DEG_TO_RAD; double latitudeH = sin(latitudeArc * 0.5); latitudeH *= latitudeH; double lontitudeH = sin(longitudeArc * 0.5); lontitudeH *= lontitudeH; double tmp = cos(from.lat * DEG_TO_RAD) * cos(to.lat * DEG_TO_RAD); double tmp = cos(from.lat() * DEG_TO_RAD) * cos(to.lat() * DEG_TO_RAD); return 2.0 * asin(sqrt(latitudeH + tmp * lontitudeH)); } double GeometricHelpers::sphericalDist(GeographicNode_Ptr& from, GeographicNode_Ptr& to) { Position p1; p1.lat = from->lat(); p1.lon = from->lon(); Position p2; p2.lat = to->lat(); p2.lon = to->lon(); GeographicPosition p1(from->lat(), from->lon()); GeographicPosition p2(to->lat(), to->lon()); return GeometricHelpers::sphericalDist(p1, p2); } GeographicPositionTuple GeometricHelpers::getMidPointCoordinates(GeographicNode_Ptr& from, GeographicNode_Ptr& to) { Position p1(from->lat(), from->lon()); Position p2(to->lat(), to->lon()); GeographicPosition p1(from->lat(), from->lon()); GeographicPosition p2(to->lat(), to->lon()); return GeometricHelpers::getMidPointCoordinates(p1, p2); } GeographicPositionTuple GeometricHelpers::getMidPointCoordinates(Position& n1, Position& n2) { GeographicPositionTuple GeometricHelpers::getMidPointCoordinates(GeographicPosition& n1, GeographicPosition& n2) { // calculate midpoint // http://www.movable-type.co.uk/scripts/latlong.html double lat1 = deg2rad(n1.lat); double lon1 = deg2rad(n1.lon); double lat2 = deg2rad(n2.lat); double lat1 = deg2rad(n1.lat()); double lon1 = deg2rad(n1.lon()); double lat2 = deg2rad(n2.lat()); double dLon = deg2rad(n2.lon - n1.lon); double dLon = deg2rad(n2.lon() - n1.lon()); double Bx = cos(lat2) * cos(dLon); double By = cos(lat2) * sin(dLon); Loading
src/geo/GeometricHelpers.hpp +2 −3 Original line number Diff line number Diff line Loading @@ -32,7 +32,6 @@ #include "GeographicNode.hpp" #include "GeographicPosition.hpp" #include "Position.hpp" #include <utility> namespace GeometricHelpers { Loading @@ -40,11 +39,11 @@ double deg2rad(double deg); double rad2deg(double rad); double sphericalDist(GeographicNode_Ptr& from, GeographicNode_Ptr& to); double sphericalDist(Position& from, Position& to); double sphericalDist(GeographicPosition& from, GeographicPosition& to); double sphericalDistToKM(double dist); GeographicPositionTuple getMidPointCoordinates(GeographicNode_Ptr& n1, GeographicNode_Ptr& n2); GeographicPositionTuple getMidPointCoordinates(Position& n1, Position& n2); GeographicPositionTuple getMidPointCoordinates(GeographicPosition& n1, GeographicPosition& n2); }; #endif