@@ -561,10 +561,12 @@ def filter_bbox(
561
561
562
562
def filter_spatial (self , geometries ):
563
563
crs = None
564
+ resolution = None
564
565
if len (self .metadata .spatial_dimensions ) > 0 :
565
566
spatial_dim = self .metadata .spatial_dimensions [0 ]
566
567
crs = spatial_dim .crs
567
- geometries , bbox = self ._normalize_geometry (geometries , target_crs = crs )
568
+ resolution = spatial_dim .step
569
+ geometries , bbox = self ._normalize_geometry (geometries , target_crs = crs , target_resolution = resolution )
568
570
cube = self .filter_bbox (** bbox , operation = "weak_spatial_extent" )
569
571
return cube ._process (operation = "filter_spatial" , arguments = {"geometries" : geometries })
570
572
@@ -622,19 +624,25 @@ def aggregate_spatial(
622
624
cube = self
623
625
if not geoms_is_empty :
624
626
crs = None
627
+ resolution = None
625
628
if len (self .metadata .spatial_dimensions ) > 0 :
626
629
spatial_dim = self .metadata .spatial_dimensions [0 ]
630
+ resolution = spatial_dim .step
627
631
crs = spatial_dim .crs
628
- geometries , bbox = self ._normalize_geometry (geometries , target_crs = crs )
632
+ geometries , bbox = self ._normalize_geometry (geometries , target_crs = crs , target_resolution = resolution )
629
633
cube = self .filter_bbox (** bbox , operation = "weak_spatial_extent" )
630
634
return cube ._process (operation = "aggregate_spatial" , arguments = {"geometries" : geometries })
631
635
632
636
def _normalize_geometry (
633
- self , geometries , target_crs = None
637
+ self , geometries , target_crs = None , target_resolution = None
634
638
) -> Tuple [Union [DriverVectorCube , DelayedVector , BaseGeometry ], dict ]:
635
639
"""
636
640
Helper to preprocess geometries (as used in aggregate_spatial and mask_polygon)
637
641
and extract bbox (e.g. for filter_bbox)
642
+
643
+ :param geometries: geometries as BaseGeometry, GeoJSON dict, DelayedVector or DriverVectorCube
644
+ :param target_crs: target CRS to reproject geometries to
645
+ :param target_resolution: target resolution for geometries, in units of the target CRS, None by default which will use 10m
638
646
"""
639
647
_log .debug (f"_normalize_geometry with { type (geometries )} " )
640
648
# TODO #71 #114 EP-3981 normalize to vector cube instead of GeometryCollection
@@ -660,21 +668,25 @@ def _normalize_geometry(
660
668
661
669
if len (points ) > 0 :
662
670
point_hull = reproject_geometry (shapely .geometry .MultiPoint (points ).envelope ,geometries .get_crs (),CRS .from_user_input (target_crs ))
663
- loi_point = point_hull .representative_point ()
664
- bufferer = GeometryBufferer .from_meter_for_crs (
665
- distance = 10 , crs = target_crs , loi = (loi_point .x ,loi_point .y ), loi_crs = target_crs
666
- )
667
- buffered_points = bufferer .buffer (point_hull )
671
+ buffered_points = None
672
+ if target_resolution == None :
673
+ loi_point = point_hull .representative_point ()
674
+ bufferer = GeometryBufferer .from_meter_for_crs (
675
+ distance = 10 , crs = target_crs , loi = (loi_point .x ,loi_point .y ), loi_crs = target_crs
676
+ )
677
+ buffered_points = bufferer .buffer (point_hull )
678
+ else :
679
+ buffered_points = point_hull .buffer (distance = target_resolution )
668
680
other_hull = other_hull .union (buffered_points )
669
681
bbox = other_hull .bounds
670
682
crs = target_crs
671
683
else :
672
684
bbox = geometries .buffer_points (distance = 10 ).get_bounding_box ()
673
685
crs = geometries .get_crs_str ()
674
686
elif isinstance (geometries , dict ):
675
- return self ._normalize_geometry (geojson_to_geometry (geometries ))
687
+ return self ._normalize_geometry (geojson_to_geometry (geometries ), target_crs , target_resolution )
676
688
elif isinstance (geometries , str ):
677
- return self ._normalize_geometry (DelayedVector (geometries ))
689
+ return self ._normalize_geometry (DelayedVector (geometries ), target_crs , target_resolution )
678
690
elif isinstance (geometries , DelayedVector ):
679
691
bbox = geometries .bounds
680
692
elif isinstance (geometries , shapely .geometry .base .BaseGeometry ):
0 commit comments