FortranGIS  Version 3.0
proj6.F90
1 ! Copyright 2011 Davide Cesari <dcesari69 at gmail dot com>
2 !
3 ! This file is part of FortranGIS.
4 !
5 ! FortranGIS is free software: you can redistribute it and/or modify
6 ! it under the terms of the GNU Lesser General Public License as
7 ! published by the Free Software Foundation, either version 3 of the
8 ! License, or (at your option) any later version.
9 !
10 ! FortranGIS is distributed in the hope that it will be useful, but
11 ! WITHOUT ANY WARRANTY; without even the implied warranty of
12 ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 ! Lesser General Public License for more details.
14 !
15 ! You should have received a copy of the GNU Lesser General Public
16 ! License along with FortranGIS. If not, see
17 ! <http://www.gnu.org/licenses/>.
18 
52 MODULE proj6
53 use,INTRINSIC :: iso_c_binding
54 IMPLICIT NONE
55 
59 TYPE,BIND(C) :: pj_object
60  PRIVATE
61  TYPE(c_ptr) :: ptr = c_null_ptr
62 END TYPE pj_object
63 
67 TYPE(pj_object),PARAMETER :: pj_object_null=pj_object(c_null_ptr)
68 
72 TYPE,BIND(C) :: pj_context_object
73  PRIVATE
74  TYPE(c_ptr) :: ptr = c_null_ptr
75 END TYPE pj_context_object
76 
79 TYPE(pj_context_object),PARAMETER :: pj_default_ctx=pj_context_object(c_null_ptr)
80 
87 TYPE,BIND(C) :: pj_coord_object
88  REAL(kind=c_double) :: x=huge(1.0_c_double)
89  REAL(kind=c_double) :: y=huge(1.0_c_double)
90  REAL(kind=c_double) :: z=0.0_c_double
91  REAL(kind=c_double) :: t=0.0_c_double
92 END TYPE pj_coord_object
93 
97 TYPE,BIND(C) :: pj_area_object
98  PRIVATE
99  TYPE(c_ptr) :: ptr = c_null_ptr
101 
103 TYPE,BIND(C) :: pj_info_object
104  INTEGER(kind=c_int) :: major
105  INTEGER(kind=c_int) :: minor
106  INTEGER(kind=c_int) :: patch
107  TYPE(c_ptr) :: release
108  TYPE(c_ptr) :: version
109  TYPE(c_ptr) :: searchpath
110  TYPE(c_ptr) :: paths
111  INTEGER(kind=c_size_t) :: path_count
112 END TYPE pj_info_object
113 
115 TYPE,BIND(C) :: pj_proj_info_object
116  TYPE(c_ptr) :: id
117  TYPE(c_ptr) :: description
118  TYPE(c_ptr) :: definition
119  INTEGER(kind=c_int) :: has_inverse
120  REAL(kind=c_double) :: accuracy
122 
125 ENUM, BIND(c)
126  ENUMERATOR :: PJ_TYPE_UNKNOWN, &
127  pj_type_ellipsoid, &
128  pj_type_prime_meridian, &
129  pj_type_geodetic_reference_frame, pj_type_dynamic_geodetic_reference_frame, &
130  pj_type_vertical_reference_frame, pj_type_dynamic_vertical_reference_frame, &
131  pj_type_datum_ensemble, &
132  pj_type_crs, &
133  pj_type_geodetic_crs, pj_type_geocentric_crs, &
134  pj_type_geographic_crs, pj_type_geographic_2d_crs, pj_type_geographic_3d_crs, &
135  pj_type_vertical_crs, pj_type_projected_crs, pj_type_compound_crs, &
136  pj_type_temporal_crs, pj_type_engineering_crs, pj_type_bound_crs, pj_type_other_crs, &
137  pj_type_conversion, pj_type_transformation, pj_type_concatenated_operation, &
138  pj_type_other_coordinate_operation, &
139  pj_type_temporal_datum, pj_type_engineering_datum, pj_type_parametric_datum
140 END ENUM
141 
144 ENUM, BIND(c)
145  ENUMERATOR :: &
146  pj_fwd = 1, &
147  pj_ident= 0, &
148  pj_inv = -1
149 END ENUM
150 
151 INTERFACE
152  FUNCTION proj_context_create() bind(C,name='proj_context_create')
153  IMPORT
154  TYPE(pj_context_object) :: proj_context_create
155  END FUNCTION proj_context_create
156 END INTERFACE
157 
158 INTERFACE
159  FUNCTION proj_context_destroy(ctx) bind(C,name='proj_context_destroy')
160  IMPORT
161  TYPE(pj_context_object),VALUE :: ctx
162  TYPE(pj_context_object) :: proj_context_destroy
163  END FUNCTION proj_context_destroy
164 END INTERFACE
165 
166 INTERFACE
167  FUNCTION proj_context_clone(ctx) bind(C,name='proj_context_clone')
168  IMPORT
169  TYPE(pj_context_object),VALUE :: ctx
170  TYPE(pj_context_object) :: proj_context_clone
171  END FUNCTION proj_context_clone
172 END INTERFACE
173 
174 INTERFACE
175  FUNCTION proj_create(ctx, definition) bind(C,name='proj_create')
176  IMPORT
177  TYPE(pj_context_object),VALUE :: ctx
178  CHARACTER(kind=c_char) :: definition(*)
179  TYPE(pj_object) :: proj_create
180  END FUNCTION proj_create
181 END INTERFACE
182 
183 INTERFACE
184  FUNCTION proj_create_crs_to_crs(ctx, source_crs, target_crs, area) &
185  bind(c,name='proj_create_crs_to_crs')
186  IMPORT
187  TYPE(pj_context_object),VALUE :: ctx
188  CHARACTER(kind=c_char) :: source_crs(*)
189  CHARACTER(kind=c_char) :: target_crs(*)
190  TYPE(pj_area_object),VALUE :: area
191  TYPE(pj_object) :: proj_create_crs_to_crs
192  END FUNCTION proj_create_crs_to_crs
193 END INTERFACE
194 
195 INTERFACE
196  FUNCTION proj_create_crs_to_crs_from_pj(ctx, source_crs, target_crs, area, options) &
197  bind(c,name='proj_create_crs_to_crs_from_pj')
198  IMPORT
199  TYPE(pj_context_object),VALUE :: ctx
200  TYPE(pj_object),VALUE :: source_crs
201  TYPE(pj_object),VALUE :: target_crs
202  TYPE(pj_area_object),VALUE :: area
203  TYPE(c_ptr),VALUE :: options
204  TYPE(pj_object) :: proj_create_crs_to_crs_from_pj
205  END FUNCTION proj_create_crs_to_crs_from_pj
206 END INTERFACE
207 
208 INTERFACE
209  FUNCTION proj_normalize_for_visualization(ctx, object) bind(C,name='proj_normalize_for_visualization')
210  IMPORT
211  TYPE(pj_context_object),VALUE :: ctx
212  TYPE(pj_object),VALUE :: object
213  TYPE(pj_object) :: proj_normalize_for_visualization
214  END FUNCTION proj_normalize_for_visualization
215 END INTERFACE
216 
217 INTERFACE
218  FUNCTION proj_destroy(pj) bind(C,name='proj_destroy')
219  IMPORT
220  TYPE(pj_object),VALUE :: pj
221  TYPE(pj_object) :: proj_destroy
222  END FUNCTION proj_destroy
223 END INTERFACE
224 
225 INTERFACE
226  SUBROUTINE proj_area_set_bbox(area, west_lon_degree, south_lat_degree, &
227  east_lon_degree, north_lat_degree) bind(C,name='proj_area_set_bbox')
228  IMPORT
229  TYPE(pj_area_object),VALUE :: area
230  REAL(kind=c_double),VALUE :: west_lon_degree
231  REAL(kind=c_double),VALUE :: south_lat_degree
232  REAL(kind=c_double),VALUE :: east_lon_degree
233  REAL(kind=c_double),VALUE :: north_lat_degree
234  END SUBROUTINE proj_area_set_bbox
235 END INTERFACE
236 
237 INTERFACE
238  SUBROUTINE proj_area_destroy(area) bind(C,name='proj_area_destroy')
239  IMPORT
240  TYPE(pj_area_object),VALUE :: area
241  END SUBROUTINE proj_area_destroy
242 END INTERFACE
243 
244 INTERFACE
245  FUNCTION proj_trans(p, direction, coord) bind(C,name='proj_trans')
246  IMPORT
247  TYPE(pj_object),VALUE :: p
248  INTEGER(kind=kind(PJ_FWD)),VALUE :: direction ! warning this is an enum
249  TYPE(pj_coord_object),VALUE :: coord
250  TYPE(pj_coord_object) :: proj_trans
251  END FUNCTION proj_trans
252 END INTERFACE
253 
254 ! TODO implement a fortran-style array function with assumed shape arrays
255 INTERFACE
256  FUNCTION proj_trans_array(p, direction, n, coord) bind(C,name='proj_trans_array')
257  IMPORT
258  TYPE(pj_object),VALUE :: p
259  INTEGER(kind=KIND(PJ_FWD)),VALUE :: direction ! warning this is an enum
260  INTEGER(kind=c_size_t),VALUE :: n
261  TYPE(pj_coord_object) :: coord(*)
262  INTEGER(kind=c_int) :: proj_trans_array
263  END FUNCTION proj_trans_array
264 END INTERFACE
265 
266 INTERFACE
267  FUNCTION proj_info() bind(C,name='proj_info')
268  IMPORT
269  TYPE(pj_info_object) :: proj_info
270  END FUNCTION proj_info
271 END INTERFACE
272 
273 INTERFACE
274  FUNCTION proj_pj_info(p) bind(C,name='proj_pj_info')
275  IMPORT
276  TYPE(pj_object),VALUE :: p
277  TYPE(pj_proj_info_object) :: proj_pj_info
278  END FUNCTION proj_pj_info
279 END INTERFACE
280 
281 INTERFACE
282  FUNCTION proj_get_type(obj) bind(C,name='proj_get_type')
283  IMPORT
284  TYPE(pj_object),VALUE :: obj
285  INTEGER(kind=kind(PJ_TYPE_UNKNOWN)) :: proj_get_type
286  END FUNCTION proj_get_type
287 END INTERFACE
288 
289 INTERFACE
290  FUNCTION proj_torad(angle_in_degrees) bind(C,name='proj_torad')
291  IMPORT
292  REAL(kind=c_double) :: angle_in_degrees
293  REAL(kind=c_double) :: proj_torad
294  END FUNCTION proj_torad
295 END INTERFACE
296 
297 INTERFACE
298  FUNCTION proj_todeg(angle_in_radians) bind(C,name='proj_todeg')
299  IMPORT
300  REAL(kind=c_double) :: angle_in_radians
301  REAL(kind=c_double) :: proj_todeg
302  END FUNCTION proj_todeg
303 END INTERFACE
304 
305 INTERFACE
306  FUNCTION proj_errno(p) bind(C,name='proj_errno')
307  IMPORT
308  TYPE(pj_object),VALUE :: p
309  INTEGER(kind=c_int) :: proj_errno
310  END FUNCTION proj_errno
311 END INTERFACE
312 
313 INTERFACE
314  FUNCTION proj_context_errno(ctx) bind(C,name='proj_context_errno')
315  IMPORT
316  TYPE(pj_context_object),VALUE :: ctx
317  INTEGER(kind=c_int) :: proj_context_errno
318  END FUNCTION proj_context_errno
319 END INTERFACE
320 
321 INTERFACE
322  FUNCTION proj_errno_string(err) bind(C,name='proj_errno_string')
323  IMPORT
324  INTEGER(kind=c_int),VALUE :: err
325  TYPE(c_ptr) :: proj_errno_string
326  END FUNCTION proj_errno_string
327 END INTERFACE
328 
329 INTERFACE
330  FUNCTION proj_context_errno_string(ctx, err) bind(C,name='proj_context_errno_string')
331  IMPORT
332  TYPE(pj_context_object),VALUE :: ctx
333  INTEGER(kind=c_int),VALUE :: err
334  TYPE(c_ptr) :: proj_context_errno_string
335  END FUNCTION proj_context_errno_string
336 END INTERFACE
337 
338 
345 INTERFACE proj_associated
346  MODULE PROCEDURE proj_associated_pj, proj_associated_context, &
347  proj_associated_area
348 END INTERFACE proj_associated
349 
350 ! TODO
351 ! pj_latlong_from_proj: proj_crs_get_horizontal_datum() and proj_create_geographic_crs_from_datum()?
352 
353 CONTAINS
354 
355 FUNCTION proj_associated_pj(object) RESULT(associated_)
356 TYPE(pj_object),INTENT(in) :: object
357 LOGICAL :: associated_
358 associated_ = c_associated(object%ptr)
359 END FUNCTION proj_associated_pj
360 
361 FUNCTION proj_associated_context(object) RESULT(associated_)
362 TYPE(pj_context_object),INTENT(in) :: object
363 LOGICAL :: associated_
364 associated_ = c_associated(object%ptr)
365 END FUNCTION proj_associated_context
366 
367 FUNCTION proj_associated_area(object) RESULT(associated_)
368 TYPE(pj_area_object),INTENT(in) :: object
369 LOGICAL :: associated_
370 associated_ = c_associated(object%ptr)
371 END FUNCTION proj_associated_area
372 
374 FUNCTION proj_trans_f(p, direction, coord)
375 TYPE(pj_object),VALUE :: p
376 INTEGER(kind=KIND(PJ_FWD)),VALUE :: direction ! warning this is an enum
377 TYPE(pj_coord_object) :: coord(:)
378 INTEGER :: proj_trans_f
379 
380 INTEGER(kind=c_size_t) :: n
381 
382 n = SIZE(coord)
383 proj_trans_f = proj_trans_array(p, direction, n, coord)
384 
385 END FUNCTION proj_trans_f
386 
387 
388 END MODULE proj6
Test whether an opaque object is valid.
Definition: proj6.F90:356
Fortran 2003 interface to the proj https://proj.org/ library, API version 6.
Definition: proj6.F90:63
Object describing a proj area.
Definition: proj6.F90:108
Object describing a proj multithread context.
Definition: proj6.F90:83
Object describing a general-purpose georeferenced coordinate.
Definition: proj6.F90:98
Object strictly reflecting C PJ_INFO structure.
Definition: proj6.F90:114
Object describing a projection or a transformation.
Definition: proj6.F90:70
Object strictly reflecting C PJ_PROJ_INFO structure.
Definition: proj6.F90:126