ファイルの作成
出力ファイルの作成は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 );