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