libsim Versione 7.1.11

◆ georef_coord_getval()

elemental subroutine georef_coord_getval ( type(georef_coord), intent(in)  this,
double precision, intent(out), optional  x,
double precision, intent(out), optional  y 
)
private

Query a georef_coord object.

This is the correct way to retrieve the contents of a georef_coord object, since its members are declared as PRIVATE. It is declared as ELEMENTAL, thus it works also on arrays of any shape and, in that case, the result will hae the same shape as this.

Parametri
[in]thisobject to query
[out]xx-coordinate
[out]yy-coordinate

Definizione alla linea 756 del file georef_coord_class.F90.

757! Copyright (C) 2010 ARPA-SIM <urpsim@smr.arpa.emr.it>
758! authors:
759! Davide Cesari <dcesari@arpa.emr.it>
760! Paolo Patruno <ppatruno@arpa.emr.it>
761
762! This program is free software; you can redistribute it and/or
763! modify it under the terms of the GNU General Public License as
764! published by the Free Software Foundation; either version 2 of
765! the License, or (at your option) any later version.
766
767! This program is distributed in the hope that it will be useful,
768! but WITHOUT ANY WARRANTY; without even the implied warranty of
769! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
770! GNU General Public License for more details.
771
772! You should have received a copy of the GNU General Public License
773! along with this program. If not, see <http://www.gnu.org/licenses/>.
774#include "config.h"
775
790USE err_handling
793USE geo_proj_class
794#ifdef HAVE_SHAPELIB
795USE shapelib
796#endif
797IMPLICIT NONE
798
803TYPE georef_coord
804 PRIVATE
805 DOUBLE PRECISION :: x=dmiss, y=dmiss
806END TYPE georef_coord
807
809TYPE(georef_coord),PARAMETER :: georef_coord_miss=georef_coord(dmiss,dmiss)
810
816 PRIVATE
817 INTEGER,ALLOCATABLE :: parts(:)
818 TYPE(georef_coord),ALLOCATABLE :: coord(:)
819 INTEGER :: topo=imiss
820 TYPE(geo_proj) :: proj
821 TYPE(georef_coord) :: bbox(2)=(/georef_coord_miss, georef_coord_miss/)
822 LOGICAL :: bbox_updated=.false.
823END TYPE georef_coord_array
824
825INTEGER,PARAMETER :: georef_coord_array_point = 1
826INTEGER,PARAMETER :: georef_coord_array_arc = 3
827INTEGER,PARAMETER :: georef_coord_array_polygon = 5
828INTEGER,PARAMETER :: georef_coord_array_multipoint = 8
829
830
834INTERFACE delete
835 MODULE PROCEDURE georef_coord_delete, georef_coord_array_delete
836END INTERFACE
837
839INTERFACE c_e
840 MODULE PROCEDURE georef_coord_c_e, georef_coord_array_c_e
841END INTERFACE
842
844INTERFACE getval
845 MODULE PROCEDURE georef_coord_getval, georef_coord_proj_getval, georef_coord_array_getval
846END INTERFACE
847
848INTERFACE compute_bbox
849 MODULE PROCEDURE georef_coord_array_compute_bbox
850END INTERFACE
851
853INTERFACE OPERATOR (==)
854 MODULE PROCEDURE georef_coord_eq
855END INTERFACE
856
858INTERFACE OPERATOR (/=)
859 MODULE PROCEDURE georef_coord_ne
860END INTERFACE
861
864INTERFACE OPERATOR (>=)
865 MODULE PROCEDURE georef_coord_ge
866END INTERFACE
867
870INTERFACE OPERATOR (<=)
871 MODULE PROCEDURE georef_coord_le
872END INTERFACE
873
874#ifdef HAVE_SHAPELIB
875
877INTERFACE import
878 MODULE PROCEDURE arrayof_georef_coord_array_import
879END INTERFACE
880
883INTERFACE export
884 MODULE PROCEDURE arrayof_georef_coord_array_export
885END INTERFACE
886#endif
887
890INTERFACE read_unit
891 MODULE PROCEDURE georef_coord_read_unit, georef_coord_vect_read_unit
892END INTERFACE
893
896INTERFACE write_unit
897 MODULE PROCEDURE georef_coord_write_unit, georef_coord_vect_write_unit
898END INTERFACE
899
901INTERFACE inside
902 MODULE PROCEDURE georef_coord_inside, georef_coord_inside_rectang
903END INTERFACE
904
906INTERFACE dist
907 MODULE PROCEDURE georef_coord_dist
908END INTERFACE
909
910#define ARRAYOF_ORIGTYPE TYPE(georef_coord_array)
911#define ARRAYOF_TYPE arrayof_georef_coord_array
912!define ARRAYOF_ORIGEQ 0
913#define ARRAYOF_ORIGDESTRUCTOR(x) CALL delete(x)
914#include "arrayof_pre.F90"
915! from arrayof
917
918PRIVATE
919PUBLIC georef_coord, georef_coord_miss, &
920 georef_coord_array, georef_coord_array_point, georef_coord_array_arc, &
921 georef_coord_array_polygon, georef_coord_array_multipoint, &
922 delete, c_e, getval, compute_bbox, OPERATOR(==), OPERATOR(/=), OPERATOR(>=), OPERATOR(<=), &
923#ifdef HAVE_SHAPELIB
924 import, export, &
925#endif
927 georef_coord_new, georef_coord_array_new
928
929CONTAINS
930
931#include "arrayof_post.F90"
932
933! ===================
934! == georef_coord ==
935! ===================
939FUNCTION georef_coord_new(x, y) RESULT(this)
940DOUBLE PRECISION,INTENT(in),OPTIONAL :: x
941DOUBLE PRECISION,INTENT(in),OPTIONAL :: y
942TYPE(georef_coord) :: this
943
944CALL optio(x, this%x)
945CALL optio(y, this%y)
946
947END FUNCTION georef_coord_new
948
949
950SUBROUTINE georef_coord_delete(this)
951TYPE(georef_coord),INTENT(inout) :: this
952
953this%x = dmiss
954this%y = dmiss
955
956END SUBROUTINE georef_coord_delete
957
958
959ELEMENTAL FUNCTION georef_coord_c_e(this) RESULT (res)
960TYPE(georef_coord),INTENT(in) :: this
961LOGICAL :: res
962
963res = .NOT. this == georef_coord_miss
964
965END FUNCTION georef_coord_c_e
966
967
974ELEMENTAL SUBROUTINE georef_coord_getval(this, x, y)
975TYPE(georef_coord),INTENT(in) :: this
976DOUBLE PRECISION,INTENT(out),OPTIONAL :: x
977DOUBLE PRECISION,INTENT(out),OPTIONAL :: y
978
979IF (PRESENT(x)) x = this%x
980IF (PRESENT(y)) y = this%y
981
982END SUBROUTINE georef_coord_getval
983
984
993ELEMENTAL SUBROUTINE georef_coord_proj_getval(this, proj, x, y, lon, lat)
994TYPE(georef_coord),INTENT(in) :: this
995TYPE(geo_proj),INTENT(in) :: proj
996DOUBLE PRECISION,INTENT(out),OPTIONAL :: x
997DOUBLE PRECISION,INTENT(out),OPTIONAL :: y
998DOUBLE PRECISION,INTENT(out),OPTIONAL :: lon
999DOUBLE PRECISION,INTENT(out),OPTIONAL :: lat
1000
1001DOUBLE PRECISION :: llon, llat
1002
1003IF (PRESENT(x)) x = this%x
1004IF (PRESENT(y)) y = this%y
1005IF (PRESENT(lon) .OR. present(lat)) THEN
1006 CALL unproj(proj, this%x, this%y, llon, llat)
1007 IF (PRESENT(lon)) lon = llon
1008 IF (PRESENT(lat)) lat = llat
1009ENDIF
1010
1011END SUBROUTINE georef_coord_proj_getval
1012
1013
1014! document and improve
1015ELEMENTAL FUNCTION getlat(this)
1016TYPE(georef_coord),INTENT(in) :: this ! oggetto di cui restituire latitudine
1017DOUBLE PRECISION :: getlat ! latitudine geografica
1018
1019getlat = this%y ! change!!!
1020
1021END FUNCTION getlat
1022
1023! document and improve
1024ELEMENTAL FUNCTION getlon(this)
1025TYPE(georef_coord),INTENT(in) :: this ! oggetto di cui restituire latitudine
1026DOUBLE PRECISION :: getlon ! longitudine geografica
1027
1028getlon = this%x ! change!!!
1029
1030END FUNCTION getlon
1031
1032
1033ELEMENTAL FUNCTION georef_coord_eq(this, that) RESULT(res)
1034TYPE(georef_coord),INTENT(IN) :: this, that
1035LOGICAL :: res
1036
1037res = (this%x == that%x .AND. this%y == that%y)
1038
1039END FUNCTION georef_coord_eq
1040
1041
1042ELEMENTAL FUNCTION georef_coord_ge(this, that) RESULT(res)
1043TYPE(georef_coord),INTENT(IN) :: this, that
1044LOGICAL :: res
1045
1046res = (this%x >= that%x .AND. this%y >= that%y)
1047
1048END FUNCTION georef_coord_ge
1049
1050
1051ELEMENTAL FUNCTION georef_coord_le(this, that) RESULT(res)
1052TYPE(georef_coord),INTENT(IN) :: this, that
1053LOGICAL :: res
1054
1055res = (this%x <= that%x .AND. this%y <= that%y)
1056
1057END FUNCTION georef_coord_le
1058
1059
1060ELEMENTAL FUNCTION georef_coord_ne(this, that) RESULT(res)
1061TYPE(georef_coord),INTENT(IN) :: this, that
1062LOGICAL :: res
1063
1064res = .NOT.(this == that)
1065
1066END FUNCTION georef_coord_ne
1067
1068
1074SUBROUTINE georef_coord_read_unit(this, unit)
1075TYPE(georef_coord),INTENT(out) :: this
1076INTEGER, INTENT(in) :: unit
1077
1078CALL georef_coord_vect_read_unit((/this/), unit)
1079
1080END SUBROUTINE georef_coord_read_unit
1081
1082
1088SUBROUTINE georef_coord_vect_read_unit(this, unit)
1089TYPE(georef_coord) :: this(:)
1090INTEGER, INTENT(in) :: unit
1091
1092CHARACTER(len=40) :: form
1093INTEGER :: i
1094
1095INQUIRE(unit, form=form)
1096IF (form == 'FORMATTED') THEN
1097 read(unit,*) (this(i)%x,this(i)%y, i=1,SIZE(this))
1098!TODO bug gfortran compiler !
1099!missing values are unredeable when formatted
1100ELSE
1101 READ(unit) (this(i)%x,this(i)%y, i=1,SIZE(this))
1102ENDIF
1103
1104END SUBROUTINE georef_coord_vect_read_unit
1105
1106
1111SUBROUTINE georef_coord_write_unit(this, unit)
1112TYPE(georef_coord),INTENT(in) :: this
1113INTEGER, INTENT(in) :: unit
1114
1115CALL georef_coord_vect_write_unit((/this/), unit)
1116
1117END SUBROUTINE georef_coord_write_unit
1118
1119
1124SUBROUTINE georef_coord_vect_write_unit(this, unit)
1125TYPE(georef_coord),INTENT(in) :: this(:)
1126INTEGER, INTENT(in) :: unit
1127
1128CHARACTER(len=40) :: form
1129INTEGER :: i
1130
1131INQUIRE(unit, form=form)
1132IF (form == 'FORMATTED') THEN
1133 WRITE(unit,*) (this(i)%x,this(i)%y, i=1,SIZE(this))
1134!TODO bug gfortran compiler !
1135!missing values are unredeable when formatted
1136ELSE
1137 WRITE(unit) (this(i)%x,this(i)%y, i=1,SIZE(this))
1138ENDIF
1139
1140END SUBROUTINE georef_coord_vect_write_unit
1141
1142
1145FUNCTION georef_coord_dist(this, that) RESULT(dist)
1147TYPE(georef_coord), INTENT (IN) :: this
1148TYPE(georef_coord), INTENT (IN) :: that
1149DOUBLE PRECISION :: dist
1150
1151DOUBLE PRECISION :: x,y
1152! Distanza approssimata, valida per piccoli angoli
1153
1154x = (this%x-that%x)*cos(((this%y+this%y)/2.)*degrad)
1155y = (this%y-that%y)
1156dist = sqrt(x**2 + y**2)*degrad*rearth
1157
1158END FUNCTION georef_coord_dist
1159
1160
1166FUNCTION georef_coord_inside_rectang(this, coordmin, coordmax) RESULT(res)
1167TYPE(georef_coord),INTENT(IN) :: this
1168TYPE(georef_coord),INTENT(IN) :: coordmin
1169TYPE(georef_coord),INTENT(IN) :: coordmax
1170LOGICAL :: res
1171
1172res = (this >= coordmin .AND. this <= coordmax)
1173
1174END FUNCTION georef_coord_inside_rectang
1175
1176
1177! ========================
1178! == georef_coord_array ==
1179! ========================
1185FUNCTION georef_coord_array_new(x, y, topo, proj) RESULT(this)
1186DOUBLE PRECISION,INTENT(in),OPTIONAL :: x(:)
1187DOUBLE PRECISION,INTENT(in),OPTIONAL :: y(:)
1188INTEGER,INTENT(in),OPTIONAL :: topo
1189TYPE(geo_proj),INTENT(in),OPTIONAL :: proj
1190TYPE(georef_coord_array) :: this
1191
1192INTEGER :: lsize
1193
1194IF (PRESENT(x) .AND. PRESENT(y)) THEN
1195 lsize = min(SIZE(x), SIZE(y))
1196 ALLOCATE(this%coord(lsize))
1197 this%coord(1:lsize)%x = x(1:lsize)
1198 this%coord(1:lsize)%y = y(1:lsize)
1199ENDIF
1200this%topo = optio_l(topo)
1201IF (PRESENT(proj)) this%proj = proj
1202
1203END FUNCTION georef_coord_array_new
1204
1205
1206SUBROUTINE georef_coord_array_delete(this)
1207TYPE(georef_coord_array),INTENT(inout) :: this
1208
1209TYPE(georef_coord_array) :: lobj
1210
1211this = lobj
1212
1213END SUBROUTINE georef_coord_array_delete
1214
1215
1216ELEMENTAL FUNCTION georef_coord_array_c_e(this) RESULT (res)
1217TYPE(georef_coord_array),INTENT(in) :: this
1218LOGICAL :: res
1219
1220res = ALLOCATED(this%coord)
1221
1222END FUNCTION georef_coord_array_c_e
1223
1224
1229SUBROUTINE georef_coord_array_getval(this, x, y, topo, proj)
1230TYPE(georef_coord_array),INTENT(in) :: this
1231DOUBLE PRECISION,OPTIONAL,ALLOCATABLE,INTENT(out) :: x(:)
1232DOUBLE PRECISION,OPTIONAL,ALLOCATABLE,INTENT(out) :: y(:)
1233! allocatable per vedere di nascosto l'effetto che fa
1234INTEGER,OPTIONAL,INTENT(out) :: topo
1235TYPE(geo_proj),OPTIONAL,INTENT(out) :: proj
1236
1237
1238IF (PRESENT(x)) THEN
1239 IF (ALLOCATED(this%coord)) THEN
1240 x = this%coord%x
1241 ENDIF
1242ENDIF
1243IF (PRESENT(y)) THEN
1244 IF (ALLOCATED(this%coord)) THEN
1245 y = this%coord%y
1246 ENDIF
1247ENDIF
1248IF (PRESENT(topo)) topo = this%topo
1249IF (PRESENT(proj)) proj = this%proj ! warning proj has no missing value yet
1250
1251END SUBROUTINE georef_coord_array_getval
1252
1253
1259SUBROUTINE georef_coord_array_compute_bbox(this)
1260TYPE(georef_coord_array),INTENT(inout) :: this
1261
1262IF (ALLOCATED(this%coord)) THEN
1263 this%bbox(1)%x = minval(this%coord(:)%x)
1264 this%bbox(1)%y = minval(this%coord(:)%y)
1265 this%bbox(2)%x = maxval(this%coord(:)%x)
1266 this%bbox(2)%y = maxval(this%coord(:)%y)
1267 this%bbox_updated = .true.
1268ENDIF
1269
1270END SUBROUTINE georef_coord_array_compute_bbox
1271
1272#ifdef HAVE_SHAPELIB
1273! internal method for importing a single shape
1274SUBROUTINE georef_coord_array_import(this, shphandle, nshp)
1275TYPE(georef_coord_array),INTENT(OUT) :: this
1276TYPE(shpfileobject),INTENT(INOUT) :: shphandle
1277INTEGER,INTENT(IN) :: nshp
1278
1279TYPE(shpobject) :: shpobj
1280
1281! read shape object
1282shpobj = shpreadobject(shphandle, nshp)
1283IF (.NOT.shpisnull(shpobj)) THEN
1284! import it in georef_coord object
1285 this = georef_coord_array_new(x=dble(shpobj%padfx), y=dble(shpobj%padfy), &
1286 topo=shpobj%nshptype)
1287 IF (shpobj%nparts > 1 .AND. ASSOCIATED(shpobj%panpartstart)) THEN
1288 this%parts = shpobj%panpartstart(:) ! automatic f95 allocation
1289 ELSE IF (ALLOCATED(this%parts)) THEN
1290 DEALLOCATE(this%parts)
1291 ENDIF
1292 CALL shpdestroyobject(shpobj)
1293 CALL compute_bbox(this)
1294ENDIF
1295
1296
1297END SUBROUTINE georef_coord_array_import
1298
1299
1300! internal method for exporting a single shape
1301SUBROUTINE georef_coord_array_export(this, shphandle, nshp)
1302TYPE(georef_coord_array),INTENT(in) :: this
1303TYPE(shpfileobject),INTENT(inout) :: shphandle
1304INTEGER,INTENT(IN) :: nshp ! index of shape to write starting from 0, -1 to append
1305
1306INTEGER :: i
1307TYPE(shpobject) :: shpobj
1308
1309IF (ALLOCATED(this%coord)) THEN
1310 IF (ALLOCATED(this%parts)) THEN
1311 shpobj = shpcreateobject(this%topo, -1, SIZE(this%parts), this%parts, &
1312 this%parts, SIZE(this%coord), this%coord(:)%x, this%coord(:)%y)
1313 ELSE
1314 shpobj = shpcreatesimpleobject(this%topo, SIZE(this%coord), &
1315 this%coord(:)%x, this%coord(:)%y)
1316 ENDIF
1317ELSE
1318 RETURN
1319ENDIF
1320
1321IF (.NOT.shpisnull(shpobj)) THEN
1322 i = shpwriteobject(shphandle, nshp, shpobj)
1323 CALL shpdestroyobject(shpobj)
1324ENDIF
1325
1326END SUBROUTINE georef_coord_array_export
1327
1328
1339SUBROUTINE arrayof_georef_coord_array_import(this, shpfile)
1340TYPE(arrayof_georef_coord_array),INTENT(out) :: this
1341CHARACTER(len=*),INTENT(in) :: shpfile
1342
1343REAL(kind=fp_d) :: minb(4), maxb(4)
1344INTEGER :: i, ns, shptype, dbfnf, dbfnr
1345TYPE(shpfileobject) :: shphandle
1346
1347shphandle = shpopen(trim(shpfile), 'rb')
1348IF (shpfileisnull(shphandle)) THEN
1349 ! log here
1350 CALL raise_error()
1351 RETURN
1352ENDIF
1353
1354! get info about file
1355CALL shpgetinfo(shphandle, ns, shptype, minb, maxb, dbfnf, dbfnr)
1356IF (ns > 0) THEN ! allocate and read the object
1357 CALL insert(this, nelem=ns)
1358 DO i = 1, ns
1359 CALL georef_coord_array_import(this%array(i), shphandle=shphandle, nshp=i-1)
1360 ENDDO
1361ENDIF
1362
1363CALL shpclose(shphandle)
1364! pack object to save memory
1365CALL packarray(this)
1366
1367END SUBROUTINE arrayof_georef_coord_array_import
1368
1369
1375SUBROUTINE arrayof_georef_coord_array_export(this, shpfile)
1376TYPE(arrayof_georef_coord_array),INTENT(in) :: this
1377CHARACTER(len=*),INTENT(in) :: shpfile
1378
1379INTEGER :: i
1380TYPE(shpfileobject) :: shphandle
1381
1382IF (this%arraysize > 0) THEN
1383 shphandle = shpcreate(trim(shpfile), this%array(1)%topo)
1384ELSE
1385 shphandle = shpcreate(trim(shpfile), georef_coord_array_polygon)
1386ENDIF
1387IF (shpfileisnull(shphandle)) THEN
1388 ! log here
1389 CALL raise_error()
1390 RETURN
1391ENDIF
1392
1393DO i = 1, this%arraysize
1394 CALL georef_coord_array_export(this%array(i), shphandle=shphandle, nshp=i-1)
1395ENDDO
1396
1397CALL shpclose(shphandle)
1398
1399END SUBROUTINE arrayof_georef_coord_array_export
1400#endif
1401
1413FUNCTION georef_coord_inside(this, poly) RESULT(inside)
1414TYPE(georef_coord), INTENT(IN) :: this
1415TYPE(georef_coord_array), INTENT(IN) :: poly
1416LOGICAL :: inside
1417
1418INTEGER :: i
1419
1420inside = .false.
1421IF (.NOT.c_e(this)) RETURN
1422IF (.NOT.ALLOCATED(poly%coord)) RETURN
1423! if outside bounding box stop here
1424IF (poly%bbox_updated) THEN
1425 IF (.NOT.georef_coord_inside_rectang(this, poly%bbox(1), poly%bbox(2))) RETURN
1426ENDIF
1427
1428IF (ALLOCATED(poly%parts)) THEN
1429 DO i = 1, SIZE(poly%parts)-1
1430 inside = inside .NEQV. pointinpoly(this%x, this%y, &
1431 poly%coord(poly%parts(i)+1:poly%parts(i+1))%x, &
1432 poly%coord(poly%parts(i)+1:poly%parts(i+1))%y)
1433 ENDDO
1434 IF (SIZE(poly%parts) > 0) THEN ! safety check
1435 inside = inside .NEQV. pointinpoly(this%x, this%y, &
1436 poly%coord(poly%parts(i)+1:)%x, &
1437 poly%coord(poly%parts(i)+1:)%y)
1438 ENDIF
1439
1440ELSE
1441 IF (SIZE(poly%coord) < 1) RETURN ! safety check
1442 inside = pointinpoly(this%x, this%y, &
1443 poly%coord(:)%x, poly%coord(:)%y)
1444ENDIF
1445
1446CONTAINS
1447
1448FUNCTION pointinpoly(x, y, px, py)
1449DOUBLE PRECISION, INTENT(in) :: x, y, px(:), py(:)
1450LOGICAL :: pointinpoly
1451
1452INTEGER :: i, j, starti
1453
1454pointinpoly = .false.
1455
1456IF (px(1) == px(SIZE(px)) .AND. py(1) == py(SIZE(px))) THEN ! closed polygon
1457 starti = 2
1458 j = 1
1459ELSE ! unclosed polygon
1460 starti = 1
1461 j = SIZE(px)
1462ENDIF
1463DO i = starti, SIZE(px)
1464 IF ((py(i) <= y .AND. y < py(j)) .OR. &
1465 (py(j) <= y .AND. y < py(i))) THEN
1466 IF (x < (px(j) - px(i)) * (y - py(i)) / (py(j) - py(i)) + px(i)) THEN
1467 pointinpoly = .NOT. pointinpoly
1468 ENDIF
1469 ENDIF
1470 j = i
1471ENDDO
1472
1473END FUNCTION pointinpoly
1474
1475END FUNCTION georef_coord_inside
1476
1477
1478
1479END MODULE georef_coord_class
Compute forward coordinate transformation from geographical system to projected system.
Compute backward coordinate transformation from projected system to geographical system.
Quick method to append an element to the array.
Detructors for the two classes.
Compute the distance in m between two points.
Export an array of georef_coord_array objects to a file in ESRI/Shapefile format.
Methods for returning the value of object members.
Import an array of georef_coord_array objects from a file in ESRI/Shapefile format.
Method for inserting elements of the array at a desired position.
Determine whether a point lies inside a polygon or a rectangle.
Method for packing the array object reducing at a minimum the memory occupation, without destroying i...
Read a single georef_coord object or an array of georef_coord objects from a Fortran FORMATTED or UNF...
Method for removing elements of the array at a desired position.
Write a single georef_coord object or an array of georef_coord objects to a Fortran FORMATTED or UNFO...
Generic subroutine for checking OPTIONAL parameters.
Costanti fisiche (DOUBLEPRECISION).
Definition: phys_const.f90:72
Gestione degli errori.
This module defines objects describing georeferenced sparse points possibly with topology and project...
Definitions of constants and functions for working with missing values.
Module for quickly interpreting the OPTIONAL parameters passed to a subprogram.
Derived type defining a one-dimensional array of georeferenced points with an associated topology (is...
Derive type defining a single georeferenced point, either in geodetic or in projected coordinates.

Generated with Doxygen.