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