From 1841d9933d5f52f3d62d498cceea5fc84a622783 Mon Sep 17 00:00:00 2001 From: Maximilian Ammann Date: Thu, 2 Dec 2021 16:20:26 +0100 Subject: [PATCH] Cleanup and fix parsing of linestrings --- libs/vector_tile/Cargo.toml | 4 +-- libs/vector_tile/src/encoding.rs | 61 +++++++++++++++----------------- libs/vector_tile/src/geometry.rs | 2 -- libs/vector_tile/src/grid.rs | 55 ++++++++++------------------ libs/vector_tile/src/tests.rs | 7 ++-- 5 files changed, 51 insertions(+), 78 deletions(-) diff --git a/libs/vector_tile/Cargo.toml b/libs/vector_tile/Cargo.toml index cfaead04..8531cf36 100644 --- a/libs/vector_tile/Cargo.toml +++ b/libs/vector_tile/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "vector-tile" version = "0.1.0" -description = "A library decoding vector tiles" +description = "A library for decoding vector tiles" readme = "README.md" categories = ["encoding"] edition = "2021" @@ -9,8 +9,6 @@ build = "build.rs" [dependencies] log = "0.4" -num-traits = "0.2" -pointy = "0.3" protobuf = "2.25" tile-grid = "0.3" diff --git a/libs/vector_tile/src/encoding.rs b/libs/vector_tile/src/encoding.rs index 7f2d17fb..e33f0571 100644 --- a/libs/vector_tile/src/encoding.rs +++ b/libs/vector_tile/src/encoding.rs @@ -72,20 +72,18 @@ impl Decode for Vec { let command = self[i] & 0x7; if command != CMD_MOVE_TO { - // FIXME: ERROR + // FIXME: Not allowed in Points + panic!("error") } let count = (self[i] >> 3) as usize; i += 1; - for parameter in 0..count { - points.push(Point::new( - self[i + parameter].zagzig(), - self[i + parameter + 1].zagzig(), - )); - } + for _ in 0..count { + points.push(Point::new(self[i].zagzig(), self[i + 1].zagzig())); - i += count * CMD_MOVE_TO_PARAMETERS; + i += CMD_MOVE_TO_PARAMETERS; + } } if points.len() == 1 { @@ -109,34 +107,35 @@ impl Decode for Vec { let count = (self[i] >> 3) as usize; i += 1; - for parameter in 0..count { - match command { - CMD_MOVE_TO => { + match command { + CMD_MOVE_TO => { + for _ in 0..count { + let x_index = i; commands.push(Command::MoveTo(MoveTo { - x: self[i + parameter].zagzig(), - y: self[i + parameter + 1].zagzig(), + x: self[x_index].zagzig(), + y: self[x_index + 1].zagzig(), })); + i += CMD_MOVE_TO_PARAMETERS; } - CMD_LINE_TO => { + } + CMD_LINE_TO => { + for _ in 0..count { + let x_index = i; commands.push(Command::LineTo(LineTo { - x: self[i + parameter].zagzig(), - y: self[i + parameter + 1].zagzig(), + x: self[x_index].zagzig(), + y: self[x_index + 1].zagzig(), })); + i += CMD_MOVE_TO_PARAMETERS; } - CMD_CLOSE_PATH => { - commands.push(Command::Close); - } - _ => {} + } + CMD_CLOSE_PATH => { + // FIXME: Not allowed in LineStrings + panic!("error") + } + _ => { + panic!("error") } } - - i += count - * match command { - CMD_MOVE_TO => CMD_MOVE_TO_PARAMETERS, - CMD_LINE_TO => CMD_LINE_TO_PARAMETERS, - CMD_CLOSE_PATH => CMD_CLOSE_PATH_PARAMETERS, - _ => 0, - }; } GeometryLineString { commands } @@ -157,7 +156,7 @@ impl Decode for Vec { match command { CMD_MOVE_TO => { - for parameter in 0..count { + for _ in 0..count { let x_index = i; commands.push(Command::MoveTo(MoveTo { x: self[x_index].zagzig(), @@ -167,7 +166,7 @@ impl Decode for Vec { } } CMD_LINE_TO => { - for parameter in 0..count { + for _ in 0..count { let x_index = i; commands.push(Command::LineTo(LineTo { x: self[x_index].zagzig(), @@ -186,8 +185,6 @@ impl Decode for Vec { panic!("error") } } - - } GeometryPolygon { commands } diff --git a/libs/vector_tile/src/geometry.rs b/libs/vector_tile/src/geometry.rs index e776df02..d3b6bfa2 100644 --- a/libs/vector_tile/src/geometry.rs +++ b/libs/vector_tile/src/geometry.rs @@ -1,5 +1,3 @@ -use num_traits::Num; - type Number = i32; #[derive(Debug)] diff --git a/libs/vector_tile/src/grid.rs b/libs/vector_tile/src/grid.rs index 3e15d353..f497b99d 100644 --- a/libs/vector_tile/src/grid.rs +++ b/libs/vector_tile/src/grid.rs @@ -1,6 +1,6 @@ use tile_grid::{extent_wgs84_to_merc, Extent, Grid, GridIterator, Origin, Unit}; -fn web_mercator() -> Grid { +pub fn google_mercator() -> Grid { Grid::new( 256, 256, @@ -12,7 +12,6 @@ fn web_mercator() -> Grid { }, 3857, Unit::Meters, - // for calculation see fn test_resolutions vec![ 156543.0339280410, 78271.5169640205, @@ -42,45 +41,27 @@ fn web_mercator() -> Grid { ) } -/// z, x, z -pub fn get_tile_coordinates_bavaria() -> Vec<(u8, u32, u32)> { - let grid = web_mercator(); +/// +/// Returns coordinates for tiles within bavaria according to the specified grid. +/// The grid is responsible for defining the coordinate system. For example whether +/// [Slippy map tilenames](https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames) (also known as +/// XYZ) or [TMS](https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification#TileMap_Diagram) is +/// used. +/// +/// ## Additional Resources: +/// +/// * https://www.maptiler.com/google-maps-coordinates-tile-bounds-projection +/// * https://gist.github.com/maptiler/fddb5ce33ba995d5523de9afdf8ef118 +pub fn tile_coordinates_bavaria(grid: &Grid, zoom: u8) -> Vec<(u8, u32, u32)> { let tile_limits = grid.tile_limits( extent_wgs84_to_merc(&Extent { - minx: 10.0, - miny: 48.0, - maxx: 12.0, - maxy: 50.0, + minx: 8.9771580802, + miny: 47.2703623267, + maxx: 13.8350427083, + maxy: 50.5644529365, }), 0, ); - println!("{:?}", grid.tile_extent(0, 0, 0)); - println!("{:?}", grid.tile_extent(33, 21, 6)); - println!("{:?}", grid.tile_extent_xyz(0, 0, 0)); - - let z = 6; - let griditer = GridIterator::new(z, z, tile_limits); - griditer.collect() -} - -pub fn get_tile_coordinates_tutzing() -> Vec<(u8, u32, u32)> { - let grid = web_mercator(); - let tile_limits = grid.tile_limits( - extent_wgs84_to_merc(&Extent { - minx: 11.2772666, - miny: 47.9125117, - maxx: 11.2772666, - maxy: 47.9125117, - }), - 1, - ); - - println!("{:?}", grid.tile_extent(0, 0, 0)); - println!("{:?}", grid.tile_extent(33, 21, 6)); - println!("{:?}", grid.tile_extent_xyz(0, 0, 0)); - - let z = 12; - let griditer = GridIterator::new(z, z, tile_limits); - griditer.collect() + GridIterator::new(zoom, zoom, tile_limits).collect() } diff --git a/libs/vector_tile/src/tests.rs b/libs/vector_tile/src/tests.rs index fe4e42cb..a8ad9e3a 100644 --- a/libs/vector_tile/src/tests.rs +++ b/libs/vector_tile/src/tests.rs @@ -4,17 +4,16 @@ use std::io::BufReader; use protobuf::Message; use crate::encoding::Decode; -use crate::grid::get_tile_coordinates_bavaria; +use crate::grid::{GOOGLE_MERCATOR, tile_coordinates_bavaria}; use crate::parse_tile; use crate::protos::vector_tile::Tile; #[test] fn test_parsing_europe_pbf() { - let tile = parse_tile("libs/vector_tile/test_data/europe.pbf"); - //println!("{:?}", tile); + parse_tile("libs/vector_tile/test_data/europe.pbf"); } #[test] fn test_tile_coordinates_bavaria() { - println!("{:?}", get_tile_coordinates_bavaria()); + println!("{:?}", tile_coordinates_bavaria(&GOOGLE_MERCATOR, 6)); }