1 #ifndef OSRM_GEOJSON_DEBUG_POLICY_TOOLKIT_HPP
2 #define OSRM_GEOJSON_DEBUG_POLICY_TOOLKIT_HPP
3
4 #include "extractor/query_node.hpp"
5 #include "util/coordinate.hpp"
6 #include "util/json_container.hpp"
7
8 #include <algorithm>
9 #include <iterator>
10
11 #include <boost/optional.hpp>
12
13 namespace osrm
14 {
15 namespace util
16 {
17
18 enum GeojsonStyleSize
19 {
20 tiny,
21 small,
22 medium,
23 large,
24 extra_large,
25 num_styles
26 };
27
28 enum GeojsonStyleColors
29 {
30 red,
31 purple,
32 blue,
33 green,
34 yellow,
35 cyan,
36 brown,
37 pink,
38 num_colors
39 };
40
41 const constexpr char *geojson_debug_predifined_colors[GeojsonStyleColors::num_colors] = {
42 "#FF4848", "#800080", "#5757FF", "#1FCB4A", "#FFE920", "#29AFD6", "#B05F3C", "#FE67EB"};
43
44 const constexpr double geojson_predefined_sizes[GeojsonStyleSize::num_styles] = {
45 2.0, 3.5, 5.0, 6.5, 8};
46
makeStyle(const GeojsonStyleSize size_type,const GeojsonStyleColors predefined_color)47 inline util::json::Object makeStyle(const GeojsonStyleSize size_type,
48 const GeojsonStyleColors predefined_color)
49 {
50 util::json::Object style;
51 // style everything, since we don't know the feature type
52 style.values["stroke"] = geojson_debug_predifined_colors[predefined_color];
53 style.values["circle-color"] = geojson_debug_predifined_colors[predefined_color];
54 style.values["line-width"] = geojson_predefined_sizes[size_type];
55 style.values["circle-radius"] = geojson_predefined_sizes[size_type];
56 return style;
57 }
58
59 struct CoordinateToJsonArray
60 {
operator ()osrm::util::CoordinateToJsonArray61 util::json::Array operator()(const util::Coordinate coordinate)
62 {
63 util::json::Array json_coordinate;
64 json_coordinate.values.push_back(static_cast<double>(toFloating(coordinate.lon)));
65 json_coordinate.values.push_back(static_cast<double>(toFloating(coordinate.lat)));
66 return json_coordinate;
67 }
68 };
69
70 struct NodeIdToCoordinate
71 {
NodeIdToCoordinateosrm::util::NodeIdToCoordinate72 NodeIdToCoordinate(const std::vector<util::Coordinate> &node_coordinates)
73 : node_coordinates(node_coordinates)
74 {
75 }
76
77 const std::vector<util::Coordinate> &node_coordinates;
78
operator ()osrm::util::NodeIdToCoordinate79 util::json::Array operator()(const NodeID nid)
80 {
81 auto coordinate = node_coordinates[nid];
82 CoordinateToJsonArray converter;
83 return converter(coordinate);
84 }
85 };
86
makeFeature(std::string type,util::json::Array coordinates,const boost::optional<util::json::Object> & properties={})87 inline util::json::Object makeFeature(std::string type,
88 util::json::Array coordinates,
89 const boost::optional<util::json::Object> &properties = {})
90 {
91 util::json::Object result;
92 result.values["type"] = "Feature";
93 result.values["properties"] = properties ? *properties : util::json::Object();
94 util::json::Object geometry;
95 geometry.values["type"] = std::move(type);
96 geometry.values["properties"] = util::json::Object();
97 geometry.values["coordinates"] = std::move(coordinates);
98 result.values["geometry"] = geometry;
99
100 return result;
101 }
102
makeJsonArray(const std::vector<util::Coordinate> & input_coordinates)103 inline util::json::Array makeJsonArray(const std::vector<util::Coordinate> &input_coordinates)
104 {
105 util::json::Array coordinates;
106 std::transform(input_coordinates.begin(),
107 input_coordinates.end(),
108 std::back_inserter(coordinates.values),
109 CoordinateToJsonArray());
110 return coordinates;
111 }
112 } // namespace util
113 } // namespace osrm
114
115 #endif /* OSRM_GEOJSON_DEBUG_POLICY_TOOLKIT_HPP */
116