経度・緯度からPointジオメトリをSQL Serverで生成する

 eStatから国勢調査の小地域の境界データをダウンロードしSQL Serverにアップロードするではポリゴンを含むデータを SQL Server にアップロードするまでの記事を記した.今回はそのテーブル内に記録された経度,緯度から Point ジオメトリを生成する.第 6 章 空間データをインポートする (Beginning Spatial with SQL Server 2008)に倣っている.

WKTとは

 Well-Known Text の頭文字を取って WKT である.規格を策定したのは OGC (Open Geospatial Consortium) である.SQL Server にはいくつかのジオメトリが存在するが,代表的なものは Point, LineString, Poygon の3つである.

Point

 Point はただ1点からなるジオメトリである.WKT では () 内の引数は X 座標(経度),Y 座標(緯度)の順に記述し,X 座標と Y 座標は半角スペースで接続する.具体的には以下のように記述する.

Point(Lon Lat)

LineString

 LineString は2つ以上の Point からなるジオメトリである.WKT では半角スペースで接続した X 座標と Y 座標のタプルをカンマで接続する.具体的には以下のように記述する.

LineString(Lon Lat, Lon Lat, ...)

Polygon

 Polygon は3つ以上の Point からなるジオメトリである.WKT では LineString 同様,半角スペースで接続した X 座標と Y 座標のタプルをカンマで接続する.具体的には以下のように記述する.

Polygon((Lon lat, Lon Lat, Lon Lat, ...))

geography::STPointFromText メソッドで WKT から Point ジオメトリを生成する

 公式の説明は STPointFromText (geography データ型)にある.引数に WKT と SRID を渡すと Point ジオメトリを生成するメソッドである.経度は X_CODE, 緯度は Y_CODE である.SRID は STSrid メソッドから 4612 であると分かるため,それに倣う.

 メソッドの構造から推測できるように,WKT から LineString を生成する STLineFromText メソッド,WKT から Polygon を生成する STPolyFromText メソッドも存在する.

USE ZIPCODEDB;
GO
SELECT	Z.X_CODE
,	Z.Y_CODE
,	Z.geom.STSrid	AS 'SRID'
,	'Point('+ CAST(Z.X_CODE AS nvarchar(255)) + ' '+ CAST(Z.Y_CODE AS nvarchar(255)) + ')'	AS WKT
,	geography::STPointFromText('Point('+ CAST(Z.X_CODE AS nvarchar(255)) + ' '+ CAST(Z.Y_CODE AS nvarchar(255)) + ')', 4612)	AS 'Location'
FROM	dbo.T_Small_Geographic_Area	AS Z

テーブル構造の変更

 テーブルに Point ジオメトリを格納するための列を追加し,WKT から生成した Point ジオメトリを実際に格納する.

テーブルに geography 型の Location 列を追加する

 下記のクエリを実行してテーブルに geography 型の列 Location を追加する.

USE ZIPCODEDB;
GO
ALTER TABLE T_Small_Geographic_Area
ADD Location geography
GO

Location 列 に Point を SET する

 下記のクエリを実行して Location 列に Point を SET する.

USE ZIPCODEDB;
GO
UPDATE T_Small_Geographic_Area
SET Location = geography::STPointFromText('Point('+ CAST(T_Small_Geographic_Area.X_CODE AS nvarchar(255)) + ' '+ CAST(T_Small_Geographic_Area.Y_CODE AS nvarchar(255)) + ')', 4612)

 成功すると下記の結果が表示される.

(232019 行処理されました)

結果

 下記のクエリを実行する.

USE ZIPCODEDB;
GO
SELECT	TOP 10 Location
FROM	dbo.T_Small_Geographic_Area;

 結果は下記のとおりである.

Location
0x04120000010C910F7A36AB864540D9CEF753E3A96140
0x04120000010C91ED7C3F35864540355EBA490CAA6140
0x04120000010CBF7D1D386784454004560E2DB2A96140
0x04120000010CCBA145B6F38545401283C0CAA1A96140
0x04120000010CBC7493180486454021B0726891A96140
0x04120000010C925CFE43FA854540FED478E926A96140
0x04120000010C90A0F831E6864540F6285C8FC2A96140
0x04120000010C18265305A3824540AAF1D24D62A86140
0x04120000010CC74B378941884540BC74931804AA6140
0x04120000010CE3A59BC420884540448B6CE7FBA96140

まとめ

 2020年の国勢調査の小地域の境界データのテーブルにある経度・緯度からPointジオメトリを生成した.定義書によると X_CODE, Y_CODE は図形中心の X 座標および Y 座標である.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください