Skip to content

Commit

Permalink
Expand ToGeo trait functions
Browse files Browse the repository at this point in the history
  • Loading branch information
pka committed Aug 6, 2023
1 parent 7b24931 commit 08d8d5f
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 22 deletions.
25 changes: 23 additions & 2 deletions geozero/src/mvt/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,32 @@ pub(crate) mod conversion {
/// Convert to MVT geometry.
pub trait ToMvt {
/// Convert to MVT geometry.
fn to_mvt(&self) -> Result<tile::Feature>;
fn to_mvt(
&self,
tile_size: u32,
left: f64,
bottom: f64,
right: f64,
top: f64,
) -> Result<tile::Feature>;
/// Convert to MVT geometry with geometries in tile coordinate system.
fn to_mvt_unscaled(&self) -> Result<tile::Feature>;
}

impl<T: GeozeroGeometry> ToMvt for T {
fn to_mvt(&self) -> Result<tile::Feature> {
fn to_mvt(
&self,
tile_size: u32,
left: f64,
bottom: f64,
right: f64,
top: f64,
) -> Result<tile::Feature> {
let mut mvt = MvtWriter::new(tile_size, left, bottom, right, top);
self.process_geom(&mut mvt)?;
Ok(mvt.feature)
}
fn to_mvt_unscaled(&self) -> Result<tile::Feature> {
let mut mvt = MvtWriter::default();
self.process_geom(&mut mvt)?;
Ok(mvt.feature)
Expand Down
25 changes: 12 additions & 13 deletions geozero/src/mvt/mvt_writer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ enum LineState {
}

impl MvtWriter {
pub fn new(tile_size: u16, left: f64, bottom: f64, right: f64, top: f64) -> MvtWriter {
pub fn new(tile_size: u32, left: f64, bottom: f64, right: f64, top: f64) -> MvtWriter {
MvtWriter {
tile_size: Some(tile_size as f64),
left,
Expand Down Expand Up @@ -407,29 +407,29 @@ mod test {
use super::*;
use crate::geojson::conversion::ToJson;
use crate::geojson::GeoJson;
use crate::{GeozeroGeometry, ToMvt};
use crate::ToMvt;
use serde_json::json;

// https://github.com/mapbox/vector-tile-spec/tree/master/2.1#435-example-geometry-encodings

#[test]
fn point_geom() {
let geojson = GeoJson(r#"{"type": "Point", "coordinates": [25, 17]}"#);
let mvt = geojson.to_mvt().unwrap();
let mvt = geojson.to_mvt_unscaled().unwrap();
assert_eq!(mvt.geometry, [9, 50, 34]);
}

#[test]
fn multipoint_geom() {
let geojson = GeoJson(r#"{"type": "MultiPoint", "coordinates": [[5, 7], [3, 2]]}"#);
let mvt = geojson.to_mvt().unwrap();
let mvt = geojson.to_mvt_unscaled().unwrap();
assert_eq!(mvt.geometry, [17, 10, 14, 3, 9]);
}

#[test]
fn line_geom() {
let geojson = GeoJson(r#"{"type": "LineString", "coordinates": [[2,2], [2,10], [10,10]]}"#);
let mvt = geojson.to_mvt().unwrap();
let mvt = geojson.to_mvt_unscaled().unwrap();
assert_eq!(mvt.geometry, [9, 4, 4, 18, 0, 16, 16, 0]);
}

Expand All @@ -438,7 +438,7 @@ mod test {
let geojson = GeoJson(
r#"{"type": "MultiLineString", "coordinates": [[[2,2], [2,10], [10,10]],[[1,1],[3,5]]]}"#,
);
let mvt = geojson.to_mvt().unwrap();
let mvt = geojson.to_mvt_unscaled().unwrap();
assert_eq!(
mvt.geometry,
[9, 4, 4, 18, 0, 16, 16, 0, 9, 17, 17, 10, 4, 8]
Expand All @@ -449,7 +449,7 @@ mod test {
fn polygon_geom() {
let geojson =
GeoJson(r#"{"type": "Polygon", "coordinates": [[[3, 6], [8, 12], [20, 34], [3, 6]]]}"#);
let mvt = geojson.to_mvt().unwrap();
let mvt = geojson.to_mvt_unscaled().unwrap();
assert_eq!(mvt.geometry, [9, 6, 12, 18, 10, 12, 24, 44, 15]);
}

Expand All @@ -472,7 +472,7 @@ mod test {
]
}"#;
let geojson = GeoJson(geojson);
let mvt = geojson.to_mvt().unwrap();
let mvt = geojson.to_mvt_unscaled().unwrap();
assert_eq!(
mvt.geometry,
[
Expand All @@ -485,7 +485,7 @@ mod test {
#[cfg(feature = "with-geo")]
fn geo_screen_coords_to_mvt() -> Result<()> {
let geo: geo_types::Geometry<f64> = geo_types::Point::new(25.0, 17.0).into();
let mvt = geo.to_mvt()?;
let mvt = geo.to_mvt_unscaled()?;
assert_eq!(mvt.geometry, [9, 50, 34]);
Ok(())
}
Expand All @@ -494,10 +494,9 @@ mod test {
#[cfg(feature = "with-geo")]
fn geo_to_mvt() -> Result<()> {
let geo: geo_types::Geometry<f64> = geo_types::Point::new(960000.0, 6002729.0).into();
let mut mvt = MvtWriter::new(256, 958826.08, 5987771.04, 978393.96, 6007338.92);
geo.process_geom(&mut mvt)?;
assert_eq!(mvt.geometry().geometry, [9, 30, 122]);
let geojson = mvt.geometry().to_json()?;
let mvt = geo.to_mvt(256, 958826.08, 5987771.04, 978393.96, 6007338.92)?;
assert_eq!(mvt.geometry, [9, 30, 122]);
let geojson = mvt.to_json()?;
assert_eq!(
serde_json::from_str::<serde_json::Value>(&geojson).unwrap(),
json!({
Expand Down
15 changes: 8 additions & 7 deletions geozero/tests/mvt.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use geozero::mvt::{Message, MvtWriter, Tile};
use geozero::mvt::{Message, Tile};
use geozero::{
ColumnValue, CoordDimensions, FeatureProcessor, GeomProcessor, GeozeroDatasource,
GeozeroGeometry, PropertyProcessor, ToJson, ToMvt,
PropertyProcessor, ToJson, ToMvt,
};
use serde_json::json;
use std::env;
Expand All @@ -11,17 +11,18 @@ use std::sync::Mutex;
#[test]
fn geo_screen_coords_to_mvt() {
let geo: geo_types::Geometry<f64> = geo_types::Point::new(25.0, 17.0).into();
let mvt = geo.to_mvt().unwrap();
let mvt = geo.to_mvt_unscaled().unwrap();
assert_eq!(mvt.geometry, [9, 50, 34]);
}

#[test]
fn geo_to_mvt() {
let geo: geo_types::Geometry<f64> = geo_types::Point::new(960000.0, 6002729.0).into();
let mut mvt = MvtWriter::new(256, 958826.08, 5987771.04, 978393.96, 6007338.92);
geo.process_geom(&mut mvt).unwrap();
assert_eq!(mvt.geometry().geometry, [9, 30, 122]);
let geojson = mvt.geometry().to_json().unwrap();
let mvt = geo
.to_mvt(256, 958826.08, 5987771.04, 978393.96, 6007338.92)
.unwrap();
assert_eq!(mvt.geometry, [9, 30, 122]);
let geojson = mvt.to_json().unwrap();
assert_eq!(
serde_json::from_str::<serde_json::Value>(&geojson).unwrap(),
json!({
Expand Down

0 comments on commit 08d8d5f

Please sign in to comment.