1
1
from drepr .executors .readers .geotiff import GeoTIFFReader
2
2
from drepr .executors .readers .netcdf import NetCDF4Reader
3
3
from drepr .executors .readers .np_dict import NPDictReader
4
+ from drepr .executors .readers .reader_container import ReaderContainer
5
+ from drepr .executors .readers .shapefile import ShapefileReader
4
6
from drepr .models import DRepr , ResourceType , RangeAlignment , PMap
5
7
import numpy as np
6
8
@@ -56,6 +58,10 @@ def execute(cls, ds_model: DRepr, resource_file: str):
56
58
reader = GeoTIFFReader .from_file (resource_file )
57
59
elif resource .type == ResourceType .NPDict :
58
60
reader = NPDictReader .from_file (resource_file )
61
+ elif resource .type == ResourceType .Shapefile :
62
+ reader = ShapefileReader .from_file (resource_file )
63
+ elif resource .type == ResourceType .Container :
64
+ reader = ReaderContainer .get_instance ().get (resource_file )
59
65
else :
60
66
raise NotImplementedError ()
61
67
@@ -64,12 +70,32 @@ def execute(cls, ds_model: DRepr, resource_file: str):
64
70
for preprocess_fn in ds_model .preprocessing :
65
71
if preprocess_fn .type == PreprocessingType .pmap :
66
72
steps = preprocess_fn .value .path .steps
67
- assert all (isinstance (step , IndexExpr ) for step in steps ), "Range selection should use numpy map"
68
-
69
- index = [step .val for step in steps ]
73
+ n_range_exprs = sum (int (not isinstance (step , IndexExpr )) for step in steps )
70
74
fn = PyExec .compile (preprocess_fn .value .code )
71
- value = fn .exec (reader .get_value (index ), index , context )
72
- reader .set_value (index , value )
75
+
76
+ if n_range_exprs == 0 :
77
+ index = [step .val for step in steps ]
78
+ value = fn .exec (reader .get_value (index ), index , context )
79
+ reader .set_value (index , value )
80
+ else :
81
+ # TODO: improve it
82
+ range_indices = [i for i in range (len (steps )) if isinstance (steps [i ], RangeExpr )]
83
+ index = [step .start if isinstance (step , RangeExpr ) else step .val for step in steps ]
84
+ if n_range_exprs == 1 :
85
+ range_idx = range_indices [0 ]
86
+ if steps [range_idx ].end is None :
87
+ if range_idx == 0 :
88
+ end = reader .len_range ()
89
+ else :
90
+ end = len (reader .get_value (index [:range_idx ]))
91
+ else :
92
+ end = steps [range_idx ].end
93
+ for i in range (steps [range_idx ].start , end , steps [range_idx ].step ):
94
+ index [range_idx ] = i
95
+ value = fn .exec (reader .get_value (index ), index , context )
96
+ reader .set_value (index , value )
97
+ else :
98
+ raise NotImplementedError ()
73
99
else :
74
100
raise Exception ("You found a bug" )
75
101
@@ -100,8 +126,10 @@ def execute(cls, ds_model: DRepr, resource_file: str):
100
126
count += 1
101
127
else :
102
128
step2dim .append (None )
129
+
103
130
new_attrs [f"dnode:{ attr .id } " ] = ArrayAttr (f"dnode:{ attr .id } " , attrs [attr .id ], path , step2dim , nodata )
104
131
else :
132
+ # TODO: this is wrong if the value are the list!
105
133
new_attrs [f"dnode:{ attr .id } " ] = ScalarAttr (f"dnode:{ attr .id } " , attrs [attr .id ])
106
134
# assert all(isinstance(step, IndexExpr) for step in attr.path.steps)
107
135
# index = [step.val for step in steps]
0 commit comments