The following functions and subroutines are directly interfaced to their corresponding C version, so they are undocumented here, please refer to the original proj C API documentation, e.g. at the address https://proj.org/development/reference/index.html , for their use:
Some of these functions have also a more Fortran-friendly interface explicitely documented here, with an _f appended to the name.
PROGRAM proj_test6
use,INTRINSIC :: iso_c_binding
IMPLICIT none
TYPE(pj_object) :: pj, pjf, pjt
TYPE(pj_coord_object) :: coordg, coordp, coordgc, &
vcoordg(4), vcoordp(4), vcoordgc(4)
TYPE(pj_area_object) :: area
INTEGER :: res
CHARACTER(len=512) :: proj_stringf, proj_stringt
proj_stringf = 'EPSG:4326'
proj_stringt = '+proj=utm +zone=32 +datum=WGS84 +units=m +no_defs +type=crs'
print*,'from: ',trim(proj_stringf)
print*,'to: ',trim(proj_stringt)
print*,'Defining a projection object'
pj = proj_create_crs_to_crs(pj_default_ctx, trim(proj_stringf)//char(0), &
trim(proj_stringt)//char(0), area)
print*,'Converting through a pj_coord object'
coordg%x = 45.0d0
coordg%y = 11.0d0
coordp = proj_trans(pj, pj_fwd, coordg)
coordgc = proj_trans(pj, pj_inv, coordp)
print*,'Original:',coordg
print*,'Projected:',coordp
print*,'Returned:',coordgc
IF (abs(coordgc%x-coordg%x) > 1.0d-8 .OR. abs(coordgc%y-coordg%y) > 1.0d-8) THEN
print*,'Error pj_inv*pj_fwd failed or /= identity'
CALL exit(1)
ENDIF
pj = proj_destroy(pj)
pjf = proj_create(pj_default_ctx, trim(proj_stringf)//char(0))
print*,'Failing to define projection object from ',trim(proj_stringf)
CALL print_error(pj_default_ctx)
CALL exit(1)
ENDIF
CALL print_info(proj_pj_info(pjf))
pjt = proj_create(pj_default_ctx, trim(proj_stringt)//char(0))
print*,'Failing to define projection object from ',trim(proj_stringt)
CALL print_error(pj_default_ctx)
CALL exit(1)
ENDIF
CALL print_info(proj_pj_info(pjt))
print*,'Defining a projection object'
pj = proj_create_crs_to_crs_from_pj(pj_default_ctx, pjf, pjt, area, c_null_ptr)
print*,'Failing to define projection object'
CALL print_error(pj_default_ctx)
CALL exit(1)
ENDIF
print*,'Converting through a pj_coord array object'
vcoordg(:)%x = (/45.0d0,45.0d0,46.0d0,46.0d0/)
vcoordg(:)%y = (/11.0d0,12.0d0,11.0d0,12.0d0/)
vcoordp = vcoordg
res = proj_trans_f(pj, pj_fwd, vcoordp)
IF (res /= 0) THEN
print*,'Failure in forward array transformation',res
CALL print_error(pj_default_ctx)
ENDIF
vcoordgc = vcoordp
res = proj_trans_f(pj, pj_inv, vcoordgc)
IF (res /= 0) THEN
print*,'Failure in inverse array transformation',res
CALL print_error(pj_default_ctx)
CALL exit(1)
ENDIF
print*,'Original:',vcoordg%x,vcoordg%y
print*,'Projected:',vcoordp%x,vcoordp%y
print*,'Returned:',vcoordgc%x,vcoordgc%y
IF (maxval(abs(vcoordgc%x-vcoordg%x)) > 1.0d-8 .OR. &
maxval(abs(vcoordgc%y-vcoordg%y)) > 1.0d-8) THEN
print*,'Error pj_inv*pj_fwd failed or /= identity'
CALL exit(1)
ENDIF
pj = proj_destroy(pj)
CONTAINS
SUBROUTINE print_info(info)
TYPE(pj_proj_info_object),INTENT(in) :: info
print*,'==== Object information ===='
print*,
'desc:',trim(
strtofchar(info%description,256))
print*,
'def:',trim(
strtofchar(info%definition,256))
print*,'has inv:',info%has_inverse
print*,'accuracy:',info%accuracy
print*,'============================'
END SUBROUTINE print_info
SUBROUTINE print_error(ctx)
TYPE(pj_context_object),INTENT(in) :: ctx
IF (proj_context_errno(ctx) /= 0) THEN
print*,trim(
strtofchar(proj_errno_string(proj_context_errno(ctx)), 256))
ENDIF
END SUBROUTINE print_error
END PROGRAM proj_test6
Convert a null-terminated C string into a Fortran CHARACTER variable of the proper length.
Test whether an opaque object is valid.
Utility module for supporting Fortran 2003 C language interface module.
Fortran 2003 interface to the proj https://proj.org/ library, API version 6.