liblas : 読み込み

開く

C++なら、開いた後LASReaderクラスに関連付けます。
C_APIならLASReaderHを割り当てます。

C++の場合はいくつか方法があり、以下のようにします。
ヘッダオブジェクト、もしくはハンドルを取得するとこまでは以下のようにします。

パターン1:liblasチュートリアルにある方法

#include "liblaslasheader.hpp"
#include "liblaslasreader.hpp"
#include <fstream>
#include <iostream>

int main( int argc, char *argv[] )
{
  std::ifstream ifs;

  ifs.open( argv[1], std::ios::in | std::ios::binary );
  if ( !ifs.is_open() )
  {
    exit( 1 );
  }
  
  // または

#include "liblasliblas.hpp"
  
  if ( !liblas::Open( ifs, argv[1] ) )
  {
    exit( 1 );
  }
  
  liblas::LASReader reader( ifs );
  liblas::LASHeader const &header = reader.GetHeader();

パターン2:C API内部で使われている方法

ユーザ側には特にメリットはありませんが、以下のようにすることもできるようです。

#include "liblaslasheader.hpp"
#include "liblaslasreader.hpp"
#include "liblaslasfile.hpp"
#include <fstream>
#include <iostream>

int main( int argc, char *argv[] )
{

  liblas::LASReader *pReader;

  try
  {
    liblas::LASFile lasfile( argv[1] );
    
    try
    {
      pReader = &(lasfile.GetReader());
    }
    catch( ... )
    {
      throw std::runtime_error( "LASReader_Create rethrowing" );
    }
  }
  catch(std::exception const& e)
  {
    cout << e.what() << std::endl;
    exit( 1 );
  }

  liblas::LASHeader const &header = pReader->GetHeader();

C APIを使う場合

#include "liblascapiliblas.h"

int main( int argc, char *argv[] )
{
  LASReaderH hReader;
  LASHeaderH hHeader;
  
  hReader = LASReader_Create( argv[1] );
  if ( !hReader )
  {
    exit( 1 );
  }
  
  hHeader = LASReader_GetHeader( hReader );

固定ヘッダから情報を取り出す

ヘッダにはいろいろな情報がありますが、
とりあえずほしいのは点数でしょうか。

C++の場合

  int nPoints = header.GetPointRecordsCount();

他にもヘッダからいろいろな情報を取り出すことができます。

可変ヘッダの場合はまた別の方法で取り出すようです。

C APIの場合

  int nPoints;
  
  nPoints = LASHeader_GetRecordsCount( header );

点データを読み込む

シーケンシャル読みとランダム読みの両方が可能です。

シーケンシャル読み

C++の場合は以下のようにします。

  while ( reader.ReadNextPoint() )
  {
    liblas::LASPoint const &p = reader.GetPoint();
    std::cout << p.GetX() << "," << p.GetY() << "," << p.GetZ() << endl;

上の例はliblasホームページにあるとおりです。

少し凝った方法としてはイテレータを使う方法があります。

#include "liblasiterator.hpp"

  liblas::reader_iterator<liblas::LASPoint> it( reader );

  for ( int i = 0; i < nPoints; i++, it++ )
  {
    std::cout << it->GetX() << "," << it->GetY() << "," it->GetZ() << endl;
  }

liblasのイテレータは後方にのみ移動可能で、ランダムアクセスはできません。
したがって、”+=”とか”–“とかは使えません。

C APIでは以下のようにします。

#include <stdio.h>

  LASPointH hPoint;
  double dX, dY, dZ;
  
  while ( ( hPoint = LASReader_GetNextPoint( hReader ) ) )
  {
    dX = LASPoint_GetX( hPoint );
    dY = LASPoint_GetY( hPoint );
    dZ = LASPoint_GetZ( hPoint );
    printf( "%.3f, %.3f, %.3fn", dX, dY, dZ );
  }

ランダム読み

C++の場合は以下のようにします。

  if ( reader.ReadPointAt( 265 ) )
  {
    liblas::LASPoint const &p = reader.GetPoint();
    std::cout << p.GetX() << " | " << p.GetY() << " | " << p.GetZ() << endl;
  }

または

  try
  {
    liblas::LASPoint const &p = reader[265];
    std::cout << p.GetX() << " | " << p.GetY() << " | " << p.GetZ() << endl;
  }
  catch ( std::exception const &e )
  {
    std::cout << e.what() << endl;
  }

C APIでは以下のようにします。

  LASPointH hPoint;
  double dX, dY, dZ;
  
  hPoint = LASReader_GetPointAt( hReader, 265 );
  dX = LASPoint_GetX( hPoint );
  dY = LASPoint_GetY( hPoint );
  dZ = LASPoint_GetZ( hPoint );
  printf( "%.3f, %.3f, %.3fn", dX, dY, dZ );
アーカイブ