[Liblas-commits] r1315 - branches/1.2/src
liblas-commits at liblas.org
liblas-commits at liblas.org
Sat Jul 25 22:23:29 EDT 2009
Author: hobu
Date: Sat Jul 25 22:23:29 2009
New Revision: 1315
URL: http://liblas.org/changeset/1315
Log:
Fix #140 and #140 related to not having the gt_citation stuff
Added:
branches/1.2/src/gt_citation.cpp
Modified:
branches/1.2/src/Makefile.am
Modified: branches/1.2/src/Makefile.am
==============================================================================
--- branches/1.2/src/Makefile.am (original)
+++ branches/1.2/src/Makefile.am Sat Jul 25 22:23:29 2009
@@ -35,7 +35,7 @@
detail/file.cpp
if GDAL_IS_CONFIG
-liblas_la_SOURCES += gt_wkt_srs.cpp
+liblas_la_SOURCES += gt_wkt_srs.cpp gt_citation.cpp
endif
liblas_la_LDFLAGS = -version-info 1:0:0
Added: branches/1.2/src/gt_citation.cpp
==============================================================================
--- (empty file)
+++ branches/1.2/src/gt_citation.cpp Sat Jul 25 22:23:29 2009
@@ -0,0 +1,479 @@
+/******************************************************************************
+ * $Id$
+ *
+ * Project: GeoTIFF Driver
+ * Purpose: Implements special parsing of Imagine citation strings, and
+ * to encode PE String info in citation fields as needed.
+ * Author: Xiuguang Zhou (ESRI)
+ *
+ ******************************************************************************
+ * Copyright (c) 2008, Xiuguang Zhou (ESRI)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ****************************************************************************/
+
+#include "cpl_port.h"
+#include "cpl_string.h"
+
+#include "geo_normalize.h"
+#include "geovalues.h"
+#include "ogr_spatialref.h"
+
+
+#define nCitationNameTypes 9
+typedef enum
+{
+ CitCsName = 0,
+ CitPcsName = 1,
+ CitProjectionName = 2,
+ CitLUnitsName = 3,
+ CitGcsName = 4,
+ CitDatumName = 5,
+ CitEllipsoidName = 6,
+ CitPrimemName = 7,
+ CitAUnitsName = 8
+} CitationNameType;
+
+char* ImagineCitationTranslation(const char* psCitation, geokey_t keyID);
+char** CitationStringParse(const char* psCitation);
+void SetLinearUnitCitation(GTIF* psGTIF, char* pszLinearUOMName);
+void SetGeogCSCitation(GTIF * psGTIF, OGRSpatialReference *poSRS, char* angUnitName, int nDatum, short nSpheroid);
+OGRBoolean SetCitationToSRS(GTIF* hGTIF, char* szCTString, int nCTStringLen,
+ geokey_t geoKey, OGRSpatialReference* poSRS, OGRBoolean* linearUnitIsSet);
+void GetGeogCSFromCitation(char* szGCSName, int nGCSName,
+ geokey_t geoKey,
+ char **ppszGeogName,
+ char **ppszDatumName,
+ char **ppszPMName,
+ char **ppszSpheroidName,
+ char **ppszAngularUnits);
+
+/************************************************************************/
+/* ImagineCitationTranslation() */
+/* */
+/* Translate ERDAS Imagine GeoTif citation */
+/************************************************************************/
+char* ImagineCitationTranslation(const char* psCitation, geokey_t keyID)
+{
+ char* ret = NULL;
+ if(!psCitation)
+ return ret;
+ if(EQUALN(psCitation, "IMAGINE GeoTIFF Support", strlen("IMAGINE GeoTIFF Support")))
+ {
+ CPLString osName;
+
+ // this is a handle IMAGING style citation
+ const char* p = NULL;
+ p = strchr(psCitation, '$');
+ if(p)
+ p = strchr(p, '\n');
+ if(p)
+ p++;
+ const char* p1 = NULL;
+ if(p)
+ p1 = strchr(p, '\n');
+ if(p && p1)
+ {
+ switch (keyID)
+ {
+ case PCSCitationGeoKey:
+ osName = "PCS Name = ";
+ break;
+ case GTCitationGeoKey:
+ osName = "CS Name = ";
+ break;
+ case GeogCitationGeoKey:
+ if(!strstr(p, "Unable to"))
+ osName = "GCS Name = ";
+ break;
+ default:
+ break;
+ }
+ if(strlen(osName)>0)
+ {
+ osName.append(p, p1-p);
+ osName += "|";
+ }
+ }
+ p = strstr(psCitation, "Projection Name = ");
+ if(p)
+ {
+ p += strlen("Projection Name = ");
+ p1 = strchr(p, '\n');
+ if(!p1)
+ p1 = strchr(p, '\0');
+ }
+ if(p && p1)
+ {
+ osName.append(p, p1-p);
+ osName += "|";
+ }
+ p = strstr(psCitation, "Datum = ");
+ if(p)
+ {
+ p += strlen("Datum = ");
+ p1 = strchr(p, '\n');
+ if(!p1)
+ p1 = strchr(p, '\0');
+ }
+ if(p && p1)
+ {
+ osName += "Datum = ";
+ osName.append(p, p1-p);
+ osName += "|";
+ }
+ p = strstr(psCitation, "Ellipsoid = ");
+ if(p)
+ {
+ p += strlen("Ellipsoid = ");
+ p1 = strchr(p, '\n');
+ if(!p1)
+ p1 = strchr(p, '\0');
+ }
+ if(p && p1)
+ {
+ osName += "Ellipsoid = ";
+ osName.append(p, p1-p);
+ osName += "|";
+ }
+ p = strstr(psCitation, "Units = ");
+ if(p)
+ {
+ p += strlen("Units = ");
+ p1 = strchr(p, '\n');
+ if(!p1)
+ p1 = strchr(p, '\0');
+ }
+ if(p && p1)
+ {
+ osName += "LUnits = ";
+ osName.append(p, p1-p);
+ osName += "|";
+ }
+ if(strlen(osName) > 0)
+ {
+ ret = CPLStrdup(osName);
+ }
+ }
+ return ret;
+}
+
+/************************************************************************/
+/* CitationStringParse() */
+/* */
+/* Parse a Citation string */
+/************************************************************************/
+char** CitationStringParse(const char* psCitation)
+{
+ char ** ret = NULL;
+ if(!psCitation)
+ return ret;
+
+ ret = (char **) CPLCalloc(sizeof(char*), nCitationNameTypes);
+ const char* pDelimit = NULL;
+ const char* pStr = psCitation;
+ CPLString osName;
+ int nCitationLen = strlen(psCitation);
+ OGRBoolean nameFound = FALSE;
+ while((pStr-psCitation+1)< nCitationLen)
+ {
+ if( (pDelimit = strstr(pStr, "|")) )
+ {
+ osName = "";
+ osName.append(pStr, pDelimit-pStr);
+ pStr = pDelimit+1;
+ }
+ else
+ {
+ osName = pStr;
+ pStr += strlen(pStr);
+ }
+ const char* name = osName.c_str();
+ if( strstr(name, "PCS Name = ") )
+ {
+ if (!ret[CitPcsName])
+ ret[CitPcsName] = CPLStrdup(name+strlen("PCS Name = "));
+ nameFound = TRUE;
+ }
+ if(strstr(name, "Projection Name = "))
+ {
+ if (!ret[CitProjectionName])
+ ret[CitProjectionName] = CPLStrdup(name+strlen("Projection Name = "));
+ nameFound = TRUE;
+ }
+ if(strstr(name, "LUnits = "))
+ {
+ if (!ret[CitLUnitsName])
+ ret[CitLUnitsName] = CPLStrdup(name+strlen("LUnits = "));
+ nameFound = TRUE;
+ }
+ if(strstr(name, "GCS Name = "))
+ {
+ if (!ret[CitGcsName])
+ ret[CitGcsName] = CPLStrdup(name+strlen("GCS Name = "));
+ nameFound = TRUE;
+ }
+ if(strstr(name, "Datum = "))
+ {
+ if (!ret[CitDatumName])
+ ret[CitDatumName] = CPLStrdup(name+strlen("Datum = "));
+ nameFound = TRUE;
+ }
+ if(strstr(name, "Ellipsoid = "))
+ {
+ if (!ret[CitEllipsoidName])
+ ret[CitEllipsoidName] = CPLStrdup(name+strlen("Ellipsoid = "));
+ nameFound = TRUE;
+ }
+ if(strstr(name, "Primem = "))
+ {
+ if (!ret[CitPrimemName])
+ ret[CitPrimemName] = CPLStrdup(name+strlen("Primem = "));
+ nameFound = TRUE;
+ }
+ if(strstr(name, "AUnits = "))
+ {
+ if (!ret[CitAUnitsName])
+ ret[CitAUnitsName] = CPLStrdup(name+strlen("AUnits = "));
+ nameFound = TRUE;
+ }
+ }
+ if(!nameFound)
+ {
+ CPLFree( ret );
+ ret = (char**)NULL;
+ }
+ return ret;
+}
+
+/************************************************************************/
+/* SetLinearUnitCitation() */
+/* */
+/* Set linear unit Citation string */
+/************************************************************************/
+void SetLinearUnitCitation(GTIF* psGTIF, char* pszLinearUOMName)
+{
+ char szName[512];
+ CPLString osCitation;
+ int n = 0;
+ if( GTIFKeyGet( psGTIF, PCSCitationGeoKey, szName, 0, sizeof(szName) ) )
+ n = strlen(szName);
+ if(n>0)
+ {
+ osCitation = szName;
+ if(osCitation[n-1] != '|')
+ osCitation += "|";
+ osCitation += "LUnits = ";
+ osCitation += pszLinearUOMName;
+ osCitation += "|";
+ }
+ else
+ {
+ osCitation = "LUnits = ";
+ osCitation += pszLinearUOMName;
+ }
+ GTIFKeySet( psGTIF, PCSCitationGeoKey, TYPE_ASCII, 0, osCitation.c_str() );
+ return;
+}
+
+/************************************************************************/
+/* SetGeogCSCitation() */
+/* */
+/* Set geogcs Citation string */
+/************************************************************************/
+void SetGeogCSCitation(GTIF * psGTIF, OGRSpatialReference *poSRS, char* angUnitName, int nDatum, short nSpheroid)
+{
+ int bRewriteGeogCitation = FALSE;
+ char szName[256];
+ CPLString osCitation;
+ size_t n = 0;
+ if( GTIFKeyGet( psGTIF, GeogCitationGeoKey, szName, 0, sizeof(szName) ) )
+ n = strlen(szName);
+ if (n == 0)
+ return;
+
+ if(!EQUALN(szName, "GCS Name = ", strlen("GCS Name = ")))
+ {
+ osCitation = "GCS Name = ";
+ osCitation += szName;
+ }
+ else
+ {
+ osCitation = szName;
+ }
+
+ if(nDatum == KvUserDefined )
+ {
+ const char* datumName = poSRS->GetAttrValue( "DATUM" );
+ if(datumName && strlen(datumName) > 0)
+ {
+ osCitation += "|Datum = ";
+ osCitation += datumName;
+ bRewriteGeogCitation = TRUE;
+ }
+ }
+ if(nSpheroid == KvUserDefined )
+ {
+ const char* spheroidName = poSRS->GetAttrValue( "SPHEROID" );
+ if(spheroidName && strlen(spheroidName) > 0)
+ {
+ osCitation += "|Ellipsoid = ";
+ osCitation += spheroidName;
+ bRewriteGeogCitation = TRUE;
+ }
+ }
+
+ const char* primemName = poSRS->GetAttrValue( "PRIMEM" );
+ if(primemName && strlen(primemName) > 0)
+ {
+ osCitation += "|Primem = ";
+ osCitation += primemName;
+ bRewriteGeogCitation = TRUE;
+
+ double primemValue = poSRS->GetPrimeMeridian(NULL);
+ if(angUnitName && !EQUAL(angUnitName, "Degree"))
+ {
+ double aUnit = poSRS->GetAngularUnits(NULL);
+ primemValue *= aUnit;
+ }
+ GTIFKeySet( psGTIF, GeogPrimeMeridianLongGeoKey, TYPE_DOUBLE, 1,
+ primemValue );
+ }
+ if(angUnitName && strlen(angUnitName) > 0 && !EQUAL(angUnitName, "Degree"))
+ {
+ osCitation += "|AUnits = ";
+ osCitation += angUnitName;
+ bRewriteGeogCitation = TRUE;
+ }
+
+ if (osCitation[strlen(osCitation) - 1] != '|')
+ osCitation += "|";
+
+ if (bRewriteGeogCitation)
+ GTIFKeySet( psGTIF, GeogCitationGeoKey, TYPE_ASCII, 0, osCitation.c_str() );
+
+ return;
+}
+
+/************************************************************************/
+/* SetCitationToSRS() */
+/* */
+/* Parse and set Citation string to SRS */
+/************************************************************************/
+OGRBoolean SetCitationToSRS(GTIF* hGTIF, char* szCTString, int nCTStringLen,
+ geokey_t geoKey, OGRSpatialReference* poSRS, OGRBoolean* linearUnitIsSet)
+{
+ OGRBoolean ret = FALSE;
+ *linearUnitIsSet = FALSE;
+ char* imgCTName = ImagineCitationTranslation(szCTString, geoKey);
+ if(imgCTName)
+ {
+ strncpy(szCTString, imgCTName, nCTStringLen);
+ szCTString[nCTStringLen-1] = '\0';
+ CPLFree( imgCTName );
+ }
+ char** ctNames = CitationStringParse(szCTString);
+ if(ctNames)
+ {
+ if( poSRS->GetRoot() == NULL)
+ poSRS->SetNode( "PROJCS", "unnamed" );
+ if(ctNames[CitPcsName])
+ {
+ poSRS->SetNode( "PROJCS", ctNames[CitPcsName] );
+ ret = TRUE;
+ }
+ else if(geoKey != GTCitationGeoKey)
+ {
+ char szPCSName[128];
+ if( GTIFKeyGet( hGTIF, GTCitationGeoKey, szPCSName, 0, sizeof(szPCSName) ) )
+ {
+ poSRS->SetNode( "PROJCS", szPCSName );
+ ret = TRUE;
+ }
+ }
+
+ if(ctNames[CitProjectionName])
+ poSRS->SetProjection( ctNames[CitProjectionName] );
+
+ if(ctNames[CitLUnitsName])
+ {
+ double unitSize;
+ if (GTIFKeyGet(hGTIF, ProjLinearUnitSizeGeoKey, &unitSize, 0,
+ sizeof(unitSize) ))
+ {
+ poSRS->SetLinearUnits( ctNames[CitLUnitsName], unitSize);
+ *linearUnitIsSet = TRUE;
+ }
+ }
+ for(int i= 0; i<nCitationNameTypes; i++)
+ CPLFree( ctNames[i] );
+ CPLFree( ctNames );
+ }
+ return ret;
+}
+
+/************************************************************************/
+/* GetGeogCSFromCitation() */
+/* */
+/* Parse and get geogcs names from a Citation string */
+/************************************************************************/
+void GetGeogCSFromCitation(char* szGCSName, int nGCSName,
+ geokey_t geoKey,
+ char **ppszGeogName,
+ char **ppszDatumName,
+ char **ppszPMName,
+ char **ppszSpheroidName,
+ char **ppszAngularUnits)
+{
+ *ppszGeogName = *ppszDatumName = *ppszPMName =
+ *ppszSpheroidName = *ppszAngularUnits = NULL;
+
+ char* imgCTName = ImagineCitationTranslation(szGCSName, geoKey);
+ if(imgCTName)
+ {
+ strncpy(szGCSName, imgCTName, nGCSName);
+ szGCSName[nGCSName-1] = '\0';
+ CPLFree( imgCTName );
+ }
+ char** ctNames = CitationStringParse(szGCSName);
+ if(ctNames)
+ {
+ if(ctNames[CitGcsName])
+ *ppszGeogName = CPLStrdup( ctNames[CitGcsName] );
+
+ if(ctNames[CitDatumName])
+ *ppszDatumName = CPLStrdup( ctNames[CitDatumName] );
+
+ if(ctNames[CitEllipsoidName])
+ *ppszSpheroidName = CPLStrdup( ctNames[CitEllipsoidName] );
+
+ if(ctNames[CitPrimemName])
+ *ppszPMName = CPLStrdup( ctNames[CitPrimemName] );
+
+ if(ctNames[CitAUnitsName])
+ *ppszAngularUnits = CPLStrdup( ctNames[CitAUnitsName] );
+
+ for(int i= 0; i<nCitationNameTypes; i++)
+ CPLFree( ctNames[i] );
+ CPLFree( ctNames );
+ }
+ return;
+}
+
+
More information about the Liblas-commits
mailing list