Skip to content

Commit

Permalink
editoast: refactor layers model
Browse files Browse the repository at this point in the history
  • Loading branch information
Wadjetz committed Jul 15, 2024
1 parent e65899e commit b3ef0a7
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 25 deletions.
1 change: 1 addition & 0 deletions editoast/src/modelsv2/layers.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pub mod geo_json_and_data;
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
use diesel::sql_query;
use diesel::sql_types::Integer;
use diesel::sql_types::Jsonb;
use diesel::sql_types::Text;
use diesel_async::RunQueryDsl;
use editoast_models::DbConnection;
use editoast_models::EditoastModelsError;
use geos::geojson::Geometry;
use geos::geojson::Value as GeoJsonValue;
use mvt::Feature;
Expand All @@ -11,6 +16,7 @@ use serde::Deserialize;
use serde::Serialize;
use serde_json::Value as JsonValue;

use crate::map::Layer;
use crate::map::View;

#[derive(Clone, QueryableByName, Queryable, Debug, Serialize, Deserialize)]
Expand All @@ -21,17 +27,39 @@ pub struct GeoJsonAndData {
pub data: JsonValue,
}

fn geometry_into_mvt_geom_type(geometry: &Geometry) -> GeomType {
match geometry.value {
GeoJsonValue::Point { .. } => GeomType::Point,
GeoJsonValue::MultiPoint { .. } => GeomType::Point,
GeoJsonValue::LineString { .. } => GeomType::Linestring,
GeoJsonValue::MultiLineString { .. } => GeomType::Linestring,
_ => panic!("geometry type unsupported by editoast tiling system"),
#[derive(Debug)]
pub struct GeoPoint {
x: u64,
y: u64,
z: u64,
}

impl GeoPoint {
pub fn new(x: u64, y: u64, z: u64) -> Self {
Self { x, y, z }
}
}

impl GeoJsonAndData {
pub async fn get_records(
conn: &mut DbConnection,
layer: &Layer,
view: &View,
infra: i64,
geo_point: &GeoPoint,
) -> Result<Vec<GeoJsonAndData>, EditoastModelsError> {
let geo_json_query = get_geo_json_sql_query(&layer.table_name, view);
let records = sql_query(geo_json_query)
.bind::<Integer, _>(geo_point.z as i32)
.bind::<Integer, _>(geo_point.x as i32)
.bind::<Integer, _>(geo_point.y as i32)
.bind::<Integer, _>(infra as i32)
.get_results::<GeoJsonAndData>(conn)
.await?;

Ok(records)
}

/// Converts GeoJsonAndData as mvt GeomData
pub fn as_geom_data(&self) -> GeomData {
let geo_json = serde_json::from_str::<Geometry>(&self.geo_json).unwrap();
Expand Down Expand Up @@ -65,6 +93,16 @@ impl GeoJsonAndData {
}
}

fn geometry_into_mvt_geom_type(geometry: &Geometry) -> GeomType {
match geometry.value {
GeoJsonValue::Point { .. } => GeomType::Point,
GeoJsonValue::MultiPoint { .. } => GeomType::Point,
GeoJsonValue::LineString { .. } => GeomType::Linestring,
GeoJsonValue::MultiLineString { .. } => GeomType::Linestring,
_ => panic!("geometry type unsupported by editoast tiling system"),
}
}

/// Adds tags to an MVT feature
///
/// tags must be flattened as mvt tags are only one level depth
Expand Down
1 change: 1 addition & 0 deletions editoast/src/modelsv2/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ pub mod electrical_profiles;
pub mod fixtures;
pub mod infra;
pub mod infra_objects;
pub mod layers;
pub mod light_rolling_stock;
// We allow unused until models is moved to a separate crate
pub mod pagination;
Expand Down
25 changes: 7 additions & 18 deletions editoast/src/views/layers/mod.rs → editoast/src/views/layers.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
mod mvt_utils;

use std::collections::HashMap;

use actix_web::get;
Expand All @@ -8,13 +6,8 @@ use actix_web::web::Json;
use actix_web::web::Path;
use actix_web::web::Query;
use actix_web::HttpResponse;
use diesel::sql_query;
use diesel::sql_types::Integer;
use diesel_async::RunQueryDsl;
use editoast_derive::EditoastError;
use mvt_utils::create_and_fill_mvt_tile;
use mvt_utils::get_geo_json_sql_query;
use mvt_utils::GeoJsonAndData;
use editoast_models::DbConnectionPoolV2;
use redis::AsyncCommands;
use serde::Deserialize;
use serde::Serialize;
Expand All @@ -30,8 +23,10 @@ use crate::map::get_view_cache_prefix;
use crate::map::Layer;
use crate::map::MapLayers;
use crate::map::Tile;
use crate::modelsv2::layers::geo_json_and_data::create_and_fill_mvt_tile;
use crate::modelsv2::layers::geo_json_and_data::GeoJsonAndData;
use crate::modelsv2::layers::geo_json_and_data::GeoPoint;
use crate::RedisClient;
use editoast_models::DbConnectionPoolV2;

crate::routes! {
"/layers" => {
Expand Down Expand Up @@ -206,15 +201,9 @@ async fn cache_and_get_mvt_tile(
.body(value));
}

let geo_json_query = get_geo_json_sql_query(&layer.table_name, view);
let mut conn = db_pool.get().await?;
let records = sql_query(geo_json_query)
.bind::<Integer, _>(z as i32)
.bind::<Integer, _>(x as i32)
.bind::<Integer, _>(y as i32)
.bind::<Integer, _>(infra as i32)
.get_results::<GeoJsonAndData>(&mut conn)
.await?;
let conn = &mut db_pool.get().await?;
let records =
GeoJsonAndData::get_records(conn, layer, view, infra, &GeoPoint::new(z, x, y)).await?;

let mvt_bytes: Vec<u8> = create_and_fill_mvt_tile(layer_slug, records)
.to_bytes()
Expand Down

0 comments on commit b3ef0a7

Please sign in to comment.