[Liblas-commits] hg-main-tree: incremental SRS work

liblas-commits at liblas.org liblas-commits at liblas.org
Fri Apr 22 13:04:40 EDT 2011


details:   http://hg.libpc.orghg-main-tree/rev/5f222b282820
changeset: 622:5f222b282820
user:      Michael P. Gerlek <mpg at flaxen.com>
date:      Fri Apr 22 10:04:22 2011 -0700
description:
incremental SRS work
Subject: hg-main-tree: merge

details:   http://hg.libpc.orghg-main-tree/rev/264d697702b6
changeset: 623:264d697702b6
user:      Michael P. Gerlek <mpg at flaxen.com>
date:      Fri Apr 22 10:04:35 2011 -0700
description:
merge

diffstat:

 include/libpc/SpatialReference.hpp                 |   79 ++--------
 include/libpc/drivers/las/VariableLengthRecord.hpp |   14 +-
 src/SpatialReference.cpp                           |  150 ++++++++++----------
 src/Stage.cpp                                      |    2 +-
 src/drivers/las/VariableLengthRecord.cpp           |  113 +++++++++++++++
 test/unit/SpatialReferenceTest.cpp                 |   73 ++++++---
 test/unit/Support.cpp                              |    2 +-
 7 files changed, 267 insertions(+), 166 deletions(-)

diffs (truncated from 725 to 300 lines):

diff -r 887d425beaba -r 264d697702b6 include/libpc/SpatialReference.hpp
--- a/include/libpc/SpatialReference.hpp	Fri Apr 22 08:58:19 2011 -0700
+++ b/include/libpc/SpatialReference.hpp	Fri Apr 22 10:04:35 2011 -0700
@@ -85,9 +85,9 @@
     
     /// Returns a pointer to the internal GTIF*.  Only available if 
     /// you have libgeotiff linked in.
-    const GTIF* GetGTIF();
+    const GTIF* getGTIF();
 
-    void SetGTIF(GTIF* pgtiff, ST_TIFF* ptiff);
+    void setGTIF(GTIF* pgtiff, ST_TIFF* ptiff);
 
     /// Returns the OGC WKT describing Spatial Reference System.
     /// If GDAL is linked, it uses GDAL's operations and methods to determine 
@@ -97,13 +97,13 @@
     /// eCompoundOK indicating the the returned WKT may be a compound 
     /// coordinate system if there is vertical coordinate system info 
     /// available.
-    std::string GetWKT(WKTModeFlag mode_flag = eHorizontalOnly) const;
-    std::string GetWKT(WKTModeFlag mode_flag, bool pretty) const;
+    std::string getWKT(WKTModeFlag mode_flag = eHorizontalOnly) const;
+    std::string getWKT(WKTModeFlag mode_flag, bool pretty) const;
     
     /// Sets the SRS using GDAL's OGC WKT. If GDAL is not linked, this 
     /// operation has no effect.
     /// \param v - a string containing the WKT string.  
-    void SetWKT(std::string const& v);
+    void setWKT(std::string const& v);
 
     /// Sets the vertical coordinate system using geotiff key values.
     /// This operation should normally be done after setting the horizontal
@@ -117,7 +117,7 @@
     /// range 5100 to 5299 - implied by verticalCSType if that is provided, or 
     /// -1 if no value is available.
     /// \param verticalUnits - the EPSG vertical units code, often 9001 for Metre.
-    void SetVerticalCS(boost::int32_t verticalCSType, 
+    void setVerticalCS(boost::int32_t verticalCSType, 
                        std::string const& citation = std::string(0),
                        boost::int32_t verticalDatum = -1,
                        boost::int32_t verticalUnits = 9001);
@@ -125,14 +125,14 @@
     /// Sets the SRS using GDAL's SetFromUserInput function. If GDAL is not linked, this 
     /// operation has no effect.
     /// \param v - a string containing the definition (filename, proj4, wkt, etc).  
-    void SetFromUserInput(std::string const& v);
+    void setFromUserInput(std::string const& v);
         
     /// Returns the Proj.4 string describing the Spatial Reference System.
     /// If GDAL is linked, it uses GDAL's operations and methods to determine 
     /// the Proj.4 string -- otherwise, if libgeotiff is linked, it uses 
     /// that.  Note that GDAL's operations are much more mature and 
     /// support more coordinate systems and descriptions.
-    std::string GetProj4() const;
+    std::string getProj4() const;
 
     /// Sets the Proj.4 string describing the Spatial Reference System.
     /// If GDAL is linked, it uses GDAL's operations and methods to determine 
@@ -140,9 +140,19 @@
     /// that.  Note that GDAL's operations are much more mature and 
     /// support more coordinate systems and descriptions.
     /// \param v - a string containing the Proj.4 string.
-    void SetProj4(std::string const& v);
+    void setProj4(std::string const& v);
     
-    boost::property_tree::ptree GetPTree() const;    
+    boost::property_tree::ptree getPTree() const;    
+
+    enum GeotiffKeyType
+    {
+        Geotiff_KeyType_SHORT=1,
+        Geotiff_KeyType_DOUBLE=2,
+        Geotiff_KeyType_ASCII=3
+    };
+    int geotiff_ST_SetKey(int tag, int count, GeotiffKeyType geotiff_key_type, void *data);
+    void geotiff_SetTags();
+    void geotiff_ResetTags();
 
 private:
 
@@ -152,8 +162,7 @@
 
     std::string m_wkt;
 
-    std::string GetGTIFFText() const;
-
+    std::string getGTIFFText() const;
 };
 
 
