https://github.com/tue-alga/CoordinatedSchematization
Tip revision: 9ffc292c946498d56f7938a86628adba534a9085 authored by TUE\bacusters on 01 July 2021, 09:20:10 UTC
Add base schematization library
Add base schematization library
Tip revision: 9ffc292
EmbeddedGraph.cpp
#include "SchematLib/Models/EmbeddedGraph.h"
namespace SchematLib::Models {
const std::map<std::string, std::size_t> OsmRanks::OSM_RANKS =
{
// Assign links same priority.
{"motorway",0},
{"motorway_link",0},
{"trunk",1},
{"trunk_link",1},
{"primary",2},
{"primary_link",2},
{"secondary",3},
{"secondary_link",3},
{"tertiary",4},
{"tertiary_link",4},
{"residential",5}, //Flipped with unclassified
{"unclassified",6},
{"service",7},
{"living_street",8}
};
ConvertedPointMaker& ConvertedPointMaker::operator=(const ConvertedPointMaker& other)
{
m_base = other.m_base;
m_target = other.m_target;
srcEpsg = other.srcEpsg;
targetEpsg = other.targetEpsg;
m_isIdentity = targetEpsg == srcEpsg;
if (other.m_transform.get()) constructTransform();
return *this;
}
void ConvertedPointMaker::setOriginalGdalOrders(bool value)
{
m_originalOrders = value;
}
void ConvertedPointMaker::setTargetFromEpsg(int epsg)
{
targetEpsg = epsg;
m_target.importFromEPSG(epsg);
}
void ConvertedPointMaker::setBaseFromEpsg(int epsg)
{
srcEpsg = epsg;
m_base.importFromEPSG(epsg);
}
void ConvertedPointMaker::setBaseToWGS84()
{
srcEpsg = 4326;
m_base.importFromEPSG(4326);
}
bool ConvertedPointMaker::hasTransform() const
{
return m_transform.get() != nullptr;
}
void ConvertedPointMaker::constructTransform()
{
m_isIdentity = srcEpsg == targetEpsg;
if(m_isIdentity)
{
return;
}
if (m_originalOrders)
{
m_base.SetAxisMappingStrategy(OSRAxisMappingStrategy::OAMS_TRADITIONAL_GIS_ORDER);
m_target.SetAxisMappingStrategy(OSRAxisMappingStrategy::OAMS_TRADITIONAL_GIS_ORDER);
}
m_transform = TransformPtr(OGRCreateCoordinateTransformation(&m_base, &m_target), [](auto* crt)
{
OGRCoordinateTransformation::DestroyCT(crt);
});
if (!m_transform) throw std::runtime_error("Transform construction failed");
}
void ConvertedPointMaker::constructTransform(int epsgSrc, int epsgTarget)
{
targetEpsg = epsgTarget;
srcEpsg = epsgSrc;
if (epsgSrc == epsgTarget) { m_isIdentity = true; return; }
m_base.importFromEPSG(epsgSrc);
m_target.importFromEPSG(epsgTarget);
constructTransform();
}
void ConvertedPointMaker::dumpData()
{
m_base.dumpReadable();
m_target.dumpReadable();
}
Point ConvertedPointMaker::operator()(std::initializer_list<NT> coordinates) const
{
if (m_isIdentity) { return Point(*coordinates.begin(), *std::next(coordinates.begin())); }
if (!m_transform) throw std::runtime_error("Coordinate transform not initialized");
double x = *coordinates.begin();
double y = *std::next(coordinates.begin());
m_transform->Transform(1, &x, &y);
return Point(x, y); //TODO concept Point
}
Point PointMaker::operator()(std::initializer_list<NT> coordinates) const
{
return Point(*coordinates.begin(), *std::next(coordinates.begin()));
}
bool OsmRanks::hasRank(const std::string& name)
{
return OSM_RANKS.find(name) != OSM_RANKS.end();
}
std::size_t OsmRanks::rank(const std::string& name)
{
return OSM_RANKS.at(name);
}
std::size_t OsmRanks::rank_or_default(const std::string& name, std::size_t defaultVal)
{
if (hasRank(name)) return rank(name);
return defaultVal;
}
}