ArcGISなしでShapefileを読み込む方法


下記も参考

shp2sqlserver

WKB/WKTであればデータ連携に問題を感じることはないのでは?と言う話。
例えばNTSとも相互にデータ互換可能

Nugetで下記

Install-Package NetTopologySuite
Install-Package NetTopologySuite.IO

GeoToolsでPostGis MsSqlSpatial (まあ不要な気がするが)とShapefileが読める。
DBFファイル読み込みについてはエンコード問題ありか。
SQLServer空間データ型のメソッドが色々できるせいで、あまり有用性を感じなくなってしまったが。
GeoAPIジオメトリ経由でProj4くらいか?
Javaの場合はあまり決まり手がないので、JTS Topoぐらいだが。


UTF-8 / SJISの属性周りは色々ありそう。


using System;
using System.Collections;

using GeoAPI.Geometries;
using NetTopologySuite.Geometries;
using NetTopologySuite.IO;
using NetTopologySuite.Features;

class Program
{
  static void Main(string[] args)
  {
    const string SHP_PATH = @"C:\tmp\japan_ver71\japan_ver71_2.shp";

    GeometryFactory factory = new GeometryFactory();

    //ジオメトリタイプを確c1-30067?
    using (ShapefileDataReader shapeFileDataReader = new ShapefileDataReader(SHP_PATH, factory))
    {
      ShapefileHeader shpHeader = shapeFileDataReader.ShapeHeader;
      Console.WriteLine(string.Format("Shape type: {0}", shpHeader.ShapeType));

      //最大矩形を確c1-30067?
      Envelope bounds = shpHeader.Bounds;
      Console.WriteLine(string.Format("bounds: ({0},{1},{2},{3})", bounds.MinX, bounds.MinY, bounds.MaxX, bounds.MaxY));

      //DBFファイルのヘッダを確c1-30067?
      DbaseFileHeader header = shapeFileDataReader.DbaseHeader;
      Console.WriteLine("Dbase info");
      Console.WriteLine(string.Format("{0} Columns, {1} Records", header.Fields.Length, header.NumRecords));
      for (int i = 0; i < header.NumFields; i++)
      {
        DbaseFieldDescriptor fldDescriptor = header.Fields[i];
        Console.WriteLine(string.Format("   {0} {1}", fldDescriptor.Name, fldDescriptor.DbaseType));
      }

      shapeFileDataReader.Reset();

      Console.Write(Environment.NewLine);
      //レコードのc1-30035?みc1-28740?み
      while (shapeFileDataReader.Read())
      {
        Feature feature = new Feature();
        AttributesTable attributesTable = new AttributesTable();
        string[] keys = new string[header.NumFields];
        Geometry geometry = (Geometry)shapeFileDataReader.Geometry;
        for (int i = 0; i < header.NumFields; i++)
        {
          DbaseFieldDescriptor fldDescriptor = header.Fields[i];
          keys[i] = fldDescriptor.Name;
          attributesTable.AddAttribute(fldDescriptor.Name, shapeFileDataReader.GetValue(i));
        }
        feature.Geometry = geometry;
        feature.Attributes = attributesTable;

        consoleFeaature(feature);
      }
      //c1-27255?じる
      shapeFileDataReader.Close();
    }//end shp reader
  }//end method

  /// <summary>
  /// フィーチャのコンソール出力確c1-30067?
  /// </summary>
  /// <param name="f"></param>
  private static void consoleFeaature(Feature f)
  {
    Console.WriteLine(f.Geometry.AsText());

    //c1-28637?携可c1-32515?かの確c1-30067?用
    //System.Data.SqlTypes.SqlString str = new System.Data.SqlTypes.SqlString(f.Geometry.AsText());
    //System.Data.SqlTypes.SqlChars chars = new System.Data.SqlTypes.SqlChars(str);
    //Microsoft.SqlServer.Types.SqlGeometry msGeom = Microsoft.SqlServer.Types.SqlGeometry.STGeomFromText(chars, 0);
    System.Data.SqlTypes.SqlBytes bytes = new System.Data.SqlTypes.SqlBytes(f.Geometry.AsBinary());
    Microsoft.SqlServer.Types.SqlGeometry msGeom = Microsoft.SqlServer.Types.SqlGeometry.STGeomFromWKB(bytes, 0);
    Console.WriteLine(msGeom.STAsText().Value);

    object[] values = f.Attributes.GetValues();
    for (int i = 0; i < values.Length; i++)
    {
      if (i == 0)
        Console.Write("{0}", values[i]);
      else
        Console.Write(",{0}", values[i]);
    }
    Console.Write(Environment.NewLine);

  }

}//end class
カテゴリー: 開発, 設計 タグ: パーマリンク