[Liblas-commits] hg: 3 new changesets

liblas-commits at liblas.org liblas-commits at liblas.org
Mon Oct 5 12:00:44 EDT 2009


changeset cc8cc33189a9 in /home/www/liblas.org/hg
details: http://hg.liblas.org/main/hg?cmd=changeset;node=cc8cc33189a9
summary: god that's embarrasing

changeset 3dd9917d34b7 in /home/www/liblas.org/hg
details: http://hg.liblas.org/main/hg?cmd=changeset;node=3dd9917d34b7
summary: fix up reprojection support, make sure FillPoint takes in the header

changeset 218c025bd810 in /home/www/liblas.org/hg
details: http://hg.liblas.org/main/hg?cmd=changeset;node=218c025bd810
summary: support reprojecting, adding pad to the header, setting the offset, and setting the scale

diffstat:

 apps/las2las.c                   |  130 +++++++++++++++++++++++++++++++++++-------
 include/liblas/detail/reader.hpp |    2 +-
 python/liblas/point.py           |    6 +-
 src/detail/reader.cpp            |   25 +++++--
 src/detail/reader10.cpp          |    4 +-
 src/detail/reader11.cpp          |    4 +-
 src/detail/reader12.cpp          |    4 +-
 7 files changed, 134 insertions(+), 41 deletions(-)

diffs (truncated from 378 to 300 lines):

diff -r 04cee30948ab -r 218c025bd810 apps/las2las.c
--- a/apps/las2las.c	Fri Oct 02 22:13:50 2009 -0500
+++ b/apps/las2las.c	Mon Oct 05 10:58:14 2009 -0500
@@ -104,8 +104,6 @@
     int skip_invalid = FALSE;
     int format = LAS_FORMAT_12;
     
-    int use_min_offset = FALSE;
-    
     LASReaderH reader = NULL;
     LASHeaderH header = NULL;
     LASHeaderH surviving_header = NULL;
@@ -114,6 +112,13 @@
     
     LASSRSH in_srs = NULL;
     LASSRSH out_srs = NULL;
+    int use_min_offset = FALSE;
+    int do_reprojection = FALSE;
+    int do_set_offset = FALSE;
+    int do_set_scale = FALSE;
+    int do_pad_header = FALSE;
+    
+    int header_pad = 0;
     
     int first_surviving_point = TRUE;
     unsigned int surviving_number_of_point_records = 0;
@@ -138,6 +143,8 @@
     
     LASPointSummary* summary = NULL;
     
+    int ret = 0;
+    
     for (i = 1; i < argc; i++) {
         if (    strcmp(argv[i],"-h") == 0 ||
                 strcmp(argv[i],"--help") == 0
@@ -299,7 +306,12 @@
             ++i;
             if (LAS_IsGDALEnabled()) {
                 out_srs = LASSRS_Create();
-                LASSRS_SetFromUserInput(out_srs, argv[i]);
+                ret = LASSRS_SetFromUserInput(out_srs, argv[i]);
+                if (ret) {
+                    LASError_Print("Unable to import SRS");
+                    exit(1);
+                }
+                do_reprojection = TRUE;
             }
         }
         else if (   strcmp(argv[i],"--scale") == 0  ||
@@ -310,6 +322,7 @@
             i++;
             sscanf(argv[i], "%lf", &(xyz_scale[2]));
             xyz_scale[0] = xyz_scale[1] = xyz_scale[2];
+            do_set_scale = TRUE;
         }
         else if (   strcmp(argv[i],"--xyz_scale") == 0  ||
                     strcmp(argv[i],"-xyz_scale") == 0    
@@ -322,26 +335,35 @@
             sscanf(argv[i], "%lf", &(xyz_scale[1]));
             i++;
             sscanf(argv[i], "%lf", &(xyz_scale[2]));
+            do_set_scale = TRUE;
         }
         else if (   strcmp(argv[i],"--xyz_offset") == 0  ||
                     strcmp(argv[i],"-xyz_offset") == 0    
                 )
         {
-
-            if (strncasecmp(argv[i], "min", 3)) {
-                i++;
+            i++;
+            if (!strncasecmp(argv[i], "min", 3)) {
                 use_min_offset = TRUE;
-                printf("Offset was !\n");
+                do_set_offset = TRUE;
             } else
             {
-                i++;                
                 sscanf(argv[i], "%lf", &(xyz_offset[0]));
                 i++;
                 sscanf(argv[i], "%lf", &(xyz_offset[1]));
                 i++;
                 sscanf(argv[i], "%lf", &(xyz_offset[2]));
+                do_set_offset = TRUE;
             }
         }
+        else if (   strcmp(argv[i],"--pad-header") == 0  ||
+                    strcmp(argv[i],"-pad-header") == 0   ||
+                    strcmp(argv[i],"-ph") == 0 
+                )        
+        {
+            i++;
+            do_pad_header = TRUE;
+            header_pad = atoi(argv[i]);
+        }
         else if (file_name_in == NULL && file_name_out == NULL)
         {
             file_name_in = argv[i];
@@ -379,6 +401,10 @@
     }
     
     if (out_srs != NULL) {
+        if (verbose) {
+            fprintf(stderr,
+                "Setting LASReader_SetOutputSRS to %s", LASSRS_GetProj4(out_srs));
+        }
         LASReader_SetOutputSRS(reader, out_srs);
     }
         
@@ -537,13 +563,10 @@
             else if (LASPoint_GetTime(p) > LASPoint_GetTime(surviving_point_max)) 
                 LASPoint_SetTime(surviving_point_max,LASPoint_GetTime(p));
 
-/*
-      if (lasreader->point.point_source_ID < surviving_point_min.point_source_ID) surviving_point_min.point_source_ID = lasreader->point.point_source_ID;
-      else if (lasreader->point.point_source_ID > surviving_point_max.point_source_ID) surviving_point_max.point_source_ID = lasreader->point.point_source_ID;
-*/
         }
   
         p  = LASReader_GetNextPoint(reader);
+       
     }
 
     if (eliminated_first_only) 
