開く
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 );