Skip to content

Commit

Permalink
[transit] GTFS producer with unit tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
mesozoic-drones committed May 25, 2020
1 parent 3748f74 commit 4e881aa
Show file tree
Hide file tree
Showing 16 changed files with 3,119 additions and 7 deletions.
8 changes: 2 additions & 6 deletions drape_frontend/color_constants.cpp
Expand Up @@ -107,10 +107,6 @@ TransitColorsHolder & TransitColors()

namespace df
{
string const kTransitColorPrefix = "transit_";
string const kTransitTextPrefix = "text_";
string const kTransitLinePrefix = "line_";

ColorConstant GetTransitColorName(ColorConstant const & localName)
{
return kTransitColorPrefix + kTransitLinePrefix + localName;
Expand All @@ -134,10 +130,10 @@ dp::Color GetColorConstant(ColorConstant const & constant)
return ToDrapeColor(color);
}

map<string, dp::Color> const & GetTransitClearColors() { return TransitColors().GetClearColors(); }

void LoadTransitColors()
{
TransitColors().Load();
}

map<string, dp::Color> const & GetClearColors() { return TransitColors().GetClearColors(); }
} // namespace df
6 changes: 5 additions & 1 deletion drape_frontend/color_constants.hpp
Expand Up @@ -9,8 +9,12 @@ namespace df
{
using ColorConstant = std::string;

inline std::string const kTransitColorPrefix = "transit_";
inline std::string const kTransitTextPrefix = "text_";
inline std::string const kTransitLinePrefix = "line_";

dp::Color GetColorConstant(ColorConstant const & constant);
std::map<std::string, dp::Color> const & GetClearColors();
std::map<std::string, dp::Color> const & GetTransitClearColors();
void LoadTransitColors();

ColorConstant GetTransitColorName(ColorConstant const & localName);
Expand Down
1 change: 1 addition & 0 deletions transit/CMakeLists.txt
Expand Up @@ -17,3 +17,4 @@ set(

omim_add_library(${PROJECT_NAME} ${SRC})
omim_add_test_subdirectory(transit_tests)
add_subdirectory(world_feed)
73 changes: 73 additions & 0 deletions transit/world_feed/CMakeLists.txt
@@ -0,0 +1,73 @@
project(world_feed)

set(SRC
color_picker.cpp
color_picker.hpp
date_time_helpers.cpp
date_time_helpers.hpp
feed_helpers.cpp
feed_helpers.hpp
world_feed.cpp
world_feed.hpp
)

omim_add_library(${PROJECT_NAME} ${SRC})

omim_link_libraries(
${PROJECT_NAME}
drape_frontend
shaders
routing
mwm_diff
bsdiff
tracking
traffic
routing_common
transit
descriptions
ugc
drape
partners_api
web_api
local_ads
kml
editor
indexer
metrics
platform
geometry
coding
base
freetype
expat
icu
agg
jansson
protobuf
stats_client
minizip
succinct
pugixml
oauthcpp
opening_hours
stb_image
sdf_image
vulkan_wrapper
${Qt5Widgets_LIBRARIES}
${Qt5Network_LIBRARIES}
${LIBZ}
)

if (PLATFORM_LINUX)
omim_link_libraries(
${PROJECT_NAME}
dl
)
endif()

link_opengl(${PROJECT_NAME})
link_qt5_core(${PROJECT_NAME})
link_qt5_network(${PROJECT_NAME})

omim_add_test_subdirectory(world_feed_tests)
add_subdirectory(gtfs_converter)
69 changes: 69 additions & 0 deletions transit/world_feed/color_picker.cpp
@@ -0,0 +1,69 @@
#include "transit/world_feed/color_picker.hpp"

#include "drape_frontend/apply_feature_functors.hpp"
#include "drape_frontend/color_constants.hpp"

#include "drape/color.hpp"

#include "base/string_utils.hpp"

#include <limits>
#include <tuple>

namespace
{
std::tuple<double, double, double> GetColors(dp::Color const & color)
{
return {color.GetRedF(), color.GetGreenF(), color.GetBlueF()};
}

double GetSquareDistance(dp::Color const & color1, dp::Color const & color2)
{
auto [r1, g1, b1] = GetColors(color1);
auto [r2, g2, b2] = GetColors(color2);
return (r1 - r2) * (r1 - r2) + (g1 - g2) * (g1 - g2) + (b1 - b2) * (b1 - b2);
}
} // namespace

namespace transit
{
ColorPicker::ColorPicker() { df::LoadTransitColors(); }

std::string ColorPicker::GetNearestColor(std::string const & rgb)
{
static std::string const kDefaultColor = "default";
if (rgb.empty())
return kDefaultColor;

auto [it, inserted] = m_colorsToNames.emplace(rgb, kDefaultColor);
if (!inserted)
return it->second;

std::string nearestColor = kDefaultColor;

unsigned int intColor;
// We do not need to add to the cache invalid color, so we just return.
if (!strings::to_uint(rgb, intColor, 16))
return nearestColor;

dp::Color const color = df::ToDrapeColor(static_cast<uint32_t>(intColor));
double minDist = std::numeric_limits<double>::max();

for (auto const & [name, transitColor] : df::GetTransitClearColors())
{
if (double const dist = GetSquareDistance(color, transitColor); dist < minDist)
{
minDist = dist;
nearestColor = name;
}
}
if (nearestColor.find(df::kTransitColorPrefix + df::kTransitLinePrefix) == 0)
{
nearestColor =
nearestColor.substr(df::kTransitColorPrefix.size() + df::kTransitLinePrefix.size());
}

it->second = nearestColor;
return nearestColor;
}
} // namespace transit
17 changes: 17 additions & 0 deletions transit/world_feed/color_picker.hpp
@@ -0,0 +1,17 @@
#pragma once

#include <string>
#include <unordered_map>

namespace transit
{
class ColorPicker
{
public:
ColorPicker();
std::string GetNearestColor(std::string const & rgb);

private:
std::unordered_map<std::string, std::string> m_colorsToNames;
};
} // namespace transit

0 comments on commit 4e881aa

Please sign in to comment.