@@ -652,19 +675,17 @@
                 LASPoint_GetTime(surviving_point_max), 
                 LASPoint_GetTime(surviving_point_max) - LASPoint_GetTime(surviving_point_min)
                 );
-/*
-    fprintf(stderr, "point_source_ID %d %d %d\n",surviving_point_min.point_source_ID, surviving_point_max.point_source_ID, surviving_point_max.point_source_ID - surviving_point_min.point_source_ID);
-*/
+
     }
 
-
     if (file_name_out == NULL && !use_stdout)
     {
         LASError_Print("no output specified. exiting...");
         exit(1);
     }
 
-    
+
+    fprintf(stderr, "Creating another reader...\n");
     if (file_name_in)
     {
         reader = LASReader_Create(file_name_in);
@@ -702,7 +723,10 @@
 
     for (i = 0; i < 5; i++) LASHeader_SetPointRecordsByReturnCount(surviving_header, i, surviving_number_of_points_by_return[i]);
 
-    minx = LASPoint_GetX(surviving_point_min) * LASHeader_GetScaleX(surviving_header) + LASHeader_GetOffsetX(surviving_header);
+    minx =  LASPoint_GetX(surviving_point_min) * \
+            LASHeader_GetScaleX(surviving_header) + \
+            LASHeader_GetOffsetX(surviving_header);
+            
     maxx = LASPoint_GetX(surviving_point_max) * LASHeader_GetScaleX(surviving_header) + LASHeader_GetOffsetX(surviving_header);
 
     miny = LASPoint_GetY(surviving_point_min) * LASHeader_GetScaleY(surviving_header) + LASHeader_GetOffsetY(surviving_header);
@@ -718,11 +742,60 @@
     } else if (format == LAS_FORMAT_12) {
         LASHeader_SetVersionMinor(surviving_header, 2);
     }
+
+    if (do_set_offset) {
+        if (use_min_offset) {
+            if (verbose) {
+                fprintf(stderr, 
+                    "Setting xyz offset to minimums...\n");
+            }
+            LASHeader_SetOffset(surviving_header, 
+                                LASPoint_GetX(surviving_point_min), 
+                                LASPoint_GetY(surviving_point_min), 
+                                LASPoint_GetZ(surviving_point_min));
+        } else {
+            if (verbose) {
+                fprintf(stderr, 
+                    "Setting xyz offset to commandline-assigned values...\n");
+            }
+            LASHeader_SetOffset(surviving_header,
+                                xyz_offset[0],
+                                xyz_offset[1],
+                                xyz_offset[2]);
+        }
+    }
+
+    if (do_set_scale) {
+        if (verbose) {
+            fprintf(stderr, 
+                "Setting xyz scale...\n");
+        }
+        LASHeader_SetScale( surviving_header, 
+                            xyz_scale[0],
+                            xyz_scale[1],
+                            xyz_scale[2]);
+    }
     
