shapelib : 書き込み

ファイルの作成

出力ファイルの作成はSHPCreate()関数で行いますが、
そのとき引数としてファイルの種別を指定します。
ファイルの種別は読み込みのところにあるSHPT_で始まる定数のうちのどれかです。

以下の例は2次元ポイントShapeファイルを作成する例です。

#include "shapefil.h"  // ←"shapefile.h"ではないので注意!

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

	hSHP_Out = SHPCreate( argv[2], SHPT_POINT );

ついでにDBFも作っておきましょう。
DBFの作成では特に指定はありません。

	DBFHandle hDBF_Out;
	char szDBF_Out[_MAX_PATH+1];

	strcpy_s( szDBF_Out, argv[2] );
	szDBF_Out[strlen(szDBF_Out)-3] = '';
	strcat_s( szDBF_Out, "dbf" );
	hDBF_Out = DBFCreate( szDBF_Out );

DBFファイルを作ったら、フィールドを定義します。
フィールドの型は読み込みのところにあるものと同じです。

フィールドを作成する関数はDBFAddField()です。
以下のように使います。

	// 255byteの文字列型を定義
	DBFAddField( hDBF_Out, "String", FTString, 255, 0 );

	// 10桁の整数型を定義
	DBFAddField( hDBF_Out, "Integer", FTInteger, 10, 0 );

	// 整数部10桁、小数部3桁の小数型を定義
	DBFAddField( hDBF_Out, "Double", FTDouble, 11, 3 );

第3引数の最大値は255です。
上の例の小数型の定義で、第3引数が11になるのは、小数点も含めた全長を指定するためです。

要素の書き込み

読み込みと同様、書き込みもSHPObject型で全ての要素を扱います。
まずは要素を作成し、書き込み、要素を破棄します。

以下の例はポイント、連続線分、単純ポリゴンなどの単純な要素を作成する例です。

	SHPObject *psOutObj;
	double *padfX, *padfY, *padfZ;
	int nVertices;

	// nVertices個の頂点の領域を確保
	padfX = new double[nVertices];
	padfY = new double[nVertices];
	padfZ = new double[nVertices];
	
	// 要素に頂点データを詰め込み
	
	// 要素オブジェクトを作成
	psOutObj = SHPCreateSimpleObject( SHPT_**, nVertices, padfX, padfY, padfZ );
	SHPWriteObject( hSHP_Out, -1, psOutObj );
	SHPDestroyObject( psOutObj );
	
	delete[] padfX;
	delete[] padfY;
	delete[] padfZ;

SHPCreateSimpleObject()関数の第1引数は、
ファイル作成時で指定したものと同じ値を指定します。

SHPWriteObject()関数で要素を書き込みます。
この関数の第2引数に-1を指定すると末尾に要素を追加します。

要素を書き込んだら、SHPDestroyObject()関数で要素を破棄します。

マルチパッチなどの複雑な要素を作成する場合はSHPCreateObject()関数を使用します。

DBFへレコードの書き込み

レコードの書き込みはDBFWrite***Attribute()関数を使います。”***”の部分はフィールドの型によって変わります。
大体以下のようにします。

	// i番目の要素のj番目のフィールドに文字列型を書き込む
	DBFWriteStringAttribute( hDBF_Out, i, j, szValue );

	// i番目の要素のj番目のフィールドに整数型を書き込む
	DBFWriteIntegerAttribute( hDBF_Out, i, j, nValue );

	// i番目の要素のj番目のフィールドに小数型を書き込む
	DBFWriteDoubleAttribute( hDBF_Out, i, j, dValue );

	// i番目の要素のj番目のフィールドにNULLを書き込む
	DBFWriteNULLAttribute( hDBF_Out, i, j );
アーカイブ