Run the area polygons in city.bin through the georust simplification.

Seattle drops from 3MB to 800KB with no discernable loss of quality.
This commit is contained in:
Dustin Carlino 2021-10-14 10:37:32 -07:00
parent eb4765fba7
commit 66c908913e
3 changed files with 40 additions and 29 deletions

View File

@ -2461,9 +2461,9 @@
"compressed_size_bytes": 3827096 "compressed_size_bytes": 3827096
}, },
"data/system/at/salzburg/city.bin": { "data/system/at/salzburg/city.bin": {
"checksum": "e26ef4a68d4b63c1fe0d9529218cc84f", "checksum": "1c0a87045a3c9eb40c1875fffcc98fcf",
"uncompressed_size_bytes": 693217, "uncompressed_size_bytes": 202549,
"compressed_size_bytes": 421901 "compressed_size_bytes": 96214
}, },
"data/system/at/salzburg/maps/east.bin": { "data/system/at/salzburg/maps/east.bin": {
"checksum": "caf18102dfc38bc42c2a03362791dff8", "checksum": "caf18102dfc38bc42c2a03362791dff8",
@ -2506,9 +2506,9 @@
"compressed_size_bytes": 11641511 "compressed_size_bytes": 11641511
}, },
"data/system/ch/zurich/city.bin": { "data/system/ch/zurich/city.bin": {
"checksum": "a6b42ad0e987ecce87468abf72469437", "checksum": "a209c74a10aa23d23feaf25e1c057efb",
"uncompressed_size_bytes": 578592, "uncompressed_size_bytes": 156946,
"compressed_size_bytes": 357426 "compressed_size_bytes": 73060
}, },
"data/system/ch/zurich/maps/center.bin": { "data/system/ch/zurich/maps/center.bin": {
"checksum": "c560f0906533100c3a6260457d9fdf9f", "checksum": "c560f0906533100c3a6260457d9fdf9f",
@ -2581,9 +2581,9 @@
"compressed_size_bytes": 19085911 "compressed_size_bytes": 19085911
}, },
"data/system/fr/charleville_mezieres/city.bin": { "data/system/fr/charleville_mezieres/city.bin": {
"checksum": "32a65b37219b93f2391b6bfe57950480", "checksum": "29833aaa77dec950d0fd05e413d783e8",
"uncompressed_size_bytes": 187433, "uncompressed_size_bytes": 54547,
"compressed_size_bytes": 115902 "compressed_size_bytes": 29267
}, },
"data/system/fr/charleville_mezieres/maps/secteur1.bin": { "data/system/fr/charleville_mezieres/maps/secteur1.bin": {
"checksum": "36eaa21ed50483932f5dfc580a8f0cd4", "checksum": "36eaa21ed50483932f5dfc580a8f0cd4",
@ -2616,9 +2616,9 @@
"compressed_size_bytes": 31127978 "compressed_size_bytes": 31127978
}, },
"data/system/fr/paris/city.bin": { "data/system/fr/paris/city.bin": {
"checksum": "776a26d6b917b8faaf15b90995d7c4b5", "checksum": "1928619334effd967ad2488ba34ed2c9",
"uncompressed_size_bytes": 2281178, "uncompressed_size_bytes": 528230,
"compressed_size_bytes": 1374614 "compressed_size_bytes": 233651
}, },
"data/system/fr/paris/maps/center.bin": { "data/system/fr/paris/maps/center.bin": {
"checksum": "4ff740ba65e93ac842908891417e851c", "checksum": "4ff740ba65e93ac842908891417e851c",
@ -3281,9 +3281,9 @@
"compressed_size_bytes": 696607 "compressed_size_bytes": 696607
}, },
"data/system/gb/leeds/city.bin": { "data/system/gb/leeds/city.bin": {
"checksum": "b1d557a7ffa14cda23b027fa8244353f", "checksum": "bef0f06947cd4a8dd410c9ad45cb31fb",
"uncompressed_size_bytes": 1857120, "uncompressed_size_bytes": 560554,
"compressed_size_bytes": 1139158 "compressed_size_bytes": 273160
}, },
"data/system/gb/leeds/maps/central.bin": { "data/system/gb/leeds/maps/central.bin": {
"checksum": "699a31916eee6bec07ab7b2b15e7e8f8", "checksum": "699a31916eee6bec07ab7b2b15e7e8f8",
@ -3826,9 +3826,9 @@
"compressed_size_bytes": 14789895 "compressed_size_bytes": 14789895
}, },
"data/system/ir/tehran/city.bin": { "data/system/ir/tehran/city.bin": {
"checksum": "58ed8c751092a59a28685ab73bca10c5", "checksum": "24b0f2ede5ebb1a483458a21ca349ade",
"uncompressed_size_bytes": 613751, "uncompressed_size_bytes": 201435,
"compressed_size_bytes": 371230 "compressed_size_bytes": 93099
}, },
"data/system/ir/tehran/maps/boundary0.bin": { "data/system/ir/tehran/maps/boundary0.bin": {
"checksum": "c7a6afa1074279b89ef82c49ab5ee854", "checksum": "c7a6afa1074279b89ef82c49ab5ee854",
@ -3951,9 +3951,9 @@
"compressed_size_bytes": 9163366 "compressed_size_bytes": 9163366
}, },
"data/system/us/mt_vernon/city.bin": { "data/system/us/mt_vernon/city.bin": {
"checksum": "173b2a66e9cdb9600e48e3c5f1506043", "checksum": "6c1ccd19661e9bd33c55577e68f1c509",
"uncompressed_size_bytes": 197361, "uncompressed_size_bytes": 37211,
"compressed_size_bytes": 109013 "compressed_size_bytes": 22578
}, },
"data/system/us/mt_vernon/maps/burlington.bin": { "data/system/us/mt_vernon/maps/burlington.bin": {
"checksum": "4c35286d6d4da772ecfd238c7497e0c5", "checksum": "4c35286d6d4da772ecfd238c7497e0c5",
@ -3966,9 +3966,9 @@
"compressed_size_bytes": 7426555 "compressed_size_bytes": 7426555
}, },
"data/system/us/nyc/city.bin": { "data/system/us/nyc/city.bin": {
"checksum": "93f972082d026257625bd7bc10a45b63", "checksum": "2d283a1ed31cba01ec51d723aa7e54ea",
"uncompressed_size_bytes": 892706, "uncompressed_size_bytes": 245298,
"compressed_size_bytes": 477936 "compressed_size_bytes": 103469
}, },
"data/system/us/nyc/maps/downtown_brooklyn.bin": { "data/system/us/nyc/maps/downtown_brooklyn.bin": {
"checksum": "a0dc47209daedd2896360378871fc307", "checksum": "a0dc47209daedd2896360378871fc307",
@ -4011,9 +4011,9 @@
"compressed_size_bytes": 18918169 "compressed_size_bytes": 18918169
}, },
"data/system/us/seattle/city.bin": { "data/system/us/seattle/city.bin": {
"checksum": "b147011af15d8dd38fbf9e3c90e29c7d", "checksum": "5e1d2c772ac15649f8b4e52ae1ad4588",
"uncompressed_size_bytes": 3085409, "uncompressed_size_bytes": 769593,
"compressed_size_bytes": 1952572 "compressed_size_bytes": 390647
}, },
"data/system/us/seattle/maps/arboretum.bin": { "data/system/us/seattle/maps/arboretum.bin": {
"checksum": "8aac379cc6f1f0931561cf7334f6e1b0", "checksum": "8aac379cc6f1f0931561cf7334f6e1b0",

View File

@ -5,6 +5,7 @@ use anyhow::Result;
use geo::algorithm::area::Area; use geo::algorithm::area::Area;
use geo::algorithm::convex_hull::ConvexHull; use geo::algorithm::convex_hull::ConvexHull;
use geo::algorithm::intersects::Intersects; use geo::algorithm::intersects::Intersects;
use geo::algorithm::simplifyvw::SimplifyVWPreserve;
use geo_booleanop::boolean::BooleanOp; use geo_booleanop::boolean::BooleanOp;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -544,6 +545,10 @@ impl Polygon {
} }
Ok(results) Ok(results)
} }
pub fn simplify(&self, epsilon: f64) -> Polygon {
to_geo(self.points()).simplifyvw_preserve(&epsilon).into()
}
} }
impl fmt::Display for Polygon { impl fmt::Display for Polygon {

View File

@ -6,6 +6,9 @@ use geom::{GPSBounds, LonLat, Polygon, Ring};
use crate::{AreaType, Map}; use crate::{AreaType, Map};
// Hand-tuned. I think this is in units of meters?
const POLYGON_EPSILON: f64 = 1000.0;
/// A single city (like Seattle) can be broken down into multiple boundary polygons (udistrict, /// A single city (like Seattle) can be broken down into multiple boundary polygons (udistrict,
/// ballard, downtown, etc). The load map screen uses this struct to display the entire city. /// ballard, downtown, etc). The load map screen uses this struct to display the entire city.
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
@ -46,7 +49,7 @@ impl City {
areas: huge_map areas: huge_map
.all_areas() .all_areas()
.iter() .iter()
.map(|a| (a.area_type, a.polygon.clone())) .map(|a| (a.area_type, a.polygon.simplify(POLYGON_EPSILON)))
.collect(), .collect(),
districts, districts,
} }
@ -99,7 +102,10 @@ impl City {
let pts = map.gps_bounds.convert_back(area.polygon.points()); let pts = map.gps_bounds.convert_back(area.polygon.points());
// TODO Holes in the polygons get lost // TODO Holes in the polygons get lost
if let Ok(ring) = Ring::new(gps_bounds.convert(&pts)) { if let Ok(ring) = Ring::new(gps_bounds.convert(&pts)) {
areas.push((area.area_type, ring.into_polygon())); areas.push((
area.area_type,
ring.into_polygon().simplify(POLYGON_EPSILON),
));
} }
} }
} }