Differenze tra le versioni di "Ottenere informazioni da un file GEOTIFF con l'API di libgeotiff"

Da Gambas-it.org - Wikipedia.
 
(7 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
 
Il file ''GEOTIFF'' è un file di formato TIFF georeferenziato. Esso contiene Metadati in forma di tag che fanno riferimento ad informazioni geografiche.
 
Il file ''GEOTIFF'' è un file di formato TIFF georeferenziato. Esso contiene Metadati in forma di tag che fanno riferimento ad informazioni geografiche.
  
Per estrarre da un file tiff georeferenziato (geotiff) tali informazioni, è necessario avere installata nel sistema e richiamare in Gambas la libreria condivisa: "''libgeotiff.so.2.1.2''"
+
Per estrarre da un file tiff georeferenziato (geotiff) tali informazioni, è necessario avere installata nel sistema e richiamare in Gambas la libreria condivisa: "''libgeotiff.so.5.2.1'' ".
 
 
  
 
Mostriamo un esempio pratico:
 
Mostriamo un esempio pratico:
  Library "libgeotiff:2.1.2"
+
  Library "<FONT Color=blue>libgeotiff:5.2.1</font>"
 
   
 
   
 
  Public Struct TIFFMethod_t
 
  Public Struct TIFFMethod_t
Riga 101: Riga 100:
 
   
 
   
 
   
 
   
  Library "libc:6"
+
  Library "<FONT Color=green>libc:6</font>"
 
   
 
   
 
  <FONT Color=gray>' ''FILE *fopen (const char *__filename, const char *__modes)''
 
  <FONT Color=gray>' ''FILE *fopen (const char *__filename, const char *__modes)''
Riga 112: Riga 111:
 
   
 
   
 
   
 
   
  Library "libtiff:5.3.0"
+
  Library "<FONT Color=red>libtiff:5.7.0</font>"
 
   
 
   
 
  Private Const TIFFTAG_IMAGEWIDTH As Integer = 256
 
  Private Const TIFFTAG_IMAGEWIDTH As Integer = 256
Riga 122: Riga 121:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim tf, p As Pointer
 
   Dim tf, p As Pointer
Riga 130: Riga 129:
 
    
 
    
 
  <FONT Color=gray>' ''Carica un file georeferenziato (GEOTIFF):''</font>
 
  <FONT Color=gray>' ''Carica un file georeferenziato (GEOTIFF):''</font>
   tf = XTIFFOpen("<FONT Color=gray>''/percorso/del/file.tif''</font>", "r")
+
   tf = XTIFFOpen("<FONT Color=darkgreen>''/percorso/del/file.tif''</font>", "r")
 
   If tf == 0 Then Error.Raise("Errore !")
 
   If tf == 0 Then Error.Raise("Errore !")
 
    
 
    
Riga 142: Riga 141:
 
   Print
 
   Print
 
   p = fopen("/dev/stdout", "w")
 
   p = fopen("/dev/stdout", "w")
   If GTIFGetDefn(gt, df) Then
+
 
    GTIFPrintDefn(df, p)
+
   If GTIFGetDefn(gt, df) Then GTIFPrintDefn(df, p)
  Endif
 
 
    
 
    
 
   TIFFGetField(tf, TIFFTAG_IMAGEWIDTH, VarPtr(x))
 
   TIFFGetField(tf, TIFFTAG_IMAGEWIDTH, VarPtr(x))
Riga 157: Riga 155:
 
    
 
    
 
  '''End'''
 
  '''End'''
 
 
   
 
   
 
  '''Private''' Procedure GTIFPrintCorners(gtif As Gtiff, defn As GTIFDefn, xsize As Integer, ysize As Integer)
 
  '''Private''' Procedure GTIFPrintCorners(gtif As Gtiff, defn As GTIFDefn, xsize As Integer, ysize As Integer)
Riga 174: Riga 171:
 
    
 
    
 
  '''End'''
 
  '''End'''
 
 
   
 
   
 
  '''Private''' Function GTIFReportACorner(gtif As Gtiff, defn As GTIFDefn, angolo As String, xf As Float, yf As Float) As Boolean
 
  '''Private''' Function GTIFReportACorner(gtif As Gtiff, defn As GTIFDefn, angolo As String, xf As Float, yf As Float) As Boolean
 
 
  Dim xs, ys As Integer
 
 
    
 
    
 
   If Not GTIFImageToPCS(gtif, VarPtr(xf), VarPtr(yf)) Then Return False
 
   If Not GTIFImageToPCS(gtif, VarPtr(xf), VarPtr(yf)) Then Return False
 
    
 
    
  xs = xf
 
  ys = yf
 
 
   Print "  \e[1m"; angolo; "\e[0m"
 
   Print "  \e[1m"; angolo; "\e[0m"
 
    
 
    
Riga 199: Riga 191:
 
   Return True
 
   Return True
 
    
 
    
  '''End'''
+
  End
 
 
  
  
Riga 207: Riga 198:
 
* https://fossies.org/dox/libgeotiff-1.5.1/index.html
 
* https://fossies.org/dox/libgeotiff-1.5.1/index.html
 
* https://www.mariocavicchi.it/tesi2/node14.html
 
* https://www.mariocavicchi.it/tesi2/node14.html
* https://earthdata.nasa.gov/esdis/eso/standards-and-references/geotiff
+
* https://www.loc.gov/preservation/digital/formats/fdd/fdd000279.shtml
 
* https://www.usna.edu/Users/oceano/pguth/md_help/html/tbme9v52.htm
 
* https://www.usna.edu/Users/oceano/pguth/md_help/html/tbme9v52.htm
 
* https://trac.osgeo.org/geotiff/
 
* https://trac.osgeo.org/geotiff/
 
* https://web.archive.org/web/20100502061149/http://www.remotesensing.org/geotiff/spec/geotiffhome.html
 
* https://web.archive.org/web/20100502061149/http://www.remotesensing.org/geotiff/spec/geotiffhome.html
 
* https://fossies.org/linux/privat/libgeotiff-1.5.1.tar.gz/
 
* https://fossies.org/linux/privat/libgeotiff-1.5.1.tar.gz/
 +
* https://nsgreg.nga.mil/doc/view?i=2224

Versione attuale delle 05:21, 18 gen 2024

Il file GEOTIFF è un file di formato TIFF georeferenziato. Esso contiene Metadati in forma di tag che fanno riferimento ad informazioni geografiche.

Per estrarre da un file tiff georeferenziato (geotiff) tali informazioni, è necessario avere installata nel sistema e richiamare in Gambas la libreria condivisa: "libgeotiff.so.5.2.1 ".

Mostriamo un esempio pratico:

Library "libgeotiff:5.2.1"

Public Struct TIFFMethod_t
  get As Pointer
  set As Pointer
  type As Pointer
End Struct

Public Struct gtiff
  gt_tif As Pointer
  gt_methods As Struct TIFFMethod_t
  gt_flags As Integer
  gt_version As Short
  gt_rev_major As Short
  gt_rev_minor As Short
  gt_num_keys As Integer
  gt_keys As Pointer
  gt_keyindex As Pointer
  gt_keymin As Integer
  gt_keymax As Integer
  gt_short As Pointer
  gt_double As Pointer
  gt_nshorts As Integer
  gt_ndoubles As Integer
End Struct

Public Struct GTIFDefn
  Model As Short
  PCS As Short
  GCS As Short
  UOMLength As Short
  UOMLengthInMeters As Float
  UOMAngle As Short
  UOMAngleInDegrees As Float
  Datum As Short
  PM As Short
  PMLongToGreenwich As Float
  Ellipsoid As Short
  SemiMajor As Float
  SemiMinor As Float
  TOWGS84Count As Short
  TOWGS84[7] As Float
  ProjCode As Short
  Projection As Short
  CTProjection As Short
  nParms As Integer
  ProjParm[10] As Float
  ProjParmId[10] As Integer
  MapSys As Integer
  Zone As Integer
  DefnSet As Integer
End Struct

Private Const ModelTypeGeographic As Integer = 2

' TIFF * XTIFFOpen(const char* name, const char* mode)
' Open GeoTIFF files.
Private Extern XTIFFOpen(name As String, mode As String) As Pointer

' GTIF *GTIFNew(void *tif)
' Set up a new GeoTIFF file Descriptor.
Private Extern GTIFNew(tif As Pointer) As Gtiff

' void GTIFPrint(GTIF *gtif, GTIFPrintMethod print, void *aux)
' Dumps a GeoTIFF metadata stream out to a specified file <fd>.
Private Extern GTIFPrint(gtif As Gtiff, print_ As Pointer, aux As Pointer)

' int GTIFGetDefn(GTIF *psGTIF, GTIFDefn *psDefn)
' Reads the coordinate system definition from a GeoTIFF file, and normalizes it.
Private Extern GTIFGetDefn(psGTIF As Gtiff, psDefn As GTIFDefn) As Integer

' void GTIFPrintDefn(GTIFDefn *psDefn, FILE *fp)
' Report the contents of a GTIFDefn structure.
Private Extern GTIFPrintDefn(psDefn As GTIFDefn, fp As Pointer)

' int GTIFImageToPCS(GTIF *gtif, double *x, double *y)
' Translate a pixel/line coordinate to projection coordinates.
Private Extern GTIFImageToPCS(gtif As Gtiff, x As Pointer, y As Pointer) As Integer

' int GTIFProj4ToLatLong(GTIFDefn * psDefn, int nPoints, double *padfX, double *padfY)
' Convert projection coordinates to lat/long for a particular definition.
Private Extern GTIFProj4ToLatLong(psDefn As GTIFDefn, nPoints As Integer, padfX As Float, padfY As Float) As Integer

' const char *GTIFDecToDMS(double dfAngle, const char * pszAxis, int nPrecision)
' Translate decimal degrees to DMS.
Private Extern GTIFDecToDMS(dfAngle As Float, pszAxis As String, nPrecision As Integer) As String

' void GTIFFree(GTIF *gtif)
' Destroys the GeoTIFF file descriptor.
Private Extern GTIFFree(gtif As Gtiff)

' void XTIFFClose(TIFF *tif)
' Close an extended TIFF file.
Private Extern XTIFFClose(tif As Pointer)


Library "libc:6"

' FILE *fopen (const char *__filename, const char *__modes)
' Open a file and create a new stream for it.
Private Extern fopen(__filename As String, __modes As String) As Pointer

' int fclose (FILE *__stream)
' Close STREAM.
Private Extern fclose(__stream As Pointer) As Integer


Library "libtiff:5.7.0"

Private Const TIFFTAG_IMAGEWIDTH As Integer = 256
Private Const TIFFTAG_IMAGELENGTH As Integer = 257

' int TIFFGetField(TIFF* tif, uint32 tag, ...)
' TIFFGetField returns the value of a tag or pseudo-tag.
Private Extern TIFFGetField(tif As Pointer, tag As Integer, vl As Pointer) As Integer


Public Sub Main()
 
 Dim tf, p As Pointer
 Dim gt As Gtiff
 Dim df As New GTIFDefn
 Dim x, y As Integer
 
' Carica un file georeferenziato (GEOTIFF):
 tf = XTIFFOpen("/percorso/del/file.tif", "r")
 If tf == 0 Then Error.Raise("Errore !")
 
 gt = GTIFNew(tf)
 If Not Object.IsValid(gt) Then
   XTIFFClose(tf)
   Error.Raise("Errore !")
 Endif
 
 GTIFPrint(gt, 0, 0)
 Print
 p = fopen("/dev/stdout", "w")
 
 If GTIFGetDefn(gt, df) Then GTIFPrintDefn(df, p)
 
 TIFFGetField(tf, TIFFTAG_IMAGEWIDTH, VarPtr(x))
 TIFFGetField(tf, TIFFTAG_IMAGELENGTH, VarPtr(y))
 
 GTIFPrintCorners(gt, df, x, y)
 
' Libera la memoria precedentemente occupata:
 fclose(p)
 GTIFFree(gt)
 XTIFFClose(tf)
  
End

Private Procedure GTIFPrintCorners(gtif As Gtiff, defn As GTIFDefn, xsize As Integer, ysize As Integer)
 
 Print "\n== Coordinate degli angoli =="
 
 If Not GTIFReportACorner(gtif, defn, "Superiore sinistro", 0.0, 0.0) Then
   Print "\e[5mImpossibile trasformare punti tra pixel/linee e spazio PCS !\e[0m"
   Return
 Endif
 
 GTIFReportACorner(gtif, defn, "Inferiore sinistro", 0.0, CFloat(ysize))
 GTIFReportACorner(gtif, defn, "Superiore destro", CFloat(xsize), 0.0)
 GTIFReportACorner(gtif, defn, "Inferiore destro", CFloat(xsize), CFloat(ysize))
 GTIFReportACorner(gtif, defn, "Centro", xsize / 2.0, ysize / 2.0)
 
End

Private Function GTIFReportACorner(gtif As Gtiff, defn As GTIFDefn, angolo As String, xf As Float, yf As Float) As Boolean
 
 If Not GTIFImageToPCS(gtif, VarPtr(xf), VarPtr(yf)) Then Return False
 
 Print "   \e[1m"; angolo; "\e[0m"
 
 If defn.Model == ModelTypeGeographic Then
   Print String(6, Chr(32)); Format(xf, "#.0000000") & Chr(32) & GTIFDecToDMS(xf, "Long", 2)
   Print String(6, Chr(32)); Format(yf, "#.0000000") & Chr(32) & GTIFDecToDMS(yf, "Lat", 2)
 Else
   Print "("; Format(xf, "############.000"); ", "; Format(yf, "############.000"); ")"
   If GTIFProj4ToLatLong(defn, 1, VarPtr(xf), VarPtr(yf)) Then
     Print String(6, Chr(32)); Format(xf, "#.0000000") & Chr(32) & GTIFDecToDMS(xf, "Long", 2)
     Print String(6, Chr(32)); Format(yf, "#.0000000") & Chr(32) & GTIFDecToDMS(yf, "Lat", 2)
   Endif
 Endif
 
 Return True
 
End


Riferimenti