Opened 7 years ago
Last modified 7 years ago
#11982 new Bugs
distance between point and linestring on spherical_equatorial ignores radius when using haversine.
| Reported by: | anonymous | Owned by: | Barend Gehrels |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | geometry |
| Version: | Boost 1.60.0 | Severity: | Problem |
| Keywords: | Cc: |
Description
Distance between a point and a linestring is incorrect when using spherical_equatorial coordinates and haversine strategy. It looks like it is always using radius = 1.0.
Example:
#include <iostream>
#include <boost/geometry.hpp>
namespace bg = boost::geometry;
typedef bg::model::point<double, 2, bg::cs::spherical_equatorial<bg::degree> > pt;
typedef bg::model::linestring<pt> pt_line;
int main()
{
const double earthRadius = 6371.0 * 1000.0;
pt oslo(10.733557, 59.911923);
pt sandvika(10.521812, 59.887214);
pt trondheim(10.4, 63.43);
// works correct
double d1 = bg::distance(sandvika, trondheim, bg::strategy::distance::haversine<double>(earthRadius));
double d2 = bg::distance(oslo, trondheim, bg::strategy::distance::haversine<double>(earthRadius));
std::cout << "Sandvika-Trondheim " << d1 << std::endl;
std::cout << "Oslo-Trondheim " << d2 << std::endl;
pt_line ll;
ll.push_back(oslo);
ll.push_back(sandvika);
// Does not work
double d3 = bg::distance(trondheim, ll, bg::strategy::distance::haversine<double>(earthRadius));
std::cout << "Oslo-Sandvika - Trondheim " << d3 << std::endl;
return 0;
}
Output:
Sandvika-Trondheim 393992 Oslo-Trondheim 391587 Oslo-Sandvika - Trondheim 0.0614639
Note that the last number differs with a factor of 6371000 from the correct 391587.
It looks like distance/backward_compatibility.hpp is ignoring the incoming strategy in last argument to apply.
Attachments (1)
Change History (2)
by , 7 years ago
| Attachment: | test_distance.cc added |
|---|
comment:1 by , 7 years ago
That's because distance() for Point-Linestring requires Point/Segment strategy, not Point/Point strategy. If you passed:
bg::strategy::distance::cross_track<>(earthRadius)
the result would be correct.
We have a few options:
- As you suggest somehow pass radius from input strategy into the Point/Segment strategy created in
backward_compatibility.hpp. This may be problematic currently. - Remove backward compatibility since it allows to use strategies incorrectly.
- Something else?
Barend do you have a preference?

Example program.