Google MapsでJavaScriptのお勉強(PostGISと.NETもあるよ) その3


昨日の続きで、PostGISで作成した地理情報データベースに対して.NETからアクセスする方法です(・∀・)


今まで仕事で.NETとPostgreSQLっていう組み合わせはやったことは無かったんですけど。
#周りの人がODBC経由で接続しているのは見たことありますが


で、今回はNpgsqlを使ってみようかと思います。
PostgreSQLのインストール時に一緒にインストールされていますし。


NpgsqlはライセンスがLGPLで、Monoにも取り込まれているそうで。
MS1.1フォルダにはNpgsql.dllの他にMono.Security.dllも入っていますが、Monoに依存している部分があるって事ですかね。


まあ、とりあえずVisual Studio上からNpgsql.dllとMono.Security.dllを参照設定します。


で、地理情報テーブルにアクセスするために、こんな処理を書いてみました。

using Npgsql;
...

string connectionString = "Server=127.0.0.1;Port=5432;User Id=*****;Password=*****;Database=usamap;Encoding=UNICODE;";
string sql = "select id, name, x(spot_geometry) as lon, y(spot_geometry) as lat from spots";

using( NpgsqlConnection conn = new NpgsqlConnection( connectionString ) )
{
    conn.Open();

    using( NpgsqlCommand command = new NpgsqlCommand( sql, conn ) )
    {
        using( NpgsqlDataReader dr = command.ExecuteReader() )
        {
            while( dr.Read() )
            {
                ...
            }
        }
    }

    conn.Close();
}

SQLではx()、y()によってGEOMETRY型のフィールドの値を138.5690139、35.6670556のようなdouble値として取得しています。
これでデータの取得ができたので、基本検証はOK、実際のサービス層を構築しました。


Google Mapsのマーカー更新処理としては、GMapのBounds内に存在するマーカー一覧(LIMIT付き)が検索できれば良いことになります。
っというわけで、4つのdouble値を引数として、そのPOLUGON中にPOINTが存在するデータを取得する処理を作成しました。


なお、GEOMETRY型をパラメタライズドクエリする方法が分からなかったので、そこはこんな感じでお茶を濁しました(´・ω・`)

public static string FormatPolygon(double minX, double minY, double maxX, double maxY)
{
    return( String.Format( "GeometryFromText( 'POLYGON(({0} {1}, {2} {1}, {2} {3}, {0} {3}, {0} {1}))', 4326 )", minX, minY, maxX, maxY ) );
}

これでデータベース周りの検証は出来たことになるので、次はこれをAjaxで取得して処理するあたりの話になりますね。
やっとJavaScriptにたどり着いた…(´ω`)