Fix retrieval of forward/reverse data.
This commit is contained in:
parent
ef2261661c
commit
4c6d6aeaa7
@ -36,7 +36,7 @@ const constexpr std::uint32_t VARIANT_TYPE_BOOL = 7;
|
|||||||
|
|
||||||
// Vector tiles are 4096 virtual pixels on each side
|
// Vector tiles are 4096 virtual pixels on each side
|
||||||
const constexpr double EXTENT = 4096.0;
|
const constexpr double EXTENT = 4096.0;
|
||||||
const constexpr double BUFFER = 128.0;
|
const constexpr double BUFFER = 512.0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -141,12 +141,13 @@ inline FloatCoordinate toWGS84(const FloatCoordinate &mercator_coordinate)
|
|||||||
|
|
||||||
// Converts a WMS tile coordinate (z,x,y) into a wgs bounding box
|
// Converts a WMS tile coordinate (z,x,y) into a wgs bounding box
|
||||||
inline void xyzToWGS84(
|
inline void xyzToWGS84(
|
||||||
const int x, const int y, const int z, double &minx, double &miny, double &maxx, double &maxy)
|
const int x, const int y, const int z, double &minx, double &miny, double &maxx, double &maxy,
|
||||||
|
int mercator_buffer = 0)
|
||||||
{
|
{
|
||||||
minx = x * TILE_SIZE;
|
minx = x * TILE_SIZE - mercator_buffer;
|
||||||
miny = (y + 1.0) * TILE_SIZE;
|
miny = (y + 1.0) * TILE_SIZE - mercator_buffer;
|
||||||
maxx = (x + 1.0) * TILE_SIZE;
|
maxx = (x + 1.0) * TILE_SIZE + mercator_buffer;
|
||||||
maxy = y * TILE_SIZE;
|
maxy = y * TILE_SIZE + mercator_buffer;
|
||||||
// 2^z * TILE_SIZE
|
// 2^z * TILE_SIZE
|
||||||
const double shift = (1u << static_cast<unsigned>(z)) * TILE_SIZE;
|
const double shift = (1u << static_cast<unsigned>(z)) * TILE_SIZE;
|
||||||
pixelToDegree(shift, minx, miny);
|
pixelToDegree(shift, minx, miny);
|
||||||
|
@ -278,8 +278,15 @@ Status TilePlugin::HandleRequest(const std::shared_ptr<datafacade::BaseDataFacad
|
|||||||
double min_lon, min_lat, max_lon, max_lat;
|
double min_lon, min_lat, max_lon, max_lat;
|
||||||
|
|
||||||
// Convert the z,x,y mercator tile coordinates into WGS84 lon/lat values
|
// Convert the z,x,y mercator tile coordinates into WGS84 lon/lat values
|
||||||
util::web_mercator::xyzToWGS84(
|
//
|
||||||
parameters.x, parameters.y, parameters.z, min_lon, min_lat, max_lon, max_lat);
|
util::web_mercator::xyzToWGS84(parameters.x,
|
||||||
|
parameters.y,
|
||||||
|
parameters.z,
|
||||||
|
min_lon,
|
||||||
|
min_lat,
|
||||||
|
max_lon,
|
||||||
|
max_lat,
|
||||||
|
util::web_mercator::TILE_SIZE * 0.05);
|
||||||
|
|
||||||
util::Coordinate southwest{util::FloatLongitude{min_lon}, util::FloatLatitude{min_lat}};
|
util::Coordinate southwest{util::FloatLongitude{min_lon}, util::FloatLatitude{min_lat}};
|
||||||
util::Coordinate northeast{util::FloatLongitude{max_lon}, util::FloatLatitude{max_lat}};
|
util::Coordinate northeast{util::FloatLongitude{max_lon}, util::FloatLatitude{max_lat}};
|
||||||
@ -382,6 +389,7 @@ Status TilePlugin::HandleRequest(const std::shared_ptr<datafacade::BaseDataFacad
|
|||||||
{
|
{
|
||||||
unsigned source_intersection; // node-based-node ID
|
unsigned source_intersection; // node-based-node ID
|
||||||
unsigned target_intersection; // node-based-node ID
|
unsigned target_intersection; // node-based-node ID
|
||||||
|
bool is_geometry_forward; // Is the geometry forward or reverse?
|
||||||
unsigned packed_geometry_id;
|
unsigned packed_geometry_id;
|
||||||
};
|
};
|
||||||
// Lookup table for edge-based-nodes
|
// Lookup table for edge-based-nodes
|
||||||
@ -426,7 +434,7 @@ Status TilePlugin::HandleRequest(const std::shared_ptr<datafacade::BaseDataFacad
|
|||||||
}
|
}
|
||||||
|
|
||||||
edge_based_node_info[edge.forward_segment_id.id] = {
|
edge_based_node_info[edge.forward_segment_id.id] = {
|
||||||
edge.u, edge.v, edge.packed_geometry_id};
|
edge.u, edge.v, true, edge.packed_geometry_id};
|
||||||
}
|
}
|
||||||
// Same as previous block, but everything flipped
|
// Same as previous block, but everything flipped
|
||||||
if (edge.reverse_segment_id.enabled &&
|
if (edge.reverse_segment_id.enabled &&
|
||||||
@ -455,7 +463,7 @@ Status TilePlugin::HandleRequest(const std::shared_ptr<datafacade::BaseDataFacad
|
|||||||
// Save info about this edge-based-node, note reversal from forward
|
// Save info about this edge-based-node, note reversal from forward
|
||||||
// block above.
|
// block above.
|
||||||
edge_based_node_info[edge.reverse_segment_id.id] = {
|
edge_based_node_info[edge.reverse_segment_id.id] = {
|
||||||
edge.v, edge.u, edge.packed_geometry_id};
|
edge.v, edge.u, false, edge.packed_geometry_id};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -463,12 +471,25 @@ Status TilePlugin::HandleRequest(const std::shared_ptr<datafacade::BaseDataFacad
|
|||||||
// and targets of turns). EBN is short for edge-based-node
|
// and targets of turns). EBN is short for edge-based-node
|
||||||
std::vector<NodeID> first_geometry, second_geometry;
|
std::vector<NodeID> first_geometry, second_geometry;
|
||||||
std::vector<contractor::QueryEdge::EdgeData> unpacked_shortcut;
|
std::vector<contractor::QueryEdge::EdgeData> unpacked_shortcut;
|
||||||
std::vector<EdgeWeight> forward_weight_vector;
|
std::vector<EdgeWeight> first_weight_vector;
|
||||||
for (const auto &source_ebn : edge_based_node_info)
|
for (const auto &source_ebn : edge_based_node_info)
|
||||||
{
|
{
|
||||||
|
if (outgoing_edges.count(source_ebn.second.target_intersection) == 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Grab a copy of the geometry leading up to the intersection.
|
// Grab a copy of the geometry leading up to the intersection.
|
||||||
first_geometry =
|
if (source_ebn.second.is_geometry_forward)
|
||||||
facade->GetUncompressedForwardGeometry(source_ebn.second.packed_geometry_id);
|
{
|
||||||
|
first_geometry =
|
||||||
|
facade->GetUncompressedForwardGeometry(source_ebn.second.packed_geometry_id);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
first_geometry =
|
||||||
|
facade->GetUncompressedReverseGeometry(source_ebn.second.packed_geometry_id);
|
||||||
|
}
|
||||||
|
|
||||||
// We earlier saved the source and target intersection nodes for every road section.
|
// We earlier saved the source and target intersection nodes for every road section.
|
||||||
// We can use the target node to find all road sections that lead away from
|
// We can use the target node to find all road sections that lead away from
|
||||||
@ -479,7 +500,9 @@ Status TilePlugin::HandleRequest(const std::shared_ptr<datafacade::BaseDataFacad
|
|||||||
// Ignore u-turns for now
|
// Ignore u-turns for now
|
||||||
if (edge_based_node_info.at(target_ebn).target_intersection ==
|
if (edge_based_node_info.at(target_ebn).target_intersection ==
|
||||||
source_ebn.second.source_intersection)
|
source_ebn.second.source_intersection)
|
||||||
|
{
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Find the connection between our source road and the target node
|
// Find the connection between our source road and the target node
|
||||||
EdgeID smaller_edge_id = facade->FindSmallestEdge(
|
EdgeID smaller_edge_id = facade->FindSmallestEdge(
|
||||||
@ -530,15 +553,32 @@ Status TilePlugin::HandleRequest(const std::shared_ptr<datafacade::BaseDataFacad
|
|||||||
BOOST_ASSERT_MSG(!data.shortcut, "Connecting edge must not be a shortcut");
|
BOOST_ASSERT_MSG(!data.shortcut, "Connecting edge must not be a shortcut");
|
||||||
|
|
||||||
// This is the geometry leading away from the intersection
|
// This is the geometry leading away from the intersection
|
||||||
// (i.e. the geometry of the target edge-based-node)
|
// (i.e. the forward geometry of the target edge-based-node)
|
||||||
second_geometry = facade->GetUncompressedReverseGeometry(
|
|
||||||
edge_based_node_info.at(target_ebn).packed_geometry_id);
|
if (!edge_based_node_info.at(target_ebn).is_geometry_forward)
|
||||||
|
{
|
||||||
|
second_geometry = facade->GetUncompressedForwardGeometry(
|
||||||
|
edge_based_node_info.at(target_ebn).packed_geometry_id);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
second_geometry = facade->GetUncompressedReverseGeometry(
|
||||||
|
edge_based_node_info.at(target_ebn).packed_geometry_id);
|
||||||
|
}
|
||||||
|
|
||||||
// Now, calculate the sum of the weight of all the segments.
|
// Now, calculate the sum of the weight of all the segments.
|
||||||
forward_weight_vector =
|
if (source_ebn.second.is_geometry_forward)
|
||||||
facade->GetUncompressedForwardWeights(source_ebn.second.packed_geometry_id);
|
{
|
||||||
|
first_weight_vector = facade->GetUncompressedForwardWeights(
|
||||||
|
source_ebn.second.packed_geometry_id);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
first_weight_vector = facade->GetUncompressedReverseWeights(
|
||||||
|
source_ebn.second.packed_geometry_id);
|
||||||
|
}
|
||||||
const auto sum_node_weight = std::accumulate(
|
const auto sum_node_weight = std::accumulate(
|
||||||
forward_weight_vector.begin(), forward_weight_vector.end(), EdgeWeight{0});
|
first_weight_vector.begin(), first_weight_vector.end(), EdgeWeight{0});
|
||||||
|
|
||||||
// The edge.weight is the whole edge weight, which includes the turn cost.
|
// The edge.weight is the whole edge weight, which includes the turn cost.
|
||||||
// The turn cost is the edge.weight minus the sum of the individual road
|
// The turn cost is the edge.weight minus the sum of the individual road
|
||||||
@ -624,9 +664,15 @@ Status TilePlugin::HandleRequest(const std::shared_ptr<datafacade::BaseDataFacad
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Convert tile coordinates into mercator coordinates
|
// Convert tile coordinates into mercator coordinates
|
||||||
util::web_mercator::xyzToMercator(
|
double min_mercator_lon, min_mercator_lat, max_mercator_lon, max_mercator_lat;
|
||||||
parameters.x, parameters.y, parameters.z, min_lon, min_lat, max_lon, max_lat);
|
util::web_mercator::xyzToMercator(parameters.x,
|
||||||
const BBox tile_bbox{min_lon, min_lat, max_lon, max_lat};
|
parameters.y,
|
||||||
|
parameters.z,
|
||||||
|
min_mercator_lon,
|
||||||
|
min_mercator_lat,
|
||||||
|
max_mercator_lon,
|
||||||
|
max_mercator_lat);
|
||||||
|
const BBox tile_bbox{min_mercator_lon, min_mercator_lat, max_mercator_lon, max_mercator_lat};
|
||||||
|
|
||||||
// Protobuf serializes blocks when objects go out of scope, hence
|
// Protobuf serializes blocks when objects go out of scope, hence
|
||||||
// the extra scoping below.
|
// the extra scoping below.
|
||||||
|
Loading…
Reference in New Issue
Block a user