libsim Versione 7.1.11

◆ georef_coord_inside()

logical function georef_coord_inside ( type(georef_coord), intent(in)  this,
type(georef_coord_array), intent(in)  poly 
)
private

Determines whether the point this lies inside the polygon poly.

The polygon is forced to be closed if it is not already the case, and there is no check about the topology of poly to really be of polygon type. It works also with polygons in parts (as from shapefile specification) defining either multiple polygons or polygons with holes.

The method used consists in counting the number of intersections as indicated in comp.graphics.algorithms FAQ (http://www.faqs.org/faqs/graphics/algorithms-faq/) or in http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html.

Parametri
[in]thisoggetto di cui determinare la posizione
[in]polypoligono contenitore

Definizione alla linea 1195 del file georef_coord_class.F90.

1196! Copyright (C) 2010 ARPA-SIM <urpsim@smr.arpa.emr.it>
1197! authors:
1198! Davide Cesari <dcesari@arpa.emr.it>
1199! Paolo Patruno <ppatruno@arpa.emr.it>
1200
1201! This program is free software; you can redistribute it and/or
1202! modify it under the terms of the GNU General Public License as
1203! published by the Free Software Foundation; either version 2 of
1204! the License, or (at your option) any later version.
1205
1206! This program is distributed in the hope that it will be useful,
1207! but WITHOUT ANY WARRANTY; without even the implied warranty of
1208! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1209! GNU General Public License for more details.
1210
1211! You should have received a copy of the GNU General Public License
1212! along with this program. If not, see <http://www.gnu.org/licenses/>.
1213#include "config.h"
1214
1228MODULE georef_coord_class
1229USE err_handling
1232USE geo_proj_class
1233#ifdef HAVE_SHAPELIB
1234USE shapelib
1235#endif
1236IMPLICIT NONE
1237
1242TYPE georef_coord
1243 PRIVATE
1244 DOUBLE PRECISION :: x=dmiss, y=dmiss
1245END TYPE georef_coord
1246
1248TYPE(georef_coord),PARAMETER :: georef_coord_miss=georef_coord(dmiss,dmiss)
1249
1255 PRIVATE
1256 INTEGER,ALLOCATABLE :: parts(:)
1257 TYPE(georef_coord),ALLOCATABLE :: coord(:)
1258 INTEGER :: topo=imiss
1259 TYPE(geo_proj) :: proj
1260 TYPE(georef_coord) :: bbox(2)=(/georef_coord_miss, georef_coord_miss/)
1261 LOGICAL :: bbox_updated=.false.
1262END TYPE georef_coord_array
1263
1264INTEGER,PARAMETER :: georef_coord_array_point = 1
1265INTEGER,PARAMETER :: georef_coord_array_arc = 3
1266INTEGER,PARAMETER :: georef_coord_array_polygon = 5
1267INTEGER,PARAMETER :: georef_coord_array_multipoint = 8
1268
1269
1273INTERFACE delete
1274 MODULE PROCEDURE georef_coord_delete, georef_coord_array_delete
1275END INTERFACE
1276
1278INTERFACE c_e
1279 MODULE PROCEDURE georef_coord_c_e, georef_coord_array_c_e
1280END INTERFACE
1281
1283INTERFACE getval
1284 MODULE PROCEDURE georef_coord_getval, georef_coord_proj_getval, georef_coord_array_getval
1285END INTERFACE
1286
1287INTERFACE compute_bbox
1288 MODULE PROCEDURE georef_coord_array_compute_bbox
1289END INTERFACE
1290
1292INTERFACE OPERATOR (==)
1293 MODULE PROCEDURE georef_coord_eq
1294END INTERFACE
1295
1297INTERFACE OPERATOR (/=)
1298 MODULE PROCEDURE georef_coord_ne
1299END INTERFACE
1300
1303INTERFACE OPERATOR (>=)
1304 MODULE PROCEDURE georef_coord_ge
1305END INTERFACE
1306
1309INTERFACE OPERATOR (<=)
1310 MODULE PROCEDURE georef_coord_le
1311END INTERFACE
1312
1313#ifdef HAVE_SHAPELIB
1314
1316INTERFACE import
1317 MODULE PROCEDURE arrayof_georef_coord_array_import
1318END INTERFACE
1319
1322INTERFACE export
1323 MODULE PROCEDURE arrayof_georef_coord_array_export
1324END INTERFACE
1325#endif
1326
1329INTERFACE read_unit
1330 MODULE PROCEDURE georef_coord_read_unit, georef_coord_vect_read_unit
1331END INTERFACE
1332
1335INTERFACE write_unit
1336 MODULE PROCEDURE georef_coord_write_unit, georef_coord_vect_write_unit
1337END INTERFACE
1338
1340INTERFACE inside
1341 MODULE PROCEDURE georef_coord_inside, georef_coord_inside_rectang
1342END INTERFACE
1343
1345INTERFACE dist
1346 MODULE PROCEDURE georef_coord_dist
1347END INTERFACE
1348
1349#define ARRAYOF_ORIGTYPE TYPE(georef_coord_array)
1350#define ARRAYOF_TYPE arrayof_georef_coord_array
1351!define ARRAYOF_ORIGEQ 0
1352#define ARRAYOF_ORIGDESTRUCTOR(x) CALL delete(x)
1353#include "arrayof_pre.F90"
1354! from arrayof
1355PUBLIC insert, append, remove, packarray
1356
1357PRIVATE
1358PUBLIC georef_coord, georef_coord_miss, &
1359 georef_coord_array, georef_coord_array_point, georef_coord_array_arc, &
1360 georef_coord_array_polygon, georef_coord_array_multipoint, &
1361 delete, c_e, getval, compute_bbox, OPERATOR(==), OPERATOR(/=), OPERATOR(>=), OPERATOR(<=), &
1362#ifdef HAVE_SHAPELIB
1363 import, export, &
1364#endif
1366 georef_coord_new, georef_coord_array_new
1367
1368CONTAINS
1369
1370#include "arrayof_post.F90"
1371
1372! ===================
1373! == georef_coord ==
1374! ===================
1378FUNCTION georef_coord_new(x, y) RESULT(this)
1379DOUBLE PRECISION,INTENT(in),OPTIONAL :: x
1380DOUBLE PRECISION,INTENT(in),OPTIONAL :: y
1381TYPE(georef_coord) :: this
1382
1383CALL optio(x, this%x)
1384CALL optio(y, this%y)
1385
1386END FUNCTION georef_coord_new
1387
1388
1389SUBROUTINE georef_coord_delete(this)
1390TYPE(georef_coord),INTENT(inout) :: this
1391
1392this%x = dmiss
1393this%y = dmiss
1394
1395END SUBROUTINE georef_coord_delete
1396
1397
1398ELEMENTAL FUNCTION georef_coord_c_e(this) RESULT (res)
1399TYPE(georef_coord),INTENT(in) :: this
1400LOGICAL :: res
1401
1402res = .NOT. this == georef_coord_miss
1403
1404END FUNCTION georef_coord_c_e
1405
1406
1413ELEMENTAL SUBROUTINE georef_coord_getval(this, x, y)
1414TYPE(georef_coord),INTENT(in) :: this
1415DOUBLE PRECISION,INTENT(out),OPTIONAL :: x
1416DOUBLE PRECISION,INTENT(out),OPTIONAL :: y
1417
1418IF (PRESENT(x)) x = this%x
1419IF (PRESENT(y)) y = this%y
1420
1421END SUBROUTINE georef_coord_getval
1422
1423
1432ELEMENTAL SUBROUTINE georef_coord_proj_getval(this, proj, x, y, lon, lat)
1433TYPE(georef_coord),INTENT(in) :: this
1434TYPE(geo_proj),INTENT(in) :: proj
1435DOUBLE PRECISION,INTENT(out),OPTIONAL :: x
1436DOUBLE PRECISION,INTENT(out),OPTIONAL :: y
1437DOUBLE PRECISION,INTENT(out),OPTIONAL :: lon
1438DOUBLE PRECISION,INTENT(out),OPTIONAL :: lat
1439
1440DOUBLE PRECISION :: llon, llat
1441
1442IF (PRESENT(x)) x = this%x
1443IF (PRESENT(y)) y = this%y
1444IF (PRESENT(lon) .OR. present(lat)) THEN
1445 CALL unproj(proj, this%x, this%y, llon, llat)
1446 IF (PRESENT(lon)) lon = llon
1447 IF (PRESENT(lat)) lat = llat
1448ENDIF
1449
1450END SUBROUTINE georef_coord_proj_getval
1451
1452
1453! document and improve
1454ELEMENTAL FUNCTION getlat(this)
1455TYPE(georef_coord),INTENT(in) :: this ! oggetto di cui restituire latitudine
1456DOUBLE PRECISION :: getlat ! latitudine geografica
1457
1458getlat = this%y ! change!!!
1459
1460END FUNCTION getlat
1461
1462! document and improve
1463ELEMENTAL FUNCTION getlon(this)
1464TYPE(georef_coord),INTENT(in) :: this ! oggetto di cui restituire latitudine
1465DOUBLE PRECISION :: getlon ! longitudine geografica
1466
1467getlon = this%x ! change!!!
1468
1469END FUNCTION getlon
1470
1471
1472ELEMENTAL FUNCTION georef_coord_eq(this, that) RESULT(res)
1473TYPE(georef_coord),INTENT(IN) :: this, that
1474LOGICAL :: res
1475
1476res = (this%x == that%x .AND. this%y == that%y)
1477
1478END FUNCTION georef_coord_eq
1479
1480
1481ELEMENTAL FUNCTION georef_coord_ge(this, that) RESULT(res)
1482TYPE(georef_coord),INTENT(IN) :: this, that
1483LOGICAL :: res
1484
1485res = (this%x >= that%x .AND. this%y >= that%y)
1486
1487END FUNCTION georef_coord_ge
1488
1489
1490ELEMENTAL FUNCTION georef_coord_le(this, that) RESULT(res)
1491TYPE(georef_coord),INTENT(IN) :: this, that
1492LOGICAL :: res
1493
1494res = (this%x <= that%x .AND. this%y <= that%y)
1495
1496END FUNCTION georef_coord_le
1497
1498
1499ELEMENTAL FUNCTION georef_coord_ne(this, that) RESULT(res)
1500TYPE(georef_coord),INTENT(IN) :: this, that
1501LOGICAL :: res
1502
1503res = .NOT.(this == that)
1504
1505END FUNCTION georef_coord_ne
1506
1507
1513SUBROUTINE georef_coord_read_unit(this, unit)
1514TYPE(georef_coord),INTENT(out) :: this
1515INTEGER, INTENT(in) :: unit
1516
1517CALL georef_coord_vect_read_unit((/this/), unit)
1518
1519END SUBROUTINE georef_coord_read_unit
1520
1521
1527SUBROUTINE georef_coord_vect_read_unit(this, unit)
1528TYPE(georef_coord) :: this(:)
1529INTEGER, INTENT(in) :: unit
1530
1531CHARACTER(len=40) :: form
1532INTEGER :: i
1533
1534INQUIRE(unit, form=form)
1535IF (form == 'FORMATTED') THEN
1536 read(unit,*) (this(i)%x,this(i)%y, i=1,SIZE(this))
1537!TODO bug gfortran compiler !
1538!missing values are unredeable when formatted
1539ELSE
1540 READ(unit) (this(i)%x,this(i)%y, i=1,SIZE(this))
1541ENDIF
1542
1543END SUBROUTINE georef_coord_vect_read_unit
1544
1545
1550SUBROUTINE georef_coord_write_unit(this, unit)
1551TYPE(georef_coord),INTENT(in) :: this
1552INTEGER, INTENT(in) :: unit
1553
1554CALL georef_coord_vect_write_unit((/this/), unit)
1555
1556END SUBROUTINE georef_coord_write_unit
1557
1558
1563SUBROUTINE georef_coord_vect_write_unit(this, unit)
1564TYPE(georef_coord),INTENT(in) :: this(:)
1565INTEGER, INTENT(in) :: unit
1566
1567CHARACTER(len=40) :: form
1568INTEGER :: i
1569
1570INQUIRE(unit, form=form)
1571IF (form == 'FORMATTED') THEN
1572 WRITE(unit,*) (this(i)%x,this(i)%y, i=1,SIZE(this))
1573!TODO bug gfortran compiler !
1574!missing values are unredeable when formatted
1575ELSE
1576 WRITE(unit) (this(i)%x,this(i)%y, i=1,SIZE(this))
1577ENDIF
1578
1579END SUBROUTINE georef_coord_vect_write_unit
1580
1581
1584FUNCTION georef_coord_dist(this, that) RESULT(dist)
1586TYPE(georef_coord), INTENT (IN) :: this
1587TYPE(georef_coord), INTENT (IN) :: that
1588DOUBLE PRECISION :: dist
1589
1590DOUBLE PRECISION :: x,y
1591! Distanza approssimata, valida per piccoli angoli
1592
1593x = (this%x-that%x)*cos(((this%y+this%y)/2.)*degrad)
1594y = (this%y-that%y)
1595dist = sqrt(x**2 + y**2)*degrad*rearth
1596
1597END FUNCTION georef_coord_dist
1598
1599
1605FUNCTION georef_coord_inside_rectang(this, coordmin, coordmax) RESULT(res)
1606TYPE(georef_coord),INTENT(IN) :: this
1607TYPE(georef_coord),INTENT(IN) :: coordmin
1608TYPE(georef_coord),INTENT(IN) :: coordmax
1609LOGICAL :: res
1610
1611res = (this >= coordmin .AND. this <= coordmax)
1612
1613END FUNCTION georef_coord_inside_rectang
1614
1615
1616! ========================
1617! == georef_coord_array ==
1618! ========================
1624FUNCTION georef_coord_array_new(x, y, topo, proj) RESULT(this)
1625DOUBLE PRECISION,INTENT(in),OPTIONAL :: x(:)
1626DOUBLE PRECISION,INTENT(in),OPTIONAL :: y(:)
1627INTEGER,INTENT(in),OPTIONAL :: topo
1628TYPE(geo_proj),INTENT(in),OPTIONAL :: proj
1629TYPE(georef_coord_array) :: this
1630
1631INTEGER :: lsize
1632
1633IF (PRESENT(x) .AND. PRESENT(y)) THEN
1634 lsize = min(SIZE(x), SIZE(y))
1635 ALLOCATE(this%coord(lsize))
1636 this%coord(1:lsize)%x = x(1:lsize)
1637 this%coord(1:lsize)%y = y(1:lsize)
1638ENDIF
1639this%topo = optio_l(topo)
1640IF (PRESENT(proj)) this%proj = proj
1641
1642END FUNCTION georef_coord_array_new
1643
1644
1645SUBROUTINE georef_coord_array_delete(this)
1646TYPE(georef_coord_array),INTENT(inout) :: this
1647
1648TYPE(georef_coord_array) :: lobj
1649
1650this = lobj
1651
1652END SUBROUTINE georef_coord_array_delete
1653
1654
1655ELEMENTAL FUNCTION georef_coord_array_c_e(this) RESULT (res)
1656TYPE(georef_coord_array),INTENT(in) :: this
1657LOGICAL :: res
1658
1659res = ALLOCATED(this%coord)
1660
1661END FUNCTION georef_coord_array_c_e
1662
1663
1668SUBROUTINE georef_coord_array_getval(this, x, y, topo, proj)
1669TYPE(georef_coord_array),INTENT(in) :: this
1670DOUBLE PRECISION,OPTIONAL,ALLOCATABLE,INTENT(out) :: x(:)
1671DOUBLE PRECISION,OPTIONAL,ALLOCATABLE,INTENT(out) :: y(:)
1672! allocatable per vedere di nascosto l'effetto che fa
1673INTEGER,OPTIONAL,INTENT(out) :: topo
1674TYPE(geo_proj),OPTIONAL,INTENT(out) :: proj
1675
1676
1677IF (PRESENT(x)) THEN
1678 IF (ALLOCATED(this%coord)) THEN
1679 x = this%coord%x
1680 ENDIF
1681ENDIF
1682IF (PRESENT(y)) THEN
1683 IF (ALLOCATED(this%coord)) THEN
1684 y = this%coord%y
1685 ENDIF
1686ENDIF
1687IF (PRESENT(topo)) topo = this%topo
1688IF (PRESENT(proj)) proj = this%proj ! warning proj has no missing value yet
1689
1690END SUBROUTINE georef_coord_array_getval
1691
1692
1698SUBROUTINE georef_coord_array_compute_bbox(this)
1699TYPE(georef_coord_array),INTENT(inout) :: this
1700
1701IF (ALLOCATED(this%coord)) THEN
1702 this%bbox(1)%x = minval(this%coord(:)%x)
1703 this%bbox(1)%y = minval(this%coord(:)%y)
1704 this%bbox(2)%x = maxval(this%coord(:)%x)
1705 this%bbox(2)%y = maxval(this%coord(:)%y)
1706 this%bbox_updated = .true.
1707ENDIF
1708
1709END SUBROUTINE georef_coord_array_compute_bbox
1710
1711#ifdef HAVE_SHAPELIB
1712! internal method for importing a single shape
1713SUBROUTINE georef_coord_array_import(this, shphandle, nshp)
1714TYPE(georef_coord_array),INTENT(OUT) :: this
1715TYPE(shpfileobject),INTENT(INOUT) :: shphandle
1716INTEGER,INTENT(IN) :: nshp
1717
1718TYPE(shpobject) :: shpobj
1719
1720! read shape object
1721shpobj = shpreadobject(shphandle, nshp)
1722IF (.NOT.shpisnull(shpobj)) THEN
1723! import it in georef_coord object
1724 this = georef_coord_array_new(x=dble(shpobj%padfx), y=dble(shpobj%padfy), &
1725 topo=shpobj%nshptype)
1726 IF (shpobj%nparts > 1 .AND. ASSOCIATED(shpobj%panpartstart)) THEN
1727 this%parts = shpobj%panpartstart(:) ! automatic f95 allocation
1728 ELSE IF (ALLOCATED(this%parts)) THEN
1729 DEALLOCATE(this%parts)
1730 ENDIF
1731 CALL shpdestroyobject(shpobj)
1732 CALL compute_bbox(this)
1733ENDIF
1734
1735
1736END SUBROUTINE georef_coord_array_import
1737
1738
1739! internal method for exporting a single shape
1740SUBROUTINE georef_coord_array_export(this, shphandle, nshp)
1741TYPE(georef_coord_array),INTENT(in) :: this
1742TYPE(shpfileobject),INTENT(inout) :: shphandle
1743INTEGER,INTENT(IN) :: nshp ! index of shape to write starting from 0, -1 to append
1744
1745INTEGER :: i
1746TYPE(shpobject) :: shpobj
1747
1748IF (ALLOCATED(this%coord)) THEN
1749 IF (ALLOCATED(this%parts)) THEN
1750 shpobj = shpcreateobject(this%topo, -1, SIZE(this%parts), this%parts, &
1751 this%parts, SIZE(this%coord), this%coord(:)%x, this%coord(:)%y)
1752 ELSE
1753 shpobj = shpcreatesimpleobject(this%topo, SIZE(this%coord), &
1754 this%coord(:)%x, this%coord(:)%y)
1755 ENDIF
1756ELSE
1757 RETURN
1758ENDIF
1759
1760IF (.NOT.shpisnull(shpobj)) THEN
1761 i = shpwriteobject(shphandle, nshp, shpobj)
1762 CALL shpdestroyobject(shpobj)
1763ENDIF
1764
1765END SUBROUTINE georef_coord_array_export
1766
1767
1778SUBROUTINE arrayof_georef_coord_array_import(this, shpfile)
1779TYPE(arrayof_georef_coord_array),INTENT(out) :: this
1780CHARACTER(len=*),INTENT(in) :: shpfile
1781
1782REAL(kind=fp_d) :: minb(4), maxb(4)
1783INTEGER :: i, ns, shptype, dbfnf, dbfnr
1784TYPE(shpfileobject) :: shphandle
1785
1786shphandle = shpopen(trim(shpfile), 'rb')
1787IF (shpfileisnull(shphandle)) THEN
1788 ! log here
1789 CALL raise_error()
1790 RETURN
1791ENDIF
1792
1793! get info about file
1794CALL shpgetinfo(shphandle, ns, shptype, minb, maxb, dbfnf, dbfnr)
1795IF (ns > 0) THEN ! allocate and read the object
1796 CALL insert(this, nelem=ns)
1797 DO i = 1, ns
1798 CALL georef_coord_array_import(this%array(i), shphandle=shphandle, nshp=i-1)
1799 ENDDO
1800ENDIF
1801
1802CALL shpclose(shphandle)
1803! pack object to save memory
1804CALL packarray(this)
1805
1806END SUBROUTINE arrayof_georef_coord_array_import
1807
1808
1814SUBROUTINE arrayof_georef_coord_array_export(this, shpfile)
1815TYPE(arrayof_georef_coord_array),INTENT(in) :: this
1816CHARACTER(len=*),INTENT(in) :: shpfile
1817
1818INTEGER :: i
1819TYPE(shpfileobject) :: shphandle
1820
1821IF (this%arraysize > 0) THEN
1822 shphandle = shpcreate(trim(shpfile), this%array(1)%topo)
1823ELSE
1824 shphandle = shpcreate(trim(shpfile), georef_coord_array_polygon)
1825ENDIF
1826IF (shpfileisnull(shphandle)) THEN
1827 ! log here
1828 CALL raise_error()
1829 RETURN
1830ENDIF
1831
1832DO i = 1, this%arraysize
1833 CALL georef_coord_array_export(this%array(i), shphandle=shphandle, nshp=i-1)
1834ENDDO
1835
1836CALL shpclose(shphandle)
1837
1838END SUBROUTINE arrayof_georef_coord_array_export
1839#endif
1840
1852FUNCTION georef_coord_inside(this, poly) RESULT(inside)
1853TYPE(georef_coord), INTENT(IN) :: this
1854TYPE(georef_coord_array), INTENT(IN) :: poly
1855LOGICAL :: inside
1856
1857INTEGER :: i
1858
1859inside = .false.
1860IF (.NOT.c_e(this)) RETURN
1861IF (.NOT.ALLOCATED(poly%coord)) RETURN
1862! if outside bounding box stop here
1863IF (poly%bbox_updated) THEN
1864 IF (.NOT.georef_coord_inside_rectang(this, poly%bbox(1), poly%bbox(2))) RETURN
1865ENDIF
1866
1867IF (ALLOCATED(poly%parts)) THEN
1868 DO i = 1, SIZE(poly%parts)-1
1869 inside = inside .NEQV. pointinpoly(this%x, this%y, &
1870 poly%coord(poly%parts(i)+1:poly%parts(i+1))%x, &
1871 poly%coord(poly%parts(i)+1:poly%parts(i+1))%y)
1872 ENDDO
1873 IF (SIZE(poly%parts) > 0) THEN ! safety check
1874 inside = inside .NEQV. pointinpoly(this%x, this%y, &
1875 poly%coord(poly%parts(i)+1:)%x, &
1876 poly%coord(poly%parts(i)+1:)%y)
1877 ENDIF
1878
1879ELSE
1880 IF (SIZE(poly%coord) < 1) RETURN ! safety check
1881 inside = pointinpoly(this%x, this%y, &
1882 poly%coord(:)%x, poly%coord(:)%y)
1883ENDIF
1884
1885CONTAINS
1886
1887FUNCTION pointinpoly(x, y, px, py)
1888DOUBLE PRECISION, INTENT(in) :: x, y, px(:), py(:)
1889LOGICAL :: pointinpoly
1890
1891INTEGER :: i, j, starti
1892
1893pointinpoly = .false.
1894
1895IF (px(1) == px(SIZE(px)) .AND. py(1) == py(SIZE(px))) THEN ! closed polygon
1896 starti = 2
1897 j = 1
1898ELSE ! unclosed polygon
1899 starti = 1
1900 j = SIZE(px)
1901ENDIF
1902DO i = starti, SIZE(px)
1903 IF ((py(i) <= y .AND. y < py(j)) .OR. &
1904 (py(j) <= y .AND. y < py(i))) THEN
1905 IF (x < (px(j) - px(i)) * (y - py(i)) / (py(j) - py(i)) + px(i)) THEN
1906 pointinpoly = .NOT. pointinpoly
1907 ENDIF
1908 ENDIF
1909 j = i
1910ENDDO
1911
1912END FUNCTION pointinpoly
1913
1914END FUNCTION georef_coord_inside
1915
1916
1917
1918END 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.