1
1
use diesel:: sql_types:: Jsonb ;
2
2
use diesel:: sql_types:: Text ;
3
+ use geos:: geojson:: Geometry ;
4
+ use geos:: geojson:: Value as GeoJsonValue ;
3
5
use mvt:: Feature ;
4
6
use mvt:: GeomData ;
5
7
use mvt:: GeomEncoder ;
8
+ use mvt:: GeomType ;
6
9
use mvt:: Tile as MvtTile ;
7
10
use serde:: Deserialize ;
8
11
use serde:: Serialize ;
9
12
use serde_json:: Value as JsonValue ;
10
13
11
14
use crate :: map:: View ;
12
- use editoast_common:: geo_json:: GeoJson ;
13
15
14
16
#[ derive( Clone , QueryableByName , Queryable , Debug , Serialize , Deserialize ) ]
15
17
pub struct GeoJsonAndData {
@@ -19,33 +21,45 @@ pub struct GeoJsonAndData {
19
21
pub data : JsonValue ,
20
22
}
21
23
24
+ fn geometry_into_mvt_geom_type ( geometry : & Geometry ) -> GeomType {
25
+ match geometry. value {
26
+ GeoJsonValue :: Point { .. } => GeomType :: Point ,
27
+ GeoJsonValue :: MultiPoint { .. } => GeomType :: Point ,
28
+ GeoJsonValue :: LineString { .. } => GeomType :: Linestring ,
29
+ GeoJsonValue :: MultiLineString { .. } => GeomType :: Linestring ,
30
+ _ => panic ! ( "geometry type unsupported by editoast tiling system" ) ,
31
+ }
32
+ }
33
+
22
34
impl GeoJsonAndData {
23
35
/// Converts GeoJsonAndData as mvt GeomData
24
36
pub fn as_geom_data ( & self ) -> GeomData {
25
- let geo_json = serde_json:: from_str :: < GeoJson > ( & self . geo_json ) . unwrap ( ) ;
26
- let mut encoder = GeomEncoder :: new ( geo_json. get_geom_type ( ) ) ;
27
- match geo_json {
28
- GeoJson :: Point { coordinates } => {
29
- encoder. add_point ( coordinates. 0 , coordinates. 1 ) . unwrap ( ) ;
37
+ let geo_json = serde_json:: from_str :: < Geometry > ( & self . geo_json ) . unwrap ( ) ;
38
+ let geom_type = geometry_into_mvt_geom_type ( & geo_json) ;
39
+ let mut encoder = GeomEncoder :: new ( geom_type) ;
40
+ match geo_json. value {
41
+ GeoJsonValue :: Point ( point) => {
42
+ encoder. add_point ( point[ 0 ] , point[ 1 ] ) . unwrap ( ) ;
30
43
}
31
- GeoJson :: MultiPoint { coordinates } => {
32
- for ( x , y ) in coordinates {
33
- encoder. add_point ( x , y ) . unwrap ( ) ;
44
+ GeoJsonValue :: MultiPoint ( points ) => {
45
+ for point in points {
46
+ encoder. add_point ( point [ 0 ] , point [ 1 ] ) . unwrap ( ) ;
34
47
}
35
48
}
36
- GeoJson :: LineString { coordinates } => {
37
- for ( x , y ) in coordinates {
38
- encoder. add_point ( x , y ) . unwrap ( ) ;
49
+ GeoJsonValue :: LineString ( linestring ) => {
50
+ for point in linestring {
51
+ encoder. add_point ( point [ 0 ] , point [ 1 ] ) . unwrap ( ) ;
39
52
}
40
53
}
41
- GeoJson :: MultiLineString { coordinates } => {
42
- for line in coordinates {
43
- for ( x , y ) in line . iter ( ) {
44
- encoder. add_point ( * x , * y ) . unwrap ( ) ;
54
+ GeoJsonValue :: MultiLineString ( linestrings ) => {
55
+ for linestring in linestrings {
56
+ for point in linestring . iter ( ) {
57
+ encoder. add_point ( point [ 0 ] , point [ 1 ] ) . unwrap ( ) ;
45
58
}
46
59
encoder. complete_geom ( ) . unwrap ( ) ;
47
60
}
48
61
}
62
+ _ => panic ! ( "geometry type unsupported by editoast tiling system" ) ,
49
63
} ;
50
64
encoder. complete ( ) . unwrap ( ) . encode ( ) . unwrap ( )
51
65
}
0 commit comments