SQLite ST_Geometry [ ArcGIS 10.2]


これはいいんじゃないか?
ただ作成がArcPy Only ?まあ大した問題ではない。

ST_Geometry.dllをどこまで配布していいのかとかは謎。
実戦で使用の場合は確認か。(たぶんコピーだけで動くのでは?)

とりあえず Desktop インストールディレクトリにsoとdllが詰まっている。
Androidでso使いたいが、ARMビルドを提供してはくれないものかな。

要はdllとかsoを読ませればあとはSQLite3が駆動するので非常にお手軽。
ファイル読み込みさえ可能ならば空間判定・空間演算ができるようになる。
全て関数でジオメトリ型自体に関数つかないのがSQLiteの実装か。

GEOS/PROJ.4が必要なSpatiaLiteと比較して、より簡易で使い易いか。

SQL Function

http://resources.arcgis.com/en/help/main/10.2/index.html#/A_quick_tour_of_SQL_functions_used_with_ST_Geometry/006z0000003n000000/

ST_Geometry実装自体の情報も少ないが、Oracle/PostgreSQL/SQLiteラッパ以外は概ね共通のはず?
速度周りは気になるぐらいか、Oracleはextprocの影響をもろにかぶりそうだが。

http://gis.stackexchange.com/questions/32184/arcgis-query-layer-performance-documentation-or-feedback?rq=1

http://gis.stackexchange.com/questions/48480/st-geometry-vs-sde-binary-seeking-recommendations-experiences

コードは下記

exeと同ディレクトリにdll置いておいて確認。
300001のSRIDはJGD2000だがやはりSpatialRef用のテーブルで制御されている模様。
FactoryCode等から取得するクエリを用意する等の前準備は必要か。

using System;
using System.Data;
using System.Data.SQLite;
using System.Diagnostics;

public class SQLiteDac
{
  public static void Test()
  {
    string filePath = @"C:\Data\ST_GEOM.sqlite";
    using (SQLiteConnection sqlCon = new System.Data.SQLite.SQLiteConnection("Data Source=" + filePath))
    using (SQLiteCommand cmd = sqlCon.CreateCommand())
    using (DataSet ds = new System.Data.DataSet())
    {
      sqlCon.Open();

      const string EXT_QUERY = "SELECT load_extension('stgeometry_sqlite.dll','SDE_SQL_funcs_init');";
      cmd.CommandText = EXT_QUERY;
      cmd.ExecuteNonQuery();

      //cmd.CommandText = "SELECT *, st_srid(Shape) FROM JPN71";

      cmd.CommandText = @"
SELECT
 *
FROM
 JPN71 TAB
WHERE
 st_intersects(st_geomfromtext('point (135.0 35.0)', 300001), TAB.Shape) = 1";

      SQLiteDataAdapter dataAdapter = new System.Data.SQLite.SQLiteDataAdapter();
      dataAdapter.SelectCommand = cmd;

      dataAdapter.Fill(ds);
      DataTable dt = ds.Tables[0];
      using (dt)
      {
        foreach (DataColumn col in dt.Columns)
        {
          Console.Write(col.ColumnName);
          Console.Write(",");
        }
        Console.Write(Environment.NewLine);

        foreach (DataRow row in dt.Rows)
        {
          foreach (DataColumn col in dt.Columns)
          {
            Console.Write(row[col]);
            Console.Write(",");
          }//end col
          Debug.Write(Environment.NewLine);
        }//end row
      }//end table
      sqlCon.Close();
    }//end sqlite
  }//end method
}//end class
カテゴリー: 開発, 設計 タグ: , パーマリンク