[DotSpatial]ラインの作成&属性の保存

大量の座標からシェープファイルでラインを作成する作業中にハマったので備忘録を兼ねて。
今回の作業でハマったポイントは二つ。

  1. 属性をどのように付けるか
  2. ラインを作成する時に構成点をどう登録するか

一つ目は9・10行目のように、LineShapefileオブジェクトにカラムを追加して、地物をLineShapefileオブジェクトに登録した後で地物のフィールドに書き込む事です。LineShapefileオブジェクトのDataTableに直接書き込んでも良いのでしょうが(今まではそうしてた)、行ズレが怖いのでこの方法が良さそうです。ただし、LineShapefileに登録する前だと、列定義がされていない状況のため、NullArgumentExceptionが発生してしまいます。

二つ目は、19行目のように、地物を作成する時に構成点をそのまま登録するのでは無く、LineStringオブジェクトの形で登録する事です。ポリゴンの作成の時は、Listをそのまま登録すればシェープファイルが作れましたが、ラインの時はダメでした。

オマケとして、測地系の設定は29行目。
LineShapefileオブジェクトのProjectionプロパティに、ProjectionInfoクラスのFromEpsgCodeメソッドを使って設定しました。Projectionプロパティが設定されていれば、33行目のようにSaveProjectionメソッドを実行しなくても*.prjファイルは作成されていました。

using DotSpatial.Data;
using DotSpatial.Topology;

//中略//

using (LineShapefile ls = new LineShapefile()) //ここではファイルは作成されない
{
    //属性テーブルのカラム設定
    ls.DataTable.Columns.Add("ID", typeof(int));
    ls.DataTable.Columns.Add("Name", typeof(string));

    //線分の構成点
    List<Coordinate> cs = new List<Coordinate>();
    cs.Add(new Coordinate(0, 0));
    cs.Add(new Coordinate(100, 100));
    cs.Add(new Coordinate(150, 100));

    //地物を作成
    Feature f = new Feature(new LineString(cs));

    //作成した地物をシェープファイルに登録
    ls.Features.Add(f);

    //属性を設定
    f.DataRow["ID"] = 1;
    f.DataRow["Name"] = "Test";

    //測地系(UTM zone54N:JGD2000)
    ls.Projection = DotSpatial.Projections.ProjectionInfo.FromEpsgCode(3100);

    //保存
    ls.SaveAs(sShp, true);
    //ls.SaveProjection();
}

参考