libsim  Versione8.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/>.
18 MODULE vol7d_serialize_geojson_class
19 use,INTRINSIC :: iso_c_binding
20 USE log4fortran
21 USE vol7d_class
25 IMPLICIT NONE
26 
27 TYPE,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
34 END TYPE vol7d_serialize_geojson
35 
36 PRIVATE
37 PUBLIC vol7d_serialize_geojson, vol7d_serialize_geojson_new
38 
39 CONTAINS
40 
41 FUNCTION vol7d_serialize_geojson_new() RESULT(this)
42 TYPE(vol7d_serialize_geojson) :: this
43 
44 this%vol7d_serialize = vol7d_serialize_new()
45 
46 END FUNCTION vol7d_serialize_geojson_new
47 
48 
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
53 
54 IF (PRESENT(ext)) THEN
55  this%ext = ext
56 ELSE
57  this%ext = 'geojson'
58 ENDIF
59 
60 ! reset unconditionally some parameters
61 this%column='ana,time,timerange,level,network,var,value'
62 this%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
67 IF (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 
72 END SUBROUTINE vol7d_serialize_optionparser
73 
74 
75 SUBROUTINE vol7d_serialize_parse(this, category)
76 CLASS(vol7d_serialize_geojson),INTENT(inout) :: this
77 TYPE(l4f_handle),INTENT(in),OPTIONAL :: category
78 
79 ! check own parameters
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')
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()
87 ENDIF
88 ! call the original method
89 CALL this%vol7d_serialize%vol7d_serialize_parse(category)
90 
91 END SUBROUTINE vol7d_serialize_parse
92 
93 
94 SUBROUTINE vol7d_serialize_export(this, iun)
95 CLASS(vol7d_serialize_geojson),INTENT(inout) :: this
96 INTEGER,INTENT(in),TARGET :: iun
97 
98 INTEGER :: i, l
99 TYPE(vol7d_serialize_iterline) :: linei
100 TYPE(vol7d_serialize_itercol) :: coli
101 
102 WRITE(iun,'(A)')'{"type":"FeatureCollection", "features":['
103 
104 l = 0
105 linei = this%vol7d_serialize_iterline_new()
106 
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)
115 
116 DO 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)')'}}'
133 END DO
134 ! close feature list and featurecollection
135 WRITE(iun,'(A)')']}'
136 
137 END SUBROUTINE vol7d_serialize_export
138 
139 
140 SUBROUTINE vol7d_ana_callback_gj(ana, genericptr)
141 TYPE(vol7d_ana), INTENT(in) :: ana
142 TYPE(c_ptr),VALUE :: genericptr
143 
144 INTEGER,POINTER :: iun
145 REAL(kind=fp_geo) :: l1, l2
146 
147 CALL c_f_pointer(genericptr, iun)
148 
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":{'
152 
153 END SUBROUTINE vol7d_ana_callback_gj
154 
155 
156 SUBROUTINE vol7d_time_callback_gj(time, genericptr)
157 TYPE(datetime), INTENT(in) :: time
158 TYPE(c_ptr),VALUE :: genericptr
159 
160 INTEGER,POINTER :: iun
161 CHARACTER(len=19) :: isodate
162 
163 CALL c_f_pointer(genericptr, iun)
164 
165 IF (time /= datetime_miss) THEN
166  CALL getval(time, isodate=isodate)
167  WRITE(iun,'(A)')'"datetime":"'//trim(isodate)//'",'
168 ELSE
169  WRITE(iun,'(A)')'"datetime":null,'
170 ENDIF
171 
172 END SUBROUTINE vol7d_time_callback_gj
173 
174 
175 SUBROUTINE vol7d_level_callback_gj(level, genericptr)
176 TYPE(vol7d_level), INTENT(in) :: level
177 TYPE(c_ptr),VALUE :: genericptr
178 
179 INTEGER,POINTER :: iun
180 
181 CALL c_f_pointer(genericptr, iun)
182 
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')//','
188 
189 END SUBROUTINE vol7d_level_callback_gj
190 
191 
192 SUBROUTINE vol7d_timerange_callback_gj(timerange, genericptr)
193 TYPE(vol7d_timerange), INTENT(in) :: timerange
194 TYPE(c_ptr),VALUE :: genericptr
195 
196 INTEGER,POINTER :: iun
197 
198 CALL c_f_pointer(genericptr, iun)
199 
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')//','
204 
205 END SUBROUTINE vol7d_timerange_callback_gj
206 
207 
208 SUBROUTINE vol7d_network_callback_gj(network, genericptr)
209 TYPE(vol7d_network), INTENT(in) :: network
210 TYPE(c_ptr),VALUE :: genericptr
211 
212 INTEGER,POINTER :: iun
213 
214 CALL c_f_pointer(genericptr, iun)
215 
216 IF (c_e(network)) THEN
217  WRITE(iun,'(A)')'"network":"'//trim(network%name)//'",'
218 ELSE
219  WRITE(iun,'(A)')'"network":null,'
220 ENDIF
221 
222 END SUBROUTINE vol7d_network_callback_gj
223 
224 
225 SUBROUTINE vol7d_var_callback_gj(var, genericptr)
226 TYPE(vol7d_var), INTENT(in) :: var
227 TYPE(c_ptr),VALUE :: genericptr
228 
229 INTEGER,POINTER :: iun
230 
231 CALL c_f_pointer(genericptr, iun)
232 
233 IF (c_e(var)) THEN
234  WRITE(iun,'(A)')'"bcode":"'//trim(var%btable)//'",'
235 ELSE
236  WRITE(iun,'(A)')'"bcode":null,'
237 ENDIF
238 
239 END SUBROUTINE vol7d_var_callback_gj
240 
241 
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
246 
247 INTEGER,POINTER :: iun
248 
249 CALL c_f_pointer(genericptr, iun)
250 
251 IF (c_e(var) .AND. c_e(attr)) THEN
252  WRITE(iun,'(A)')'"bcode":"'//trim(var%btable)//'.'//trim(attr%btable)//'",'
253 ELSE
254  WRITE(iun,'(A)')'"bcode":null,'
255 ENDIF
256 
257 END SUBROUTINE vol7d_attr_callback_gj
258 
259 
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
264 
265 INTEGER,POINTER :: iun
266 
267 CALL c_f_pointer(genericptr, iun)
268 
269 WRITE(iun,'(A)')'"value":'//t2c(valu, 'null') !//','
270 
271 END SUBROUTINE vol7d_valuer_callback_gj
272 
273 
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
278 
279 INTEGER,POINTER :: iun
280 
281 CALL c_f_pointer(genericptr, iun)
282 
283 WRITE(iun,'(A)')'"value":'//t2c(valu, 'null') !//','
284 
285 END SUBROUTINE vol7d_valued_callback_gj
286 
287 
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
292 
293 INTEGER,POINTER :: iun
294 
295 CALL c_f_pointer(genericptr, iun)
296 
297 IF (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
304 ELSE
305  WRITE(iun,'(A)')'"value":null'
306 ENDIF
307 
308 END SUBROUTINE vol7d_valuei_callback_gj
309 
310 
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
315 
316 CALL vol7d_valuei_callback_gj(int(valu), var, genericptr)
317 
318 END SUBROUTINE vol7d_valueb_callback_gj
319 
320 
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
325 
326 INTEGER,POINTER :: iun
327 
328 CALL c_f_pointer(genericptr, iun)
329 
330 IF (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
337 ELSE
338  WRITE(iun,'(A)')'"value":null'
339 ENDIF
340 
341 END SUBROUTINE vol7d_valuec_callback_gj
342 
343 
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
349 
350 CALL vol7d_valuer_callback_gj(valu, attr, genericptr)
351 
352 END SUBROUTINE vol7d_valuer_attr_callback_gj
353 
354 
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
360 
361 CALL vol7d_valued_callback_gj(valu, attr, genericptr)
362 
363 END SUBROUTINE vol7d_valued_attr_callback_gj
364 
365 
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
371 
372 CALL vol7d_valuei_callback_gj(valu, attr, genericptr)
373 
374 END SUBROUTINE vol7d_valuei_attr_callback_gj
375 
376 
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
382 
383 CALL vol7d_valuei_callback_gj(int(valu), attr, genericptr)
384 
385 END SUBROUTINE vol7d_valueb_attr_callback_gj
386 
387 
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
393 
394 INTEGER,POINTER :: iun
395 
396 CALL vol7d_valuec_callback_gj(valu, attr, genericptr)
397 
398 END SUBROUTINE vol7d_valuec_attr_callback_gj
399 
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
real data conversion
Utilities for CHARACTER variables.
Emit log message for a category with specific priority.
Add a new option of a specific type.

Generated with Doxygen.