Cross routing out edges detection enhancement

This commit is contained in:
Lev Dragunov 2015-03-31 10:46:31 +03:00 committed by Alex Zolotarev
parent 0ee7be1d6a
commit 1db6f47ce3
2 changed files with 34 additions and 15 deletions

View file

@ -54,18 +54,13 @@ void BuildRoutingIndex(string const & baseDir, string const & countryName, strin
CHECK(borders::LoadCountriesList(baseDir, m_countries),
("Error loading country polygons files"));
{
vector<m2::RegionD> tmpRegionBorders;
m_countries.ForEach([&](borders::CountryPolygons const & c)
{
if (c.m_name == countryName)
{
c.m_regions.ForEach([&](m2::RegionD const & region)
{
m2::RegionD finalBorder;
finalBorder.Data().reserve(region.Data().size());
for (auto p = region.Begin(); p<region.End(); ++p)
finalBorder.AddPoint({MercatorBounds::XToLon(p->x), MercatorBounds::YToLat(p->y)});
regionBorders.emplace_back(move(finalBorder));
regionBorders.push_back(region);
});
}
});
@ -104,33 +99,41 @@ void BuildRoutingIndex(string const & baseDir, string const & countryName, strin
// Check mwm borders crossing.
for (m2::RegionD const & border: regionBorders)
{
bool const outStart = border.Contains({ startSeg.lon1, startSeg.lat1 });
bool const outEnd = border.Contains({ endSeg.lon2, endSeg.lat2 });
bool const outStart = border.Contains({ MercatorBounds::LonToX(startSeg.lon1), MercatorBounds::LatToY(startSeg.lat1) });
bool const outEnd = border.Contains({ MercatorBounds::LonToX(endSeg.lon2), MercatorBounds::LatToY(endSeg.lat2) });
if (outStart == outEnd)
continue;
m2::PointD intersection = m2::PointD::Zero();
for (auto const & segment : data.m_segments)
if (border.FindIntersection({segment.lon1, segment.lat1}, {segment.lon2, segment.lat2}, intersection))
if (border.FindIntersection({MercatorBounds::LonToX(segment.lon1), MercatorBounds::LatToY(segment.lat1)}, {MercatorBounds::LonToX(segment.lon2), MercatorBounds::LatToY(segment.lat2)}, intersection))
break;
if (intersection == m2::PointD::Zero())
continue;
else
// for old format compatibility
intersection = m2::PointD(MercatorBounds::XToLon(intersection.x), MercatorBounds::YToLat(intersection.y));
if (outStart && !outEnd)
{
string mwmName;
m2::PointD mercatorPoint(MercatorBounds::LonToX(endSeg.lon2), MercatorBounds::LatToY(endSeg.lat2));
m2::PointD const mercatorPoint(MercatorBounds::LonToX(endSeg.lon2), MercatorBounds::LatToY(endSeg.lat2));
m_countries.ForEachInRect(m2::RectD(mercatorPoint, mercatorPoint), [&](borders::CountryPolygons const & c)
{
bool inside = false;
if (c.m_name == countryName)
return;
c.m_regions.ForEachInRect(m2::RectD(mercatorPoint, mercatorPoint), [&](m2::RegionD const & region)
{
// Sometimes Contains make errors for cases near the border.
if (region.Contains(mercatorPoint))
inside = true;
mwmName = c.m_name;
else
if (region.AtBorder(mercatorPoint,0.01))
mwmName = c.m_name;
});
if (inside)
mwmName = c.m_name;
});
if (!mwmName.empty() && mwmName != mwmFile)
if (!mwmName.empty())
crossContext.addOutgoingNode(nodeId, mwmName, intersection);
else
LOG(LINFO, ("Unknowing outgoing edge", endSeg.lat2, endSeg.lon2, startSeg.lat1, startSeg.lon1));
}
else if (!outStart && outEnd)
crossContext.addIngoingNode(nodeId, intersection);

View file

@ -2,6 +2,8 @@
#include "osrm_test_tools.hpp"
#include "../indexer/mercator.hpp"
using namespace routing;
namespace
@ -49,4 +51,18 @@ namespace
integration::CalculateRouteAndTestRouteLength(routerComponents, {37.537543510152318, 67.536217686389165},
{0., 0.}, {18.542688617866236, -36.095015335418523}, 1000.);
}
UNIT_TEST(ArbatBaliCrimeanForwardCrossMwmTest)
{
shared_ptr<integration::OsrmRouterComponents> routerComponents = integration::GetAllMaps();
integration::CalculateRouteAndTestRouteLength(routerComponents, {MercatorBounds::LonToX(34.804955), MercatorBounds::LatToY(46.152324)},
{0., 0.}, {MercatorBounds::LonToX(35.369712), MercatorBounds::LatToY(45.356971)}, 105000.);
}
UNIT_TEST(ArbatBaliCrimeanBackwardCrossTest)
{
shared_ptr<integration::OsrmRouterComponents> routerComponents = integration::GetAllMaps();
integration::CalculateRouteAndTestRouteLength(routerComponents, {MercatorBounds::LonToX(35.369712), MercatorBounds::LatToY(45.356971)},
{0., 0.}, {MercatorBounds::LonToX(34.804955), MercatorBounds::LatToY(46.152324)}, 105000.);
}
}