@@ -179,50 +188,4 @@
 #endif // defined __geotiff_h_
 LIBPC_C_END
 
-
 #endif
-
-
-#if 0
-#include <liblas/detail/fwd.hpp>
-#include <liblas/detail/private_utility.hpp>
-#include <liblas/variablerecord.hpp>
-#include <liblas/exception.hpp>
-#include <liblas/capi/las_config.h>
-#include <liblas/export.hpp>
-#include <liblas/external/property_tree/ptree.hpp>
-#include <stdexcept> // std::out_of_range
-#include <cstdlib> // std::size_t
-#include <string>
-
-    enum GeoVLRType
-    {
-        eGeoTIFF = 1,
-        eOGRWKT = 2
-    };
-
-    /// Set the LASVLRs for the SpatialReference.  SetVLRs will only copy 
-    /// VLR records that pertain to the GeoTIFF keys, and extraneous 
-    /// VLR records will not be copied.
-    /// \param vlrs - A list of VLRs that contains VLRs describing GeoTIFF keys
-    void SetVLRs(std::vector<VariableRecord> const& vlrs);
-    
-    /// Add a VLR representing GeoTIFF keys to the SRS
-    void AddVLR(VariableRecord const& vlr);
-    
-    /// Return a copy of the LASVLRs that SpatialReference maintains
-    std::vector<VariableRecord> GetVLRs() const;
-
-    void ClearVLRs( GeoVLRType eType );
-
-    std::vector<VariableRecord> m_vlrs;
-    bool IsGeoVLR(VariableRecord const& vlr) const;
-
-    /// Reset the VLRs of the SpatialReference using the existing GTIF* and ST_TIF*
-    /// Until this method is called, 
-    /// the SpatialReference will only contain a SRS description using the VLRs 
-    /// that it was first instantiated with.  SetWKT and SetProj4 can 
-    /// be used to change the GTIF* 
-    void ResetVLRs();
-
-#endif 
diff -r 887d425beaba -r 264d697702b6 include/libpc/drivers/las/VariableLengthRecord.hpp
--- a/include/libpc/drivers/las/VariableLengthRecord.hpp	Fri Apr 22 08:58:19 2011 -0700
+++ b/include/libpc/drivers/las/VariableLengthRecord.hpp	Fri Apr 22 10:04:35 2011 -0700
@@ -40,6 +40,11 @@
 #include <libpc/MetadataRecord.hpp>
 
 #include <iostream>
