On a quick side note, what is the procedure for submitting bug reports? I went 
to the "Bugs" link, but I couldn't see a way to submit without being able to 
log in to the site.

 

While working on modifying (Mainly reprojection and conversion of units) some 
point data, I came across some odd behavior. First, I would read the data in 
from File A and make any adjustments required. Next, I would write the file out 
to File B with updated header information. However, when I subsequently read 
the data in from File B, the values would be incorrect. After some trial and 
error, I realized that the problem was with differences in the offset and scale 
in the headers of File A and File B. Normally, the point data is stored with 
the scale and offset applied. When a new header is assigned to the pointer, it 
should be updated to reflect the new values. However, looking at the point.cpp 
code, it looks as though the data is only updated if the point format(And 
subsequently, the size of the point data) is changed. Otherwise, it returns 
before reaching the code that updates the coordinates. The section of code 
below is taken from line 366+ of the point.cpp class. I am currently running 
1.6.1, but it also appears that the problem will still occur in the current 
trunk.(I have not built and tested the latest version, so I can't say for 
certain) The problem occurs in the else block of code. If the point format is 
the same but the offset has changed, the return there prevents the XYZ 
coordinates from being updated with the new offset.

 

[After determining data size of new header]

if (wanted_length != m_data.size())

    {

        // Manually copy everything but the header ptr

        // We can't just copy the raw data because its 

        // layout is likely changing as a result of the 

        // schema change 

      [Snipped copying of metadata for space]

    } else 

    {

        m_header_new = header;

        return;

    }

 

    double x;

    double y;

    double z;

    

    if (bSetCoordinates)

    {

        x = GetX();

        y = GetY();

        z = GetZ();        

    }

    

    // The header's scale/offset can change the raw storage of xyz.  

    // SetHeaderPtr can result in a rescaling of the data.

    m_header_new = header;

 

    if (bSetCoordinates)

    {

        SetX(x);

        SetY(y);

        SetZ(z);

    }

 

Tim Black

Ball Aerospace

571-357-2158

 




This message and any enclosures are intended only for the addressee.  Please  
notify the sender by email if you are not the intended recipient.  If you are  
not the intended recipient, you may not use, copy, disclose, or distribute this 
 
message or its contents or enclosures to any other person and any such actions  
may be unlawful.  Ball reserves the right to monitor and review all messages  
and enclosures sent to or from this email address.
_______________________________________________
Liblas-devel mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/liblas-devel

Reply via email to