Changeset 1343:94416cbd4575


Ignore:
Timestamp:
10/06/09 09:47:34 (10 months ago)
Author:
Howard Butler <hobu.inc@…>
Branch:
default
Message:

implement the ability to create a LASReader with an existing header to override the file's header

Files:
8 edited

Legend:

Unmodified
Added
Removed
  • include/liblas/capi/liblas.h

    r1335 r1343  
    183183LAS_DLL LASReaderH LASReader_Create(const char * filename); 
    184184 
     185/** Creates a LASReaderH object that can be used to read LASHeaderH and  
     186 *  LASPointH objects with.  The LASReaderH must not be created with a  
     187 *  filename that is opened for read or write by any other API functions. 
     188 *  @return opaque pointer to a LASReaderH instance. 
     189 *  @param filename Filename to open for read  
     190*/ 
     191LAS_DLL LASReaderH LASReader_CreateWithHeader(  const char * filename,  
     192                                                LASHeaderH hHeader); 
     193 
    185194/** Reads the next available point on the LASReaderH instance.  If no point  
    186195 *  is available to read, NULL is returned.  If an error happens during  
  • include/liblas/lasheader.hpp

    r1252 r1343  
    109109    /// Default constructor. 
    110110    /// The default constructed header is configured according to the ASPRS 
    111     /// LAS 1.1 Specification, point data format set to 0. 
     111    /// LAS 1.2 Specification, point data format set to 0. 
    112112    /// Other fields filled with 0. 
    113113    LASHeader(); 
  • include/liblas/lasreader.hpp

    r1309 r1343  
    6868    LASReader(std::istream& ifs); 
    6969 
     70    /// User-defined consructor initializes reader with input stream and 
     71    /// a header to override the values in the file 
     72    /// @excepion std::runtime_error - on failure state of the input stream. 
     73    LASReader(std::istream& ifs, LASHeader& header); 
     74     
    7075    /// Destructor. 
    7176    /// @excepion nothrow 
     
    146151    std::vector<LASVariableRecord> m_vlrs; 
    147152     
     153    bool bCustomHeader; 
     154     
    148155}; 
    149156 
  • python/liblas/core.py

    r1313 r1343  
    169169las.LASReader_Create.errcheck = check_void 
    170170 
     171las.LASReader_CreateWithHeader.argtypes = [ctypes.c_char_p, ctypes.c_void_p] 
     172las.LASReader_CreateWithHeader.restype = ctypes.c_void_p 
     173las.LASReader_CreateWithHeader.errcheck = check_void 
     174 
    171175las.LASReader_GetNextPoint.restype=ctypes.c_void_p 
    172176las.LASReader_GetNextPoint.argtypes = [ctypes.c_void_p] 
  • python/liblas/file.py

    r1312 r1343  
    7676    def open(self): 
    7777        if self._mode == 'r' or self._mode =='rb': 
    78             self.handle = core.las.LASReader_Create(self.filename) 
     78             
     79            if not self._header: 
     80                self.handle = core.las.LASReader_Create(self.filename) 
     81                self._header = lasheader.Header(handle = core.las.LASReader_GetHeader(self.handle)) 
     82            else: 
     83                self.handle = core.las.LASReader_CreateWithHeader(self.filename, self._header.handle) 
     84 
    7985            self.mode = 0 
    80             self._header = lasheader.Header(handle = core.las.LASReader_GetHeader(self.handle)) 
    8186            files['read'].append(self.filename) 
    8287             
  • python/tests/SRS.txt

    r1313 r1343  
    6767  ...         f.set_srs(s2) 
    6868  ...         p = f.read(0) 
    69   ...         p.descale(f.header) 
    7069  ...         if not s2.vlr_count() == 3: return False 
    7170  ...         if not s2.GetVLR(0).recordlength == 64: return False 
    72   ...         return int(round(p.x)) == -93  and int(round(p.y)) == 90 
     71  ...         return int(round(p.x)) == -93  and int(round(p.y)) == 42 
    7372  ...     return False   
    7473 
     
    7877  >>> del f 
    7978 
    80   >>> f = file.File('../test/data/1.2_3.las',mode='r') 
    81   >>> f.header.data_offset 
    82   438L 
     79 
     80# -93.3515625902 41.5771483954 
     81 
    8382  >>> utm_wkt = """PROJCS["NAD83 / UTM zone 15N",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.2572221010002,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4269"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-93],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","26915"]]""" 
    8483 
     
    8887  >>> s_utm = srs.SRS() 
    8988  >>> s_utm.wkt = utm_wkt 
     89 
     90  >>> f = file.File('../test/data/1.2_3.las',mode='r') 
     91  >>> dd_header = f.header 
     92  >>> utm_header = f.header 
     93  >>> del f 
     94 
     95  >>> utm_header.offset 
     96  [0.0, 0.0, 0.0] 
     97  >>> utm_header.offset = [offset+1.0/0.000001 for offset in utm_header.offset] 
     98  >>> utm_header.offset 
     99  [1000000.0, 1000000.0, 1000000.0] 
     100  >>> utm_header.scale = [0.000001,0.000001,0.000001] 
     101  >>> utm_header.srs = s_utm 
     102   
     103  >>> dd_header.scale = [0.000001,0.000001,0.000001] 
     104  >>> dd_header.srs = s_dd 
     105   
     106  >>> f = file.File('../test/data/1.2_3.las',mode='r', header = utm_header) 
     107  >>> f.header.data_offset 
     108  438L 
     109  >>> f.header.scale 
     110  [9.9999999999999995e-07, 9.9999999999999995e-07, 9.9999999999999995e-07] 
    90111  >>> p = f.read(0) 
    91112  >>> origx, origy = p.x, p.y 
     
    95116  True 
    96117  >>> p = f.read(0) 
    97   >>> p.descale(f.header) 
    98118  >>> p.x, p.y 
    99   (-92.999999999999972, 89.999999999999972) 
    100   >>> dd_header = f.header 
    101   >>> dd_header.scale = [0.000001,0.000001,0.000001] 
    102   >>> dd_header.srs = s_dd 
     119  (-93.350000000000009, 41.57) 
     120   
     121   
     122 
    103123  >>> f_project = file.File('junk_srs_project.las',mode='w',header=dd_header) 
    104124  >>> dd_header.srs.proj4 
     
    113133  >>> s_utm.wkt = utm_wkt 
    114134  >>> p3 = f3.read(1) 
    115   >>> p3.x, p3.y 
    116   (-92.999999000000003, 89.999999000000003) 
     135  >>> int(round(p3.x)), int(round(p3.y)) 
     136  (-93, 42) 
    117137  >>> p3 = f3.read(0) 
    118   >>> p3.x,p3.y 
    119   (-92.999999000000003, 89.999999000000003) 
     138  >>> int(round(p3.x)), int(round(p3.y)) 
     139  (-93, 42) 
    120140 
    121141  >>> import os 
  • src/las_c_api.cpp

    r1313 r1343  
    182182} 
    183183 
     184std::istream* OpenInput(std::string filename)  
     185{ 
     186    std::ios::openmode const mode = std::ios::in | std::ios::binary; 
     187    std::istream* istrm = 0; 
     188    if (compare_no_case(filename.c_str(),"STDIN",5) == 0) 
     189    { 
     190        istrm = &std::cin; 
     191    } 
     192    else  
     193    { 
     194        istrm = new std::ifstream(filename.c_str(), mode); 
     195    } 
     196     
     197    if (!istrm->good()) 
     198    { 
     199        delete istrm; 
     200        throw std::runtime_error("Reading stream was not able to be created"); 
     201        exit(1); 
     202    } 
     203    return istrm; 
     204} 
     205 
    184206LAS_DLL LASReaderH LASReader_Create(const char* filename)  
    185207 
     
    188210 
    189211    try { 
    190         std::ios::openmode const mode = std::ios::in | std::ios::binary; 
    191         std::istream* istrm; 
    192         if (compare_no_case(filename,"STDIN",5) == 0) 
    193         { 
    194             istrm = &std::cin; 
    195         } 
    196         else  
    197         { 
    198             istrm = new std::ifstream(filename, mode); 
    199         } 
    200212         
    201         if (!istrm->good()) 
    202         { 
    203             delete istrm; 
    204             throw std::runtime_error("Reading stream was not able to be created"); 
    205         } 
     213        std::istream* istrm = OpenInput(std::string(filename)); 
    206214        return (LASReaderH) new LASReader(*istrm); 
    207215 
     
    213221     } 
    214222 
    215      
     223} 
     224 
     225LAS_DLL LASReaderH LASReader_CreateWithHeader(  const char* filename, 
     226                                                LASHeaderH hHeader)  
     227 
     228{ 
     229    VALIDATE_LAS_POINTER1(filename, "LASReader_CreateWithHeader", NULL); 
     230    VALIDATE_LAS_POINTER1(hHeader, "LASReader_CreateWithHeader", NULL); 
     231 
     232    try { 
     233         
     234        std::istream* istrm = OpenInput(std::string(filename)); 
     235         
     236        LASHeader* header = ((LASHeader*) hHeader); 
     237        return (LASReaderH) new LASReader(*istrm, *header); 
     238 
     239     
     240    } catch (std::exception const& e) 
     241     { 
     242         LASError_PushError(LE_Failure, e.what(), "LASReader_Create"); 
     243         return NULL; 
     244     } 
     245 
    216246} 
    217247 
  • src/lasreader.cpp

    r1309 r1343  
    5656 
    5757LASReader::LASReader(std::istream& ifs) : 
    58     m_pimpl(detail::ReaderFactory::Create(ifs)) 
     58    m_pimpl(detail::ReaderFactory::Create(ifs)), 
     59    bCustomHeader(false) 
    5960{ 
    6061 
     
    6263} 
    6364 
     65LASReader::LASReader(std::istream& ifs, LASHeader& header) : 
     66    m_pimpl(detail::ReaderFactory::Create(ifs)), 
     67    bCustomHeader(false) 
     68{ 
     69    m_header = header; 
     70    bCustomHeader = true; 
     71    Init(); 
     72} 
    6473LASReader::~LASReader() 
    6574{ 
     
    112121 
    113122void LASReader::Init() 
    114 {     
     123{    
     124    // Copy our existing header in case we have already set a custom  
     125    // one.  We will use this instead of the one from the file if  
     126    // the constructor with the header was used. 
     127    LASHeader custom_header(m_header); 
     128 
    115129    bool ret = m_pimpl->ReadHeader(m_header); 
    116130    if (!ret) 
     
    123137    m_pimpl->ReadGeoreference(m_header); 
    124138    m_pimpl->Reset(m_header); 
     139     
     140    if (bCustomHeader) { 
     141        custom_header.SetDataOffset(m_header.GetDataOffset()); 
     142        m_header = custom_header; 
     143    } 
    125144} 
    126145 
Note: See TracChangeset for help on using the changeset viewer.