fork download
  1. #include <iostream>
  2. using namespace std;
  3. #include <boost/geometry/index/rtree.hpp>
  4. #include <boost/geometry.hpp>
  5. #include <boost/geometry/geometries/point_xy.hpp>
  6. #include <boost/geometry/io/wkt/read.hpp>
  7. #include <boost/geometry/algorithms/buffer.hpp>
  8.  
  9. namespace bg = boost::geometry;
  10. namespace bgi = boost::geometry::index;
  11.  
  12.  
  13. typedef bg::model::point<double, 2, bg::cs::cartesian> BoostPoint;
  14. typedef bg::model::box<BoostPoint> BoostBox;
  15. typedef bg::model::linestring<BoostPoint> BoostLineString;
  16.  
  17. float haversine_distance(const BoostPoint& p1, const BoostPoint& p2) {
  18. const float R = 6371000.0f;
  19.  
  20. float lat1 = bg::get<0>(p1) * M_PI / 180.0f;
  21. float lon1 = bg::get<1>(p1) * M_PI / 180.0f;
  22. float lat2 = bg::get<0>(p2) * M_PI / 180.0f;
  23. float lon2 = bg::get<1>(p2) * M_PI / 180.0f;
  24.  
  25. float dLat = lat2 - lat1;
  26. float dLon = lon2 - lon1;
  27.  
  28. float a = std::sin(dLat/2) * std::sin(dLat/2) +
  29. std::cos(lat1) * std::cos(lat2) *
  30. std::sin(dLon/2) * std::sin(dLon/2);
  31. float c = 2 * std::atan2(std::sqrt(a), std::sqrt(1-a));
  32.  
  33. return R * c;
  34. }
  35.  
  36.  
  37. int main(){
  38. std::string wkt = "LINESTRING (37.419817 55.690967, 37.419938 55.690744)";
  39. BoostLineString l1;
  40.  
  41. bg::read_wkt(wkt, l1);
  42. std::cout << haversine_distance(l1.front(), l1.back()) << std::endl;
  43. return 0;
  44. }
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
24.1474