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 座標である.