18 MODULE vol7d_serialize_geojson_class
19 use,
INTRINSIC :: iso_c_binding
29 CHARACTER(len=8),
PUBLIC :: variant=
'simple' 31 PROCEDURE :: vol7d_serialize_optionparser
32 PROCEDURE :: vol7d_serialize_parse
33 PROCEDURE :: vol7d_serialize_export
34 END TYPE vol7d_serialize_geojson
37 PUBLIC vol7d_serialize_geojson, vol7d_serialize_geojson_new
41 FUNCTION vol7d_serialize_geojson_new()
RESULT(this)
42 TYPE(vol7d_serialize_geojson) :: this
44 this%vol7d_serialize = vol7d_serialize_new()
46 END FUNCTION vol7d_serialize_geojson_new
49 SUBROUTINE vol7d_serialize_optionparser(this, opt, ext)
50 CLASS(vol7d_serialize_geojson),
INTENT(inout) :: this
51 TYPE(optionparser),
INTENT(inout),
OPTIONAL :: opt
52 CHARACTER(len=*),
INTENT(in),
OPTIONAL :: ext
54 IF (
PRESENT(ext))
THEN 61 this%column=
'ana,time,timerange,level,network,var,value' 62 this%loop=
'time,timerange,level,var,ana,network' 70 help=
'variant of geojson output, accepted values are ''simple'' and ''rich''')
72 END SUBROUTINE vol7d_serialize_optionparser
75 SUBROUTINE vol7d_serialize_parse(this, category)
76 CLASS(vol7d_serialize_geojson),
INTENT(inout) :: this
77 TYPE(l4f_handle),
INTENT(in),
OPTIONAL :: category
80 IF (this%variant /=
'simple' .AND. this%variant /=
'rich')
THEN 81 IF (
PRESENT(category))
THEN 82 CALL l4f_category_log(category, l4f_error,
'error in command-line parameters')
84 ' not valid for --'//trim(this%ext)//
'-variant parameter.')
89 CALL this%vol7d_serialize%vol7d_serialize_parse(category)
91 END SUBROUTINE vol7d_serialize_parse
94 SUBROUTINE vol7d_serialize_export(this, iun)
95 CLASS(vol7d_serialize_geojson),
INTENT(inout) :: this
96 INTEGER,
INTENT(in),
TARGET :: iun
99 TYPE(vol7d_serialize_iterline) :: linei
100 TYPE(vol7d_serialize_itercol) :: coli
102 WRITE(iun,
'(A)')
'{"type":"FeatureCollection", "features":[' 105 linei = this%vol7d_serialize_iterline_new()
107 CALL linei%vol7d_serialize_iterline_set_callback(vol7d_ana_callback_gj, &
108 vol7d_time_callback_gj, vol7d_level_callback_gj, &
109 vol7d_timerange_callback_gj, vol7d_network_callback_gj, &
110 vol7d_var_callback_gj, vol7d_attr_callback_gj, &
111 vol7d_valuer_callback_gj, vol7d_valued_callback_gj, &
112 vol7d_valuei_callback_gj, vol7d_valueb_callback_gj, vol7d_valuec_callback_gj, &
113 vol7d_valuer_attr_callback_gj, vol7d_valued_attr_callback_gj, &
114 vol7d_valuei_attr_callback_gj, vol7d_valueb_attr_callback_gj, vol7d_valuec_attr_callback_gj)
116 DO WHILE(linei%next())
126 coli = linei%vol7d_serialize_itercol_new()
127 DO WHILE(coli%next())
129 CALL coli%export(c_loc(iun))
137 END SUBROUTINE vol7d_serialize_export
140 SUBROUTINE vol7d_ana_callback_gj(ana, genericptr)
141 TYPE(vol7d_ana),
INTENT(in) :: ana
142 TYPE(c_ptr),
VALUE :: genericptr
144 INTEGER,
POINTER :: iun
145 REAL(kind=fp_geo) :: l1, l2
147 CALL c_f_pointer(genericptr, iun)
149 CALL getval(ana%coord, lon=l1, lat=l2)
150 WRITE(iun,
'(A)')
'"type":"Feature", "geometry":{"type":"Point", "coordinates":['//
t2c(l1,
'null')//
', '//
t2c(l2,
'null')//
']},' 151 WRITE(iun,
'(A)')
'"properties":{' 153 END SUBROUTINE vol7d_ana_callback_gj
156 SUBROUTINE vol7d_time_callback_gj(time, genericptr)
157 TYPE(datetime),
INTENT(in) :: time
158 TYPE(c_ptr),
VALUE :: genericptr
160 INTEGER,
POINTER :: iun
161 CHARACTER(len=19) :: isodate
163 CALL c_f_pointer(genericptr, iun)
165 IF (time /= datetime_miss)
THEN 166 CALL getval(time, isodate=isodate)
167 WRITE(iun,
'(A)')
'"datetime":"'//trim(isodate)//
'",' 169 WRITE(iun,
'(A)')
'"datetime":null,' 172 END SUBROUTINE vol7d_time_callback_gj
175 SUBROUTINE vol7d_level_callback_gj(level, genericptr)
176 TYPE(vol7d_level),
INTENT(in) :: level
177 TYPE(c_ptr),
VALUE :: genericptr
179 INTEGER,
POINTER :: iun
181 CALL c_f_pointer(genericptr, iun)
183 WRITE(iun,
'(A,/,A,/,A,/,A)') &
184 '"level_t1":'//
t2c(level%level1,
'null')//
',', &
185 '"level_v1":'//
t2c(level%l1,
'null')//
',', &
186 '"level_t2":'//
t2c(level%level2,
'null')//
',', &
187 '"level_v2":'//
t2c(level%l2,
'null')//
',' 189 END SUBROUTINE vol7d_level_callback_gj
192 SUBROUTINE vol7d_timerange_callback_gj(timerange, genericptr)
193 TYPE(vol7d_timerange),
INTENT(in) :: timerange
194 TYPE(c_ptr),
VALUE :: genericptr
196 INTEGER,
POINTER :: iun
198 CALL c_f_pointer(genericptr, iun)
200 WRITE(iun,
'(A,/,A,/,A)') &
201 '"trange_pind":'//
t2c(timerange%timerange,
'null')//
',', &
202 '"trange_p1":'//
t2c(timerange%p1,
'null')//
',', &
203 '"trange_p2":'//
t2c(timerange%p2,
'null')//
',' 205 END SUBROUTINE vol7d_timerange_callback_gj
208 SUBROUTINE vol7d_network_callback_gj(network, genericptr)
209 TYPE(vol7d_network),
INTENT(in) :: network
210 TYPE(c_ptr),
VALUE :: genericptr
212 INTEGER,
POINTER :: iun
214 CALL c_f_pointer(genericptr, iun)
216 IF (
c_e(network))
THEN 217 WRITE(iun,
'(A)')
'"network":"'//trim(network%name)//
'",' 219 WRITE(iun,
'(A)')
'"network":null,' 222 END SUBROUTINE vol7d_network_callback_gj
225 SUBROUTINE vol7d_var_callback_gj(var, genericptr)
226 TYPE(vol7d_var),
INTENT(in) :: var
227 TYPE(c_ptr),
VALUE :: genericptr
229 INTEGER,
POINTER :: iun
231 CALL c_f_pointer(genericptr, iun)
234 WRITE(iun,
'(A)')
'"bcode":"'//trim(var%btable)//
'",' 236 WRITE(iun,
'(A)')
'"bcode":null,' 239 END SUBROUTINE vol7d_var_callback_gj
242 SUBROUTINE vol7d_attr_callback_gj(var, attr, genericptr)
243 TYPE(vol7d_var),
INTENT(in) :: var
244 TYPE(vol7d_var),
INTENT(in) :: attr
245 TYPE(c_ptr),
VALUE :: genericptr
247 INTEGER,
POINTER :: iun
249 CALL c_f_pointer(genericptr, iun)
251 IF (
c_e(var) .AND.
c_e(attr))
THEN 252 WRITE(iun,
'(A)')
'"bcode":"'//trim(var%btable)//
'.'//trim(attr%btable)//
'",' 254 WRITE(iun,
'(A)')
'"bcode":null,' 257 END SUBROUTINE vol7d_attr_callback_gj
260 SUBROUTINE vol7d_valuer_callback_gj(valu, var, genericptr)
261 REAL,
INTENT(in) :: valu
262 TYPE(vol7d_var),
INTENT(in) :: var
263 TYPE(c_ptr),
VALUE :: genericptr
265 INTEGER,
POINTER :: iun
267 CALL c_f_pointer(genericptr, iun)
269 WRITE(iun,
'(A)')
'"value":'//
t2c(valu,
'null')
271 END SUBROUTINE vol7d_valuer_callback_gj
274 SUBROUTINE vol7d_valued_callback_gj(valu, var, genericptr)
275 DOUBLE PRECISION,
INTENT(in) :: valu
276 TYPE(vol7d_var),
INTENT(in) :: var
277 TYPE(c_ptr),
VALUE :: genericptr
279 INTEGER,
POINTER :: iun
281 CALL c_f_pointer(genericptr, iun)
283 WRITE(iun,
'(A)')
'"value":'//
t2c(valu,
'null')
285 END SUBROUTINE vol7d_valued_callback_gj
288 SUBROUTINE vol7d_valuei_callback_gj(valu, var, genericptr)
289 INTEGER,
INTENT(in) :: valu
290 TYPE(vol7d_var),
INTENT(in) :: var
291 TYPE(c_ptr),
VALUE :: genericptr
293 INTEGER,
POINTER :: iun
295 CALL c_f_pointer(genericptr, iun)
298 IF (
c_e(var%scalefactor) .AND. &
299 .NOT.(var%scalefactor == 0 .AND. var%unit ==
'NUMERIC'))
THEN 300 WRITE(iun,
'(A)')
'"value":'//
t2c(
realdat(valu, var))
302 WRITE(iun,
'(A)')
'"value":'//
t2c(valu)
305 WRITE(iun,
'(A)')
'"value":null' 308 END SUBROUTINE vol7d_valuei_callback_gj
311 SUBROUTINE vol7d_valueb_callback_gj(valu, var, genericptr)
312 INTEGER(kind=int_b),
INTENT(in) :: valu
313 TYPE(vol7d_var),
INTENT(in) :: var
314 TYPE(c_ptr),
VALUE :: genericptr
316 CALL vol7d_valuei_callback_gj(int(valu), var, genericptr)
318 END SUBROUTINE vol7d_valueb_callback_gj
321 SUBROUTINE vol7d_valuec_callback_gj(valu, var, genericptr)
322 CHARACTER(len=*),
INTENT(in) :: valu
323 TYPE(vol7d_var),
INTENT(in) :: var
324 TYPE(c_ptr),
VALUE :: genericptr
326 INTEGER,
POINTER :: iun
328 CALL c_f_pointer(genericptr, iun)
331 IF (
c_e(var%scalefactor) .AND. var%unit /=
'CCITTIA5' .AND. &
332 .NOT.(var%scalefactor == 0 .AND. var%unit ==
'NUMERIC'))
THEN 333 WRITE(iun,
'(A)')
'"value":'//
t2c(
realdat(valu, var))
335 WRITE(iun,
'(A)')
'"value":"'//trim(valu)//
'"' 338 WRITE(iun,
'(A)')
'"value":null' 341 END SUBROUTINE vol7d_valuec_callback_gj
344 SUBROUTINE vol7d_valuer_attr_callback_gj(valu, var, attr, genericptr)
345 REAL,
INTENT(in) :: valu
346 TYPE(vol7d_var),
INTENT(in) :: var
347 TYPE(vol7d_var),
INTENT(in) :: attr
348 TYPE(c_ptr),
VALUE :: genericptr
350 CALL vol7d_valuer_callback_gj(valu, attr, genericptr)
352 END SUBROUTINE vol7d_valuer_attr_callback_gj
355 SUBROUTINE vol7d_valued_attr_callback_gj(valu, var, attr, genericptr)
356 DOUBLE PRECISION,
INTENT(in) :: valu
357 TYPE(vol7d_var),
INTENT(in) :: var
358 TYPE(vol7d_var),
INTENT(in) :: attr
359 TYPE(c_ptr),
VALUE :: genericptr
361 CALL vol7d_valued_callback_gj(valu, attr, genericptr)
363 END SUBROUTINE vol7d_valued_attr_callback_gj
366 SUBROUTINE vol7d_valuei_attr_callback_gj(valu, var, attr, genericptr)
367 INTEGER,
INTENT(in) :: valu
368 TYPE(vol7d_var),
INTENT(in) :: var
369 TYPE(vol7d_var),
INTENT(in) :: attr
370 TYPE(c_ptr),
VALUE :: genericptr
372 CALL vol7d_valuei_callback_gj(valu, attr, genericptr)
374 END SUBROUTINE vol7d_valuei_attr_callback_gj
377 SUBROUTINE vol7d_valueb_attr_callback_gj(valu, var, attr, genericptr)
378 INTEGER(kind=int_b),
INTENT(in) :: valu
379 TYPE(vol7d_var),
INTENT(in) :: var
380 TYPE(vol7d_var),
INTENT(in) :: attr
381 TYPE(c_ptr),
VALUE :: genericptr
383 CALL vol7d_valuei_callback_gj(int(valu), attr, genericptr)
385 END SUBROUTINE vol7d_valueb_attr_callback_gj
388 SUBROUTINE vol7d_valuec_attr_callback_gj(valu, var, attr, genericptr)
389 CHARACTER(len=*),
INTENT(in) :: valu
390 TYPE(vol7d_var),
INTENT(in) :: var
391 TYPE(vol7d_var),
INTENT(in) :: attr
392 TYPE(c_ptr),
VALUE :: genericptr
394 INTEGER,
POINTER :: iun
396 CALL vol7d_valuec_callback_gj(valu, attr, genericptr)
398 END SUBROUTINE vol7d_valuec_attr_callback_gj
400 END MODULE vol7d_serialize_geojson_class
Extension of vol7d_class for serializing the contents of a volume.
Set of functions that return a trimmed CHARACTER representation of the input variable.
Module for parsing command-line optons.
Test for a missing volume.
Classe per la gestione di un volume completo di dati osservati.
Class for serializing a vol7d object.
classe per la gestione del logging
Utilities for CHARACTER variables.
Emit log message for a category with specific priority.
Add a new option of a specific type.