+#include <vector>
+
+namespace libpc {
+    class SpatialReference;
+}
 
 namespace libpc { namespace drivers { namespace las {
     
@@ -61,6 +66,11 @@
     boost::uint16_t getRecordId() const { return m_recordId; }
     boost::uint8_t* getDescription() const { return (boost::uint8_t*)m_description; }
 
+    static void setSRS(const std::vector<VariableLengthRecord>& vlrs, SpatialReference& srs);
+    bool VariableLengthRecord::isGeoVLR() const;
+
+    bool compareUserId(const std::string& str) const;
+
     bool operator==(const VariableLengthRecord&) const;
     VariableLengthRecord& operator=(const VariableLengthRecord&);
 
@@ -68,9 +78,9 @@
 
 private:
     boost::uint16_t m_reserved;
-    boost::uint8_t* m_userId; // always 16 bytes
+    boost::uint8_t* m_userId; // always 16 bytes   // BUG: make this a std::string?
     boost::uint16_t m_recordId;
-    boost::uint8_t* m_description;  // always 32 bytes
+    boost::uint8_t* m_description;  // always 32 bytes   // BUG: make this a std::string?
 };
 
 
diff -r 887d425beaba -r 264d697702b6 src/SpatialReference.cpp
--- a/src/SpatialReference.cpp	Fri Apr 22 08:58:19 2011 -0700
+++ b/src/SpatialReference.cpp	Fri Apr 22 10:04:35 2011 -0700
@@ -90,7 +90,7 @@
     , m_wkt(other.m_wkt)
 {
     ////////////////////////////////////////////////////////////SetVLRs(other.GetVLRs());
-    GetGTIF();
+    getGTIF();
 }
 
 
@@ -99,7 +99,7 @@
     if (&rhs != this)
     {
         ////////////////////////////////////////////////SetVLRs(rhs.GetVLRs());
-        GetGTIF();
+        getGTIF();
         m_wkt = rhs.m_wkt;
     }
     return *this;
@@ -123,7 +123,7 @@
 }
 
 
-void SpatialReference::SetGTIF(GTIF* pgtiff, ST_TIFF* ptiff) 
+void SpatialReference::setGTIF(GTIF* pgtiff, ST_TIFF* ptiff) 
 {
     m_gtiff = (GTIF*)pgtiff;
     m_tiff = (ST_TIFF*)ptiff;
@@ -133,7 +133,7 @@
 }
 
 
-const GTIF* SpatialReference::GetGTIF()
+const GTIF* SpatialReference::getGTIF()
 {
 #ifndef LIBPC_SRS_ENABLED
     return 0;
@@ -204,14 +204,52 @@
 }
 
 
-std::string SpatialReference::GetWKT( WKTModeFlag mode_flag) const 
+int SpatialReference::geotiff_ST_SetKey(int tag, int count, GeotiffKeyType geotiff_key_type, void *data)
 {
-    return GetWKT(mode_flag, false);
+    return ST_SetKey(m_tiff, tag, count, (int)geotiff_key_type, data);
 }
 
 
+void SpatialReference::geotiff_SetTags()
+{
+    m_gtiff = GTIFNewSimpleTags(m_tiff);
+    if (!m_gtiff) 
+        throw std::runtime_error("The geotiff keys could not be read from VLR records");
+    return;
+}
+
+
+void SpatialReference::geotiff_ResetTags()
+{
+    // If we already have m_gtiff and m_tiff, that is because we have 
+    // already called GetGTIF once before.  VLRs ultimately drive how the 
+    // SpatialReference is defined, not the GeoTIFF keys.  
+    if (m_tiff != 0 )
+    {
+        ST_Destroy(m_tiff);
+        m_tiff = 0;
+    }
+
+    if (m_gtiff != 0 )
+    {
+        GTIFFree(m_gtiff);
+        m_gtiff = 0;
+    }
+
+    m_tiff = ST_Create();
+
+    return;
+}
+
+
+std::string SpatialReference::getWKT( WKTModeFlag mode_flag) const 
+{
+    return getWKT(mode_flag, false);
+}
+
+
 /// Fetch the SRS as WKT
-std::string SpatialReference::GetWKT(WKTModeFlag mode_flag , bool pretty) const 
+std::string SpatialReference::getWKT(WKTModeFlag mode_flag , bool pretty) const 
 {
 #ifndef LIBPC_SRS_ENABLED
     boost::ignore_unused_variable_warning(mode_flag);
@@ -311,7 +349,7 @@
 }
 
 
-void SpatialReference::SetFromUserInput(std::string const& v)
+void SpatialReference::setFromUserInput(std::string const& v)
 {
 #ifdef LIBPC_SRS_ENABLED
 
@@ -320,7 +358,8 @@
     
     // OGRSpatialReference* poSRS = (OGRSpatialReference*) OSRNewSpatialReference(NULL);
     OGRSpatialReference srs(NULL);
-    if (OGRERR_NONE != srs.SetFromUserInput(const_cast<char *> (input)))
+    OGRErr err = srs.SetFromUserInput(const_cast<char *> (input));
+    if (err != OGRERR_NONE)
     {
         throw std::invalid_argument("could not import coordinate system into OSRSpatialReference SetFromUserInput");
     }
@@ -330,7 +369,7 @@
     std::string tmp(poWKT);
     CPLFree(poWKT);
     
-    SetWKT(tmp);
+    setWKT(tmp);


More information about the Liblas-commits mailing list