-
-/*  if (remove_extra_header) surviving_header.offset_to_point_data = surviving_header.header_size;
-*/
-
+    if (do_pad_header){
+        if (verbose) {
+            fprintf(stderr, 
+                "Padding header by %d bytes. New header will be %d bytes long instead of %d bytes ...\n", 
+                header_pad, 
+                LASHeader_GetDataOffset(surviving_header)+abs(header_pad), 
+                LASHeader_GetDataOffset(surviving_header));
+        }
+        
+        LASHeader_SetDataOffset(surviving_header, LASHeader_GetDataOffset(surviving_header)+abs(header_pad));
+    }
+    
+    if (do_reprojection) {
+        if (verbose) {
+            fprintf(stderr,
+                "Setting new coordinate system to %s", LASSRS_GetProj4(out_srs));
+        }
+        LASHeader_SetSRS(surviving_header, out_srs);
+        
+    }
     if (verbose) {
         fprintf(stderr, 
                 "second pass reading %d and writing %d points ...\n", 
@@ -730,9 +803,12 @@
                 surviving_number_of_point_records);
     }
     
+    
     if (use_stdout) file_name_out = "stdout";
     
-    writer = LASWriter_Create(file_name_out, surviving_header, LAS_MODE_WRITE);
+    writer = LASWriter_Create(  file_name_out, 
+                                surviving_header, 
+                                LAS_MODE_WRITE);
     if (!writer) { 
         LASError_Print("Could not open file to write");
         exit(1);
@@ -767,6 +843,14 @@
         exit(1);
     }
 
+    if (in_srs != NULL) {
+        LASReader_SetInputSRS(reader, in_srs);
+    }
+    
+    if (out_srs != NULL) {
+        LASReader_SetOutputSRS(reader, out_srs);
+    }
+    
     p = LASReader_GetNextPoint(reader);
     if (!p) {
         if (LASError_GetLastErrorNum()) 
diff -r 04cee30948ab -r 218c025bd810 include/liblas/detail/reader.hpp
--- a/include/liblas/detail/reader.hpp	Fri Oct 02 22:13:50 2009 -0500
+++ b/include/liblas/detail/reader.hpp	Mon Oct 05 10:58:14 2009 -0500
@@ -91,7 +91,7 @@
     OGRSpatialReferenceH m_in_ref;
     OGRSpatialReferenceH m_out_ref;
 
-    void FillPoint(PointRecord& record, LASPoint& point);
+    void FillPoint(PointRecord& record, LASPoint& point, const LASHeader& header);
     void Project(LASPoint& point);
 
 private:
diff -r 04cee30948ab -r 218c025bd810 python/liblas/point.py
--- a/python/liblas/point.py	Fri Oct 02 22:13:50 2009 -0500
+++ b/python/liblas/point.py	Mon Oct 05 10:58:14 2009 -0500
@@ -226,6 +226,6 @@
         self.z = (self.z - header.offset[2]) / header.scale[2]
     
     def scale(self, header):
-        self.x = self.x + header.scale[0] + header.offset[0]
-        self.y = self.y + header.scale[1] + header.offset[1]
-        self.z = self.z + header.scale[2] + header.offset[2]
+        self.x = (self.x * header.scale[0]) + header.offset[0]
+        self.y = (self.y * header.scale[1]) + header.offset[1]
+        self.z = (self.z * header.scale[2]) + header.offset[2]
diff -r 04cee30948ab -r 218c025bd810 src/detail/reader.cpp
--- a/src/detail/reader.cpp	Fri Oct 02 22:13:50 2009 -0500
+++ b/src/detail/reader.cpp	Mon Oct 05 10:58:14 2009 -0500
@@ -99,16 +99,25 @@
     return m_ifs;
 }
 
-void Reader::FillPoint(PointRecord& record, LASPoint& point) 
+void Reader::FillPoint(PointRecord& record, LASPoint& point, const LASHeader& header) 
 {
-    
-    point.SetX(record.x);
-    point.SetY(record.y);
-    point.SetZ(record.z);
-    
-    if (m_transform)
-    {
+
+    if (m_transform) {
+        point.SetCoordinates(header, record.x, record.y, record.z);
         Project(point);
+        


More information about the Liblas-commits mailing list