Fix tile encoding
This commit is contained in:
		
							parent
							
								
									a32f8a6a59
								
							
						
					
					
						commit
						e737700c7b
					
				| @ -651,6 +651,20 @@ void encodeVectorTile(const datafacade::ContiguousInternalMemoryDataFacadeBase & | |||||||
|         // for tiles of z<16, and tiles that don't show any intersections)
 |         // for tiles of z<16, and tiles that don't show any intersections)
 | ||||||
|         if (!all_turn_data.empty()) |         if (!all_turn_data.empty()) | ||||||
|         { |         { | ||||||
|  |             // we need to pre-encode all values here because we need the full offsets later
 | ||||||
|  |             // for encoding the actual features.
 | ||||||
|  |             std::vector<std::tuple<util::Coordinate, unsigned, unsigned, unsigned>> encoded_turn_data(all_turn_data.size()); | ||||||
|  |             std::transform(all_turn_data.begin(), | ||||||
|  |                            all_turn_data.end(), | ||||||
|  |                            encoded_turn_data.begin(), | ||||||
|  |                            [&](const routing_algorithms::TurnData &t) { | ||||||
|  |                                auto angle_idx = use_point_int_value(t.in_angle); | ||||||
|  |                                auto turn_idx = use_point_int_value(t.turn_angle); | ||||||
|  |                                auto weight_idx = use_point_float_value(t.weight / | ||||||
|  |                                                      10.0); // Note conversion to float here
 | ||||||
|  |                                return std::make_tuple(t.coordinate, angle_idx, turn_idx, weight_idx); | ||||||
|  |                            }); | ||||||
|  | 
 | ||||||
|             // Now write the points layer for turn penalty data:
 |             // Now write the points layer for turn penalty data:
 | ||||||
|             // Add a layer object to the PBF stream.  3=='layer' from the vector tile spec
 |             // Add a layer object to the PBF stream.  3=='layer' from the vector tile spec
 | ||||||
|             // (2.1)
 |             // (2.1)
 | ||||||
| @ -668,7 +682,7 @@ void encodeVectorTile(const datafacade::ContiguousInternalMemoryDataFacadeBase & | |||||||
|                 // Helper function to encode a new point feature on a vector tile.
 |                 // Helper function to encode a new point feature on a vector tile.
 | ||||||
|                 const auto encode_tile_point = [&]( |                 const auto encode_tile_point = [&]( | ||||||
|                     const FixedPoint &tile_point, |                     const FixedPoint &tile_point, | ||||||
|                     const routing_algorithms::TurnData &point_turn_data) { |                     const auto &point_turn_data) { | ||||||
|                     protozero::pbf_writer feature_writer(point_layer_writer, |                     protozero::pbf_writer feature_writer(point_layer_writer, | ||||||
|                                                          util::vector_tile::FEATURE_TAG); |                                                          util::vector_tile::FEATURE_TAG); | ||||||
|                     // Field 3 is the "geometry type" field.  Value 1 is "point"
 |                     // Field 3 is the "geometry type" field.  Value 1 is "point"
 | ||||||
| @ -677,23 +691,17 @@ void encodeVectorTile(const datafacade::ContiguousInternalMemoryDataFacadeBase & | |||||||
|                         util::vector_tile::GEOMETRY_TYPE_POINT);                // geometry type
 |                         util::vector_tile::GEOMETRY_TYPE_POINT);                // geometry type
 | ||||||
|                     feature_writer.add_uint64(util::vector_tile::ID_TAG, id++); // id
 |                     feature_writer.add_uint64(util::vector_tile::ID_TAG, id++); // id
 | ||||||
|                     { |                     { | ||||||
|                         const auto in_angle_offset = use_point_int_value(point_turn_data.in_angle); |  | ||||||
|                         const auto turn_angle_offset = |  | ||||||
|                             use_point_int_value(point_turn_data.turn_angle); |  | ||||||
|                         const auto weight_offset = use_point_float_value( |  | ||||||
|                             point_turn_data.weight / 10.0); // Note conversion to float here
 |  | ||||||
| 
 |  | ||||||
|                         // Write out the 3 properties we want on the feature.  These
 |                         // Write out the 3 properties we want on the feature.  These
 | ||||||
|                         // refer to indexes in the properties lookup table, which we
 |                         // refer to indexes in the properties lookup table, which we
 | ||||||
|                         // add to the tile after we add all features.
 |                         // add to the tile after we add all features.
 | ||||||
|                         protozero::packed_field_uint32 field( |                         protozero::packed_field_uint32 field( | ||||||
|                             feature_writer, util::vector_tile::FEATURE_ATTRIBUTES_TAG); |                             feature_writer, util::vector_tile::FEATURE_ATTRIBUTES_TAG); | ||||||
|                         field.add_element(0); // "bearing_in" tag key offset
 |                         field.add_element(0); // "bearing_in" tag key offset
 | ||||||
|                         field.add_element(in_angle_offset); |                         field.add_element(std::get<1>(point_turn_data)); | ||||||
|                         field.add_element(1); // "turn_angle" tag key offset
 |                         field.add_element(1); // "turn_angle" tag key offset
 | ||||||
|                         field.add_element(turn_angle_offset); |                         field.add_element(std::get<2>(point_turn_data)); | ||||||
|                         field.add_element(2); // "cost" tag key offset
 |                         field.add_element(2); // "cost" tag key offset
 | ||||||
|                         field.add_element(used_point_ints.size() + weight_offset); |                         field.add_element(used_point_ints.size() + std::get<3>(point_turn_data)); | ||||||
|                     } |                     } | ||||||
|                     { |                     { | ||||||
|                         // Add the geometry as the last field in this feature
 |                         // Add the geometry as the last field in this feature
 | ||||||
| @ -704,9 +712,9 @@ void encodeVectorTile(const datafacade::ContiguousInternalMemoryDataFacadeBase & | |||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 // Loop over all the turns we found and add them as features to the layer
 |                 // Loop over all the turns we found and add them as features to the layer
 | ||||||
|                 for (const auto &turndata : all_turn_data) |                 for (const auto &turndata : encoded_turn_data) | ||||||
|                 { |                 { | ||||||
|                     const auto tile_point = coordinatesToTilePoint(turndata.coordinate, tile_bbox); |                     const auto tile_point = coordinatesToTilePoint(std::get<0>(turndata), tile_bbox); | ||||||
|                     if (!boost::geometry::within(point_t(tile_point.x, tile_point.y), clip_box)) |                     if (!boost::geometry::within(point_t(tile_point.x, tile_point.y), clip_box)) | ||||||
|                     { |                     { | ||||||
|                         continue; |                         continue; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user