forked from organicmaps/organicmaps
Cross routing out edges detection enhancement
This commit is contained in:
parent
0ee7be1d6a
commit
1db6f47ce3
2 changed files with 34 additions and 15 deletions
|
@ -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);
|
||||
|
|
|
@ -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.);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue