libsim Versione 8.0.0
vol7d_serialize_geojson_class.F03
1! Copyright (C) 2010 ARPA-SIM <urpsim@smr.arpa.emr.it>
2! authors:
3! Davide Cesari <dcesari@arpa.emr.it>
4! Paolo Patruno <ppatruno@arpa.emr.it>
5
6! This program is free software; you can redistribute it and/or
7! modify it under the terms of the GNU General Public License as
8! published by the Free Software Foundation; either version 2 of
9! the License, or (at your option) any later version.
10
11! This program is distributed in the hope that it will be useful,
12! but WITHOUT ANY WARRANTY; without even the implied warranty of
13! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14! GNU General Public License for more details.
15
16! You should have received a copy of the GNU General Public License
17! along with this program. If not, see <http://www.gnu.org/licenses/>.
18MODULE vol7d_serialize_geojson_class
19use,INTRINSIC :: iso_c_binding
25IMPLICIT NONE
26
27TYPE,EXTENDS(vol7d_serialize) :: vol7d_serialize_geojson
28 PRIVATE
29 CHARACTER(len=8),PUBLIC :: variant='simple'
30 CONTAINS
31 PROCEDURE :: vol7d_serialize_optionparser
32 PROCEDURE :: vol7d_serialize_parse
33 PROCEDURE :: vol7d_serialize_export
34END TYPE vol7d_serialize_geojson
35
36PRIVATE
37PUBLIC vol7d_serialize_geojson, vol7d_serialize_geojson_new
38
39CONTAINS
40
41FUNCTION vol7d_serialize_geojson_new() RESULT(this)
42TYPE(vol7d_serialize_geojson) :: this
43
44this%vol7d_serialize = vol7d_serialize_new()
45
46END FUNCTION vol7d_serialize_geojson_new
47
48
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
53
54IF (PRESENT(ext)) THEN
55 this%ext = ext
56ELSE
57 this%ext = 'geojson'
58ENDIF
59
60! reset unconditionally some parameters
61this%column='ana,time,timerange,level,network,var,value'
62this%loop='time,timerange,level,var,ana,network'
63
64! the generic method is not called since everything has a predefined
65! configuration
66! add a specific parameter
67IF (present(opt)) &
68 CALL optionparser_add(opt, ' ', trim(this%ext)//'-variant', this%variant, &
69 this%variant, &
70 help='variant of geojson output, accepted values are ''simple'' and ''rich''')
71
72END SUBROUTINE vol7d_serialize_optionparser
73
74
75SUBROUTINE vol7d_serialize_parse(this, category)
76CLASS(vol7d_serialize_geojson),INTENT(inout) :: this !< object having undorgone the vol7d_serialize_optionparser method
77TYPE(l4f_handle),INTENT(in),OPTIONAL :: category !< log4fortran category for logging error messages
78
79! check own parameters
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')
83 CALL l4f_category_log(category, l4f_error, 'value '//trim(this%variant)// &
84 ' not valid for --'//trim(this%ext)//'-variant parameter.')
85 ENDIF
86 CALL raise_error()
87ENDIF
88! call the original method
89CALL this%vol7d_serialize%vol7d_serialize_parse(category)
90
91END SUBROUTINE vol7d_serialize_parse
92
93
94SUBROUTINE vol7d_serialize_export(this, iun)
95CLASS(vol7d_serialize_geojson),INTENT(inout) :: this
96INTEGER,INTENT(in),TARGET :: iun
97
98INTEGER :: i, l
99TYPE(vol7d_serialize_iterline) :: linei
100TYPE(vol7d_serialize_itercol) :: coli
101
102WRITE(iun,'(A)')'{"type":"FeatureCollection", "features":['
103
104l = 0
105linei = this%vol7d_serialize_iterline_new()
106
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)
115
116DO WHILE(linei%next())
117! open feature
118 IF (l == 0) THEN
119 WRITE(iun,'(A)')'{'
120 ELSE
121 WRITE(iun,'(A)')',{'
122 ENDIF
123 l = l + 1
124
125 i = 0
126 coli = linei%vol7d_serialize_itercol_new()
127 DO WHILE(coli%next())
128 i = i + 1
129 CALL coli%export(c_loc(iun))
130 END DO
131! close property and feature
132 WRITE(iun,'(A)')'}}'
133END DO
134! close feature list and featurecollection
135WRITE(iun,'(A)')']}'
136
137END SUBROUTINE vol7d_serialize_export
138
139
140SUBROUTINE vol7d_ana_callback_gj(ana, genericptr)
141TYPE(vol7d_ana), INTENT(in) :: ana
142TYPE(c_ptr),VALUE :: genericptr
143
144INTEGER,POINTER :: iun
145REAL(kind=fp_geo) :: l1, l2
146
147CALL c_f_pointer(genericptr, iun)
148
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":{'
152
153END SUBROUTINE vol7d_ana_callback_gj
154
155
156SUBROUTINE vol7d_time_callback_gj(time, genericptr)
157TYPE(datetime), INTENT(in) :: time
158TYPE(c_ptr),VALUE :: genericptr
159
160INTEGER,POINTER :: iun
161CHARACTER(len=19) :: isodate
162
163CALL c_f_pointer(genericptr, iun)
164
165IF (time /= datetime_miss) THEN
166 CALL getval(time, isodate=isodate)
167 WRITE(iun,'(A)')'"datetime":"'//trim(isodate)//'",'
168ELSE
169 WRITE(iun,'(A)')'"datetime":null,'
170ENDIF
171
172END SUBROUTINE vol7d_time_callback_gj
173
174
175SUBROUTINE vol7d_level_callback_gj(level, genericptr)
176TYPE(vol7d_level), INTENT(in) :: level
177TYPE(c_ptr),VALUE :: genericptr
178
179INTEGER,POINTER :: iun
180
181CALL c_f_pointer(genericptr, iun)
182
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')//','
188
189END SUBROUTINE vol7d_level_callback_gj
190
191
192SUBROUTINE vol7d_timerange_callback_gj(timerange, genericptr)
193TYPE(vol7d_timerange), INTENT(in) :: timerange
194TYPE(c_ptr),VALUE :: genericptr
195
196INTEGER,POINTER :: iun
197
198CALL c_f_pointer(genericptr, iun)
199
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')//','
204
205END SUBROUTINE vol7d_timerange_callback_gj
206
207
208SUBROUTINE vol7d_network_callback_gj(network, genericptr)
209TYPE(vol7d_network), INTENT(in) :: network
210TYPE(c_ptr),VALUE :: genericptr
211
212INTEGER,POINTER :: iun
213
214CALL c_f_pointer(genericptr, iun)
215
216IF (c_e(network)) THEN
217 WRITE(iun,'(A)')'"network":"'//trim(network%name)//'",'
218ELSE
219 WRITE(iun,'(A)')'"network":null,'
220ENDIF
221
222END SUBROUTINE vol7d_network_callback_gj
223
224
225SUBROUTINE vol7d_var_callback_gj(var, genericptr)
226TYPE(vol7d_var), INTENT(in) :: var
227TYPE(c_ptr),VALUE :: genericptr
228
229INTEGER,POINTER :: iun
230
231CALL c_f_pointer(genericptr, iun)
232
233IF (c_e(var)) THEN
234 WRITE(iun,'(A)')'"bcode":"'//trim(var%btable)//'",'
235ELSE
236 WRITE(iun,'(A)')'"bcode":null,'
237ENDIF
238
239END SUBROUTINE vol7d_var_callback_gj
240
241
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
246
247INTEGER,POINTER :: iun
248
249CALL c_f_pointer(genericptr, iun)
250
251IF (c_e(var) .AND. c_e(attr)) THEN
252 WRITE(iun,'(A)')'"bcode":"'//trim(var%btable)//'.'//trim(attr%btable)//'",'
253ELSE
254 WRITE(iun,'(A)')'"bcode":null,'
255ENDIF
256
257END SUBROUTINE vol7d_attr_callback_gj
258
259
260SUBROUTINE vol7d_valuer_callback_gj(valu, var, genericptr)
261REAL,INTENT(in) :: valu
262TYPE(vol7d_var),INTENT(in) :: var
263TYPE(c_ptr),VALUE :: genericptr
264
265INTEGER,POINTER :: iun
266
267CALL c_f_pointer(genericptr, iun)
268
269WRITE(iun,'(A)')'"value":'//t2c(valu, 'null') !//','
270
271END SUBROUTINE vol7d_valuer_callback_gj
272
273
274SUBROUTINE vol7d_valued_callback_gj(valu, var, genericptr)
275DOUBLE PRECISION,INTENT(in) :: valu
276TYPE(vol7d_var),INTENT(in) :: var
277TYPE(c_ptr),VALUE :: genericptr
278
279INTEGER,POINTER :: iun
280
281CALL c_f_pointer(genericptr, iun)
282
283WRITE(iun,'(A)')'"value":'//t2c(valu, 'null') !//','
284
285END SUBROUTINE vol7d_valued_callback_gj
286
287
288SUBROUTINE vol7d_valuei_callback_gj(valu, var, genericptr)
289INTEGER,INTENT(in) :: valu
290TYPE(vol7d_var),INTENT(in) :: var
291TYPE(c_ptr),VALUE :: genericptr
292
293INTEGER,POINTER :: iun
294
295CALL c_f_pointer(genericptr, iun)
296
297IF (c_e(valu)) THEN
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)) !//','
301 ELSE
302 WRITE(iun,'(A)')'"value":'//t2c(valu) !//','
303 ENDIF
304ELSE
305 WRITE(iun,'(A)')'"value":null'
306ENDIF
307
308END SUBROUTINE vol7d_valuei_callback_gj
309
310
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
315
316CALL vol7d_valuei_callback_gj(int(valu), var, genericptr)
317
318END SUBROUTINE vol7d_valueb_callback_gj
319
320
321SUBROUTINE vol7d_valuec_callback_gj(valu, var, genericptr)
322CHARACTER(len=*),INTENT(in) :: valu
323TYPE(vol7d_var),INTENT(in) :: var
324TYPE(c_ptr),VALUE :: genericptr
325
326INTEGER,POINTER :: iun
327
328CALL c_f_pointer(genericptr, iun)
329
330IF (c_e(valu)) THEN
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)) !//','
334 ELSE
335 WRITE(iun,'(A)')'"value":"'//trim(valu)//'"'
336 ENDIF
337ELSE
338 WRITE(iun,'(A)')'"value":null'
339ENDIF
340
341END SUBROUTINE vol7d_valuec_callback_gj
342
343
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
349
350CALL vol7d_valuer_callback_gj(valu, attr, genericptr)
351
352END SUBROUTINE vol7d_valuer_attr_callback_gj
353
354
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
360
361CALL vol7d_valued_callback_gj(valu, attr, genericptr)
362
363END SUBROUTINE vol7d_valued_attr_callback_gj
364
365
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
371
372CALL vol7d_valuei_callback_gj(valu, attr, genericptr)
373
374END SUBROUTINE vol7d_valuei_attr_callback_gj
375
376
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
382
383CALL vol7d_valuei_callback_gj(int(valu), attr, genericptr)
384
385END SUBROUTINE vol7d_valueb_attr_callback_gj
386
387
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
393
394INTEGER,POINTER :: iun
395
396CALL vol7d_valuec_callback_gj(valu, attr, genericptr)
397
398END SUBROUTINE vol7d_valuec_attr_callback_gj
399
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.
real data conversion
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.

Generated with Doxygen.