fixes #731, perpendicular projection to nearest location
This commit is contained in:
parent
4b46d07380
commit
96aff57275
@ -4,6 +4,8 @@
|
|||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
#include "Coordinate.h"
|
#include "Coordinate.h"
|
||||||
|
#include "../Util/MercatorUtil.h"
|
||||||
|
#include "../typedefs.h"
|
||||||
|
|
||||||
struct EdgeBasedNode {
|
struct EdgeBasedNode {
|
||||||
|
|
||||||
@ -29,11 +31,11 @@ struct EdgeBasedNode {
|
|||||||
return std::numeric_limits<double>::max();
|
return std::numeric_limits<double>::max();
|
||||||
}
|
}
|
||||||
|
|
||||||
const double x = inputPoint.lat/COORDINATE_PRECISION;
|
const double x = lat2y(inputPoint.lat/COORDINATE_PRECISION);
|
||||||
const double y = inputPoint.lon/COORDINATE_PRECISION;
|
const double y = inputPoint.lon/COORDINATE_PRECISION;
|
||||||
const double a = lat1/COORDINATE_PRECISION;
|
const double a = lat2y(lat1/COORDINATE_PRECISION);
|
||||||
const double b = lon1/COORDINATE_PRECISION;
|
const double b = lon1/COORDINATE_PRECISION;
|
||||||
const double c = lat2/COORDINATE_PRECISION;
|
const double c = lat2y(lat2/COORDINATE_PRECISION);
|
||||||
const double d = lon2/COORDINATE_PRECISION;
|
const double d = lon2/COORDINATE_PRECISION;
|
||||||
double p,q,mX,nY;
|
double p,q,mX,nY;
|
||||||
if(std::fabs(a-c) > std::numeric_limits<double>::epsilon() ){
|
if(std::fabs(a-c) > std::numeric_limits<double>::epsilon() ){
|
||||||
@ -66,7 +68,7 @@ struct EdgeBasedNode {
|
|||||||
// return std::sqrt(((d - y)*(d - y) + (c - x)*(c - x)));
|
// return std::sqrt(((d - y)*(d - y) + (c - x)*(c - x)));
|
||||||
}
|
}
|
||||||
// point lies in between
|
// point lies in between
|
||||||
nearest_location.lat = p*COORDINATE_PRECISION;
|
nearest_location.lat = y2lat(p)*COORDINATE_PRECISION;
|
||||||
nearest_location.lon = q*COORDINATE_PRECISION;
|
nearest_location.lon = q*COORDINATE_PRECISION;
|
||||||
// return std::sqrt((p-x)*(p-x) + (q-y)*(q-y));
|
// return std::sqrt((p-x)*(p-x) + (q-y)*(q-y));
|
||||||
return (p-x)*(p-x) + (q-y)*(q-y);
|
return (p-x)*(p-x) + (q-y)*(q-y);
|
||||||
|
@ -59,10 +59,10 @@ Feature: Locating Nearest node on a Way - pick closest way
|
|||||||
Given the node locations
|
Given the node locations
|
||||||
| node | lat | lon |
|
| node | lat | lon |
|
||||||
| a | -85 | -180 |
|
| a | -85 | -180 |
|
||||||
| b | 0 | 0 |
|
| b | -85 | -160 |
|
||||||
| c | 85 | 180 |
|
| c | -85 | -140 |
|
||||||
| x | -70 | -100 |
|
| x | 75 | -180 |
|
||||||
| y | 70 | 100 |
|
| y | 75 | -180 |
|
||||||
| v | 1 | 1 |
|
| v | 1 | 1 |
|
||||||
| w | -1 | -1 |
|
| w | -1 | -1 |
|
||||||
|
|
||||||
@ -73,6 +73,6 @@ Feature: Locating Nearest node on a Way - pick closest way
|
|||||||
When I request nearest I should get
|
When I request nearest I should get
|
||||||
| in | out |
|
| in | out |
|
||||||
| x | a |
|
| x | a |
|
||||||
| y | c |
|
| y | a |
|
||||||
| v | b |
|
| v | c |
|
||||||
| w | b |
|
| w | c |
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
@routing @projection @todo
|
@routing @projection
|
||||||
Feature: Projection to nearest point on road
|
Feature: Projection to nearest point on road
|
||||||
Waypoints should be projected perpendicular onto the closest road, also at high latitudes.
|
Waypoints are projected perpendiculary onto the closest road
|
||||||
|
|
||||||
Background:
|
Background:
|
||||||
The coordinas below was calculated using http://www.movable-type.co.uk/scripts/latlong.html
|
The coordinas below was calculated using http://www.movable-type.co.uk/scripts/latlong.html
|
||||||
@ -24,15 +24,15 @@ Waypoints should be projected perpendicular onto the closest road, also at high
|
|||||||
Scenario: Projection onto way at high latitudes, 1km distance
|
Scenario: Projection onto way at high latitudes, 1km distance
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| from | to | route | compass | bearing | distance |
|
| from | to | route | compass | bearing | distance |
|
||||||
| b | a | abc | SW | 225 | 1000m +-3 |
|
| b | a | abc | SW | 225 | 1000m +-7 |
|
||||||
| b | c | abc | NE | 45 | 1000m +-3 |
|
| b | c | abc | NE | 45 | 1000m +-7 |
|
||||||
| a | d | abc | NE | 45 | 1000m +-3 |
|
| a | d | abc | NE | 45 | 1000m +-7 |
|
||||||
| d | a | abc | SW | 225 | 1000m +-3 |
|
| d | a | abc | SW | 225 | 1000m +-7 |
|
||||||
| c | d | abc | SW | 225 | 1000m +-3 |
|
| c | d | abc | SW | 225 | 1000m +-7 |
|
||||||
| d | c | abc | NE | 45 | 1000m +-3 |
|
| d | c | abc | NE | 45 +-1 | 1000m +-7 |
|
||||||
|
|
||||||
Scenario: Projection onto way at high latitudes, no distance
|
Scenario: Projection onto way at high latitudes, no distance
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| from | to | route | distance |
|
| from | to | route | distance |
|
||||||
| d | b | abc | 0m |
|
| d | b | abc | 0m +-4 |
|
||||||
| b | d | abc | 0m |
|
| b | d | abc | 0m +-4 |
|
||||||
|
Loading…
Reference in New Issue
Block a user