C#でSpatialiteにShapeをインポート

SpatialiteはSQLiteに空間データを扱う機能を拡張したデータベース。
C#からSpatialiteにアクセスするにはSQLiteの.Net ProviderとSpatialiteの拡張機能のmod_spatialite.dllを使用する。

(1)SQLiteの.net providerのダウンロード
今回は.NET Framework4.0で使用するため、以下のサイトより
https://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki
Precompiled Binaries for 32-bit Windows (.NET Framework 4.0)である
sqlite-netFx40-binary-Win32-2010-1.0.99.0.zip
または
sqlite-netFx40-binary-bundle-Win32-2010-1.0.99.0.zip
をダウンロードし、
System.Data.SQLite.dll、
SQLite.Interop.dll
を使用

(2)mod_spatialite.dllのダウンロード
Spatialiteより
32bitならば
http://www.gaia-gis.it/gaia-sins/windows-bin-x86/mod_spatialite-4.3.0a-win-x86.7z
64bitならば
http://www.gaia-gis.it/gaia-sins/windows-bin-amd64/mod_spatialite-4.3.0a-win-amd64.7z
をダウンロード

以下のファイルが入っている(32bitの場合)
libfreexl-1.dll
libgcc_s_dw2-1.dll
libgeos-3-5-0.dll
libgeos_c-1.dll
libiconv-2.dll
liblzma-5.dll
libproj-9.dll
libsqlite3-0.dll
libstdc++-6.dll
libxml2-2.dll
mod_spatialite.dll
sqlite3.exe
zlib1.dll

(3)検証プログラムの作成

C:\temp\svg\T02.shp

を仮想テーブル「T02」に読み込む

SQLiteの.net providerを参照設定しmod_spatialite.dllと関連ファイルにPATHを通す。

using System.Data.SQLite;

public partial class Form1 : Form
{
    private void button1_Click(object sender, EventArgs e)
    {
        string filename = @"c:\temp\db.sqlite";
        SQLiteConnection con = new SQLiteConnection();
        con.ConnectionString = string.Format("Data Source={0}", filename);
        con.Open();
        // 拡張DLLのロード
        using (SQLiteCommand cmd = new SQLiteCommand("SELECT load_extension(\"mod_spatialite\")", con))
        {
            cmd.ExecuteNonQuery();
            SQLiteCommand cmd2 = new SQLiteCommand("CREATE VIRTUAL TABLE T02 USING VirtualShape(\"C:\\temp\\svg\\T02\", \"CP1252\", 23032)", con);
            md2.ExecuteNonQuery();
        }
        con.Close();
        con = null;
    }
}

CP1252は文字コードなのでSHIFT JISならば[SHIFT_JIS]を設定
23032はEPSGなのでデータのEPSGを設定
VirtualShapeは以前はmod_spatialiteとは異なる拡張DLLだったが、今は同じようだ?