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
52MODULE proj6
53use,INTRINSIC :: iso_c_binding
54IMPLICIT NONE
55
59TYPE,BIND(C) :: pj_object
60 PRIVATE
61 TYPE(c_ptr) :: ptr = c_null_ptr
62END TYPE pj_object
67TYPE(pj_object),PARAMETER :: pj_object_null=pj_object(c_null_ptr)
68
72TYPE,BIND(C) :: pj_context_object
73 PRIVATE
74 TYPE(c_ptr) :: ptr = c_null_ptr
75END TYPE pj_context_object
76
79TYPE(pj_context_object),PARAMETER :: pj_default_ctx=pj_context_object(c_null_ptr)
80
87TYPE,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
92END TYPE pj_coord_object
93
97TYPE,BIND(C) :: pj_area_object
98 PRIVATE
99 TYPE(c_ptr) :: ptr = c_null_ptr
100END TYPE pj_area_object
101
103TYPE,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
112END TYPE pj_info_object
113
115TYPE,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
121END TYPE pj_proj_info_object
122
125ENUM, 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
140END ENUM
141
144ENUM, BIND(c)
145 ENUMERATOR :: &
146 pj_fwd = 1, &
147 pj_ident= 0, &
148 pj_inv = -1
149END ENUM
150
151INTERFACE
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
156END INTERFACE
157
158INTERFACE
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
164END INTERFACE
165
166INTERFACE
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
172END INTERFACE
173
174INTERFACE
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
181END INTERFACE
182
183INTERFACE
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
193END INTERFACE
194
195INTERFACE
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
206END INTERFACE
207
208INTERFACE
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
215END INTERFACE
216
217INTERFACE
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
223END INTERFACE
224
225INTERFACE
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
235END INTERFACE
236
237INTERFACE
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
242END INTERFACE
243
244INTERFACE
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
252END INTERFACE
253
254! TODO implement a fortran-style array function with assumed shape arrays
255INTERFACE
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
264END INTERFACE
265
266INTERFACE
267 FUNCTION proj_info() bind(C,name='proj_info')
268 IMPORT
269 TYPE(pj_info_object) :: proj_info
270 END FUNCTION proj_info
271END INTERFACE
272
273INTERFACE
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
279END INTERFACE
280
281INTERFACE
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
287END INTERFACE
288
289INTERFACE
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
295END INTERFACE
296
297INTERFACE
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
303END INTERFACE
304
305INTERFACE
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
311END INTERFACE
312
313INTERFACE
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
319END INTERFACE
320
321INTERFACE
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
327END INTERFACE
328
329INTERFACE
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
336END INTERFACE
337
338
345INTERFACE proj_associated
346 MODULE PROCEDURE proj_associated_pj, proj_associated_context, &
347 proj_associated_area
348END INTERFACE proj_associated
349
350! TODO
351! pj_latlong_from_proj: proj_crs_get_horizontal_datum() and proj_create_geographic_crs_from_datum()?
352
353CONTAINS
354
355FUNCTION proj_associated_pj(object) RESULT(associated_)
356TYPE(pj_object),INTENT(in) :: object
357LOGICAL :: associated_
358associated_ = c_associated(object%ptr)
359END FUNCTION proj_associated_pj
360
361FUNCTION proj_associated_context(object) RESULT(associated_)
362TYPE(pj_context_object),INTENT(in) :: object
363LOGICAL :: associated_
364associated_ = c_associated(object%ptr)
365END FUNCTION proj_associated_context
366
367FUNCTION proj_associated_area(object) RESULT(associated_)
368TYPE(pj_area_object),INTENT(in) :: object
369LOGICAL :: associated_
370associated_ = c_associated(object%ptr)
371END FUNCTION proj_associated_area
372
374FUNCTION proj_trans_f(p, direction, coord)
375TYPE(pj_object),VALUE :: p
376INTEGER(kind=KIND(PJ_FWD)),VALUE :: direction ! warning this is an enum
377TYPE(pj_coord_object) :: coord(:)
378INTEGER :: proj_trans_f
379
380INTEGER(kind=c_size_t) :: n
381
382n = SIZE(coord)
383proj_trans_f = proj_trans_array(p, direction, n, coord)
384
385END FUNCTION proj_trans_f
386
387
388END MODULE proj6
Fortran 2003 interface to the proj https://proj.org/ library, API version 6.
Definition: proj6.F90:63
Object describing a projection or a transformation.
Definition: proj6.F90:70