fixes #731, perpendicular projection to nearest location

This commit is contained in:
Dennis Luxen 2013-12-16 17:36:36 +01:00
parent 4b46d07380
commit 96aff57275
3 changed files with 26 additions and 24 deletions

View File

@ -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);

View File

@ -59,12 +59,12 @@ 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 |
And the ways And the ways
| nodes | | nodes |
@ -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 |

View File

@ -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 |