52use,
INTRINSIC :: iso_c_binding
58TYPE,
BIND(C) :: pj_object
60 TYPE(c_ptr) :: ptr = c_null_ptr
66TYPE(pj_object),
PARAMETER :: pj_object_null=
pj_object(c_null_ptr)
71TYPE,
BIND(C) :: pjuv_object
72 REAL(kind=c_double) :: u=huge(1.0_c_double)
73 REAL(kind=c_double) :: v=huge(1.0_c_double)
76REAL(kind=c_double),
PARAMETER :: pj_deg_to_rad=.0174532925199432958d0
77REAL(kind=c_double),
PARAMETER :: pj_rad_to_deg=57.29577951308232d0
82INTERFACE pj_associated
83 MODULE PROCEDURE pj_associated_object
84END INTERFACE pj_associated
89 FUNCTION pj_init_plus(name) bind(C,name='pj_init_plus')
91 CHARACTER(kind=c_char) :: name(*)
93 END FUNCTION pj_init_plus
97 FUNCTION pj_transform(src, dst, point_count, point_offset, x, y, z) &
98 bind(c,name=
'pj_transform')
102 INTEGER(kind=c_long),
VALUE :: point_count
103 INTEGER(kind=c_int),
VALUE :: point_offset
104 TYPE(c_ptr),
VALUE :: x
105 TYPE(c_ptr),
VALUE :: y
106 TYPE(c_ptr),
VALUE :: z
107 INTEGER(kind=c_int) :: pj_transform
108 END FUNCTION pj_transform
112 FUNCTION pj_datum_transform(src, dst, point_count, point_offset, x, y, z) &
113 bind(c,name=
'pj_datum_transform')
117 INTEGER(kind=c_long),
VALUE :: point_count
118 INTEGER(kind=c_int),
VALUE :: point_offset
119 REAL(kind=c_double) :: x(*)
120 REAL(kind=c_double) :: y(*)
121 REAL(kind=c_double) :: z(*)
122 INTEGER(kind=c_int) :: pj_datum_transform
123 END FUNCTION pj_datum_transform
127 FUNCTION pj_fwd(val, proj) bind(C,name='pj_fwd')
129 TYPE(pjuv_object),
VALUE :: val
131 TYPE(pjuv_object) :: pj_fwd
136 FUNCTION pj_inv(val, proj) bind(C,name='pj_inv')
138 TYPE(pjuv_object),
VALUE :: val
140 TYPE(pjuv_object) :: pj_inv
145 FUNCTION pj_geocentric_to_geodetic(a, es, point_count, point_offset, x, y, z) &
146 bind(c,name=
'pj_geocentric_to_geodetic')
148 REAL(kind=c_double),
VALUE :: a
149 REAL(kind=c_double),
VALUE :: es
150 INTEGER(kind=c_long),
VALUE :: point_count
151 INTEGER(kind=c_int),
VALUE :: point_offset
152 REAL(kind=c_double) :: x(*)
153 REAL(kind=c_double) :: y(*)
154 REAL(kind=c_double) :: z(*)
155 INTEGER(kind=c_int) :: pj_geocentric_to_geodetic
156 END FUNCTION pj_geocentric_to_geodetic
160 FUNCTION pj_geodetic_to_geocentric(a, es, point_count, point_offset, x, y, z) &
161 bind(c,name=
'pj_geodetic_to_geocentric')
163 REAL(kind=c_double),
VALUE :: a
164 REAL(kind=c_double),
VALUE :: es
165 INTEGER(kind=c_long),
VALUE :: point_count
166 INTEGER(kind=c_int),
VALUE :: point_offset
167 REAL(kind=c_double) :: x(*)
168 REAL(kind=c_double) :: y(*)
169 REAL(kind=c_double) :: z(*)
170 INTEGER(kind=c_int) :: pj_geodetic_to_geocentric
171 END FUNCTION pj_geodetic_to_geocentric
175 FUNCTION pj_compare_datums(srcdefn, dstdefn) bind(C,name='pj_compare_datums')
179 INTEGER(kind=c_int) :: pj_compare_datums
180 END FUNCTION pj_compare_datums
184 FUNCTION pj_is_latlong(proj) bind(C,name='pj_is_latlong')
187 INTEGER(kind=c_int) :: pj_is_latlong
188 END FUNCTION pj_is_latlong
192 FUNCTION pj_is_geocent(proj) bind(C,name='pj_is_geocent')
195 INTEGER(kind=c_int) :: pj_is_geocent
196 END FUNCTION pj_is_geocent
200 FUNCTION pj_get_def(proj, options) bind(C,name='pj_get_def')
203 INTEGER(kind=c_int) :: options
204 TYPE(c_ptr) :: pj_get_def
205 END FUNCTION pj_get_def
210 FUNCTION pj_latlong_from_proj(proj) bind(C,name='pj_latlong_from_proj')
214 END FUNCTION pj_latlong_from_proj
238 SUBROUTINE pj_free(proj) bind(C,name='pj_free')
241 END SUBROUTINE pj_free
260FUNCTION pj_associated_object(arg1, arg2)
RESULT(associated_)
262TYPE(
pj_object),
INTENT(in),
OPTIONAL :: arg2
263LOGICAL :: associated_
264IF(
PRESENT(arg2))
THEN
265 associated_ = c_associated(arg1%ptr, arg2%ptr)
267 associated_ = c_associated(arg1%ptr)
269END FUNCTION pj_associated_object
278FUNCTION pj_transform_f(src, dst, x, y, z)
281REAL(kind=c_double),
TARGET :: x(:)
282REAL(kind=c_double),
TARGET :: y(:)
283REAL(kind=c_double),
TARGET,
OPTIONAL :: z(:)
284INTEGER(kind=c_int) :: pj_transform_f
286REAL(kind=c_double),
POINTER :: px, py, pz
296 pj_transform_f = pj_transform(src, dst, &
297 int(min(
SIZE(x),
SIZE(y),
SIZE(z)), kind=c_long), 1_c_int, c_loc(px), c_loc(py), c_loc(pz))
299 pj_transform_f = pj_transform(src, dst, &
300 int(min(
SIZE(x),
SIZE(y)), kind=c_long), 1_c_int, c_loc(px), c_loc(py), c_null_ptr)
303END FUNCTION pj_transform_f
311FUNCTION pj_datum_transform_f(src, dst, x, y, z)
314REAL(kind=c_double) :: x(:)
315REAL(kind=c_double) :: y(:)
316REAL(kind=c_double),
OPTIONAL :: z(:)
317INTEGER(kind=c_int) :: pj_datum_transform_f
319REAL(kind=c_double),
POINTER :: dummyz(:)
322 pj_datum_transform_f = pj_datum_transform(src, dst, &
323 int(min(
SIZE(x),
SIZE(y),
SIZE(z)), kind=c_long), 1_c_int, x, y, z)
326 pj_datum_transform_f = pj_datum_transform(src, dst, &
327 int(min(
SIZE(x),
SIZE(y)), kind=c_long), 1_c_int, x, y, dummyz)
330END FUNCTION pj_datum_transform_f
338FUNCTION pj_geocentric_to_geodetic_f(a, es, x, y, z)
339REAL(kind=c_double),
VALUE :: a
340REAL(kind=c_double),
VALUE :: es
341REAL(kind=c_double) :: x(:)
342REAL(kind=c_double) :: y(:)
343REAL(kind=c_double) :: z(:)
344INTEGER(kind=c_int) :: pj_geocentric_to_geodetic_f
346pj_geocentric_to_geodetic_f = &
347 pj_geocentric_to_geodetic(a, es, &
348 int(min(
SIZE(x),
SIZE(y),
SIZE(x)), kind=c_long), 1_c_int, x, y, z)
350END FUNCTION pj_geocentric_to_geodetic_f
358FUNCTION pj_geodetic_to_geocentric_f(a, es, x, y, z)
359REAL(kind=c_double),
VALUE :: a
360REAL(kind=c_double),
VALUE :: es
361REAL(kind=c_double) :: x(:)
362REAL(kind=c_double) :: y(:)
363REAL(kind=c_double) :: z(:)
364INTEGER(kind=c_int) :: pj_geodetic_to_geocentric_f
366pj_geodetic_to_geocentric_f = &
367 pj_geodetic_to_geocentric(a, es, &
368 int(min(
SIZE(x),
SIZE(y),
SIZE(x)), kind=c_long), 1_c_int, x, y, z)
370END FUNCTION pj_geodetic_to_geocentric_f
Fortran 2003 interface to the proj.4 https://github.com/OSGeo/proj.4 library.
Object describing a cartographic projection.