第 4 章 空間データオブジェクトを生成する (Beginning Spatial with SQL Server 2008)

SQL Server

第 2 部 空間データを追加する

 本書のこの部では空間データを SQL Server 2008 データベースに追加する様々な方法を説明する.第 4 章では,既知の座標からいかなるアイテムをも生成するのに使われる存在する静的メソッドのそれぞれを紹介する.第 5 章では,外部資源をかぶせてそれらの座標を派生させるのを助けるための技術を解説する.Microsoft の Virtual Earth Map Control を使う.第 6 章では,空間データの蓄積される他の一般的なデータフォーマットについて議論し,これらの蓄積されたデータを SQL Server 2008 にインポートする方法についての例を提供する.最後に,第 7 章で SQL Server を拡張してジオコーディング機能を提供する方法を示す.つまり,.NET 経由で Microsoft MapPoint Web Services にアクセスして自動的に住所から座標を取得することである.

 前章では,静的メソッドの概念について紹介し,geography 型および geometry 型のオブジェクトをインスタンス化する方法について説明した.本章では各データ型で利用できる異なる静的メソッドを検査し,空間データの新しいアイテムを生成するのに使われる方法について比較する.

注記 本章でのほとんどのコードサンプルは,@Point などのローカル変数を宣言し,その結果静的メソッドにより生成されたインスタンスを蓄積する.しかし,INSERT ステートメントを呼び出すことで静的メソッドの結果をテーブルの geometry 型および geography 型の列に挿入することもできる.

適切な静的メソッドを選択する

 geography 型および geometry 型は共に多くの異なる静的メソッドを提供し,空間データオブジェクトを生成する.特定の状況で適切なメソッドを使用するのは次に述べる因子による.

生成しようとするジオメトリの種類

 いくつかのメソッドは単に特定のジオメトリを生成するためだけに使われる.例えば,STLineFromWKB() メソッドおよび STLineFromText() メソッドは単に LineString ジオメトリインスタンスを生成するだけである.

このジオメトリの属性を記述する方法

 全てのメソッドはジオメトリの空間参照の提供を必要とし,三つの異なる標準フォーマットのうち一つを使う.つまり,Well-Known Text (WKT), Well-Known Binary (WKB) および Geometry Markup Language (GML) である.ジオメトリを記述するためにいずれのメソッドを選んだかにより,適切な表現フォーマットを使わなければならない.例えば,任意のジオメトリインスタンスを GML 表現から生成するには GeomFromGML() メソッドを使わなければならない.

geometry 型または geography 型で生成したいアイテムは一体何か

 geometry 型および geography 型共に,それら自身の各静的メソッドを実装している.静的メソッドはメソッド自身と同一のデータ型のオブジェクトのインスタンスを生成できるだけであるため,生成したいオブジェクトのデータ型によって適切なデータ型のメソッドを選択しなければならない.例えば,geometry 型の Point オブジェクトを WKT 表現から生成するには geometry::STPointFromText() メソッドを使うべきである.geography 型の Point オブジェクトを WKT 表現から生成するには代わりに同等の geography 型のメソッドである geography::STPointFromText メソッドを使うべきである.

 Table 4-1 に異なるジオメトリインスタンスを生成するのに使用されるメソッドを示す.これら全てのメソッドは geography 型にも geometry 型にも共に実装されている.

Table 4-1. 異なる表現から空間オブジェクトをインスタンス化するのにサポートされる方法
オブジェクトの種類 Well-Known Text Well-Known Binary Geography Markup Laguage
Point STPointFromText() STPointFromWKB() GeoFromGml()
LineString STLineFromText() STLineFromWKB() GeoFormGml()
Polygon STPolyFromText() STPolyFromWKB() GeoFromGml()
MultiPoint STMPointFromText() STMPointFromWKB() GeoFromGml()
MultiLineString STMLineFromText() STMLineFromWKB() GeoFromGml()
MultiPolygon STMPolyFromText() STMPolyFromWKB() GeoFromGml()
Geometry Collection STGeomCollFromText() STGeomCollFromWKB() GeoFromGml()
Any supported type STGeomFromText() Parse() STGeomFromWKB() GeoFromGml()

 空間オブジェクトを表現するのにいずれの言語を使うにせよ,また,いずれの型のオブジェクトを生成するにせよ,本章で議論する静的メソッドは全て同一の構文を共有する.この汎用構文は次に示す通りである.

datatype::method(geometryrepresentation, srid)

 この構文は次に示すとおり 4 つの構成要素からなる.

  • datatype は静的メソッドが geography 型か geometry 型のいずれに属するかを指定し,ゆえにメソッドにより生成されたインスタンスのデータ型を定義する.
  • method はジオメトリを生成するメソッド名である.これは必ず Table 4-1 に列挙したメソッドの一つでなければならない.
  • geometryrepresentation は生成すべきジオメトリの有効な表現である.この表現は選択されたメソッドにより生成された適切なフォーマットにおいて表現されなければならない.その表現とは(WKT および GML フォーマットの)文字列,あるいは問題のジオメトリを定義するのに必要な全情報を含んだバイナリーストリーム (WKB) である.
  • srid は空間参照系の識別子を表現した整数値であり,メソッドを通して geometryrepresentation パラメーター内で座標を定義するのに使われる.

 その中でジオメトリが表現される各フォーマットおよび,オブジェクトがそれらの表現から生成される各メソッドは,それぞれ利点と欠点を有する.しかし,geography 型データか geometry 型データか,いずれのメソッドを使ってアイテムを生成するかの決定は,生成の時点でのみ重要であり,アイテムの生成後は無関係になっていく.特定のメソッドを使って空間データのアイテムを生成してしまえば,そのデータのアイテムは,他の利用可能だったメソッドを使って生成されたものであっても,全く同一のものとなる.

レイトバインディング

 任意の静的メソッドにより指定された geography 型あるいは geometry 型オブジェクトへの参照は,実行中にのみ解決され,それはメソッドを呼び出すクエリが実行される時である.これはレイトバインディングとして知られている.レイトバインディングの一つの効果として,クエリが実行されるまでは SQLCLR はどんな種類のオブジェクトが静的メソッドにより生成されるかを知らない.結果として,SQL Server は表現を解析して有効なデータであるかチェックすることができない.例えば,次のクエリはいかなる解析エラーも発生させずに SQL Server Management Studio において正しくコンパイルされる.

SELECT  geometry::STGeomFromText('This is not a real geometry')

 しかし,実行の際に,メソッドに渡された表現が有効な WKT ではないため,このクエリは失敗する.有効な WKT とは,STGeomFromText() メソッドに必要な,という意味である.いかなる静的メソッドでも表現を指定して渡す時には注意されたい.というのは,これらのクエリを実行するまでエラーが表示されないかもしれないからである.

“第 4 章 空間データオブジェクトを生成する (Beginning Spatial with SQL Server 2008)” の続きを読む

国土数値情報の河川データが一部直っていた件

SQL Server

 以前の記事で国土交通省の国土数値情報の河川データが破損していると口を酸っぱくして述べたが,いつの間にか修復されていた.修復されていたのは北海道および茨城県のテーブル構造である.岐阜県と三重県のファイルは破損したままであり,修復を要した.

参考:QGISのフィールド計算機で国土数値情報の河川データの属性を修正する

QGISで国土数値情報のシェープファイルを修正する

国土数値情報の河川データの属性テーブルを編集してみたが…

“国土数値情報の河川データが一部直っていた件” の続きを読む

EXCEL VBA で既存のテーブルにネットワークドライブ上の Workbook からデータを追記する

FileSystemObject と VBA の関係

 前回の記事ではフォルダーから一括してデータを読み込む方法を紹介した.今回は月次の更新ファイルを読み込んで既存のテーブルにデータを追記する方法を紹介する.

 既に読み込んだファイルは拒否したい.監査としてのワークシートが必要だ.リレーショナルデータベースならデータの一意制約から可能だが,EXCEL では自前で作る必要がある.

 色々と挑戦しがいのある課題であった.

“EXCEL VBA で既存のテーブルにネットワークドライブ上の Workbook からデータを追記する” の続きを読む

新エネルギー・産業技術総合開発機構の太陽光スペクトルデータをピボットグラフで表現する

つくば市の6月の放射照度日内変動の平均

 色の知覚(1)太陽光では,新エネルギー・産業技術総合開発機構の日射データが巨大すぎてインポートできなかった.データをある程度絞り込むことで何とかならないか,試行錯誤した結果を報告する.

“新エネルギー・産業技術総合開発機構の太陽光スペクトルデータをピボットグラフで表現する” の続きを読む

第 2 章 SQL Server 2008 で空間データを実装する (Beginning Spatial with SQL Server 2008)

 前章では,空間参照系の背後にある理論を紹介し,異なる種類のシステムが地球上の特徴を記述する方法を説明した.本章では,これらのシステムを適用して SQL Server 2008 における新しい空間データ型を使って空間情報を蓄積する方法を学んでもらう.

“第 2 章 SQL Server 2008 で空間データを実装する (Beginning Spatial with SQL Server 2008)” の続きを読む

1920年から2015年までの都道府県別の5歳階級別人口推移

1920年から2015年までの都道府県別の5歳階級別人口推移

 e-Stat を渉猟していると面白いファイルを見つけた.国勢調査は 1920 年から開始されており, 2020 年 3 月現在では最新の調査結果は 2015 年のものである.20 回分の人口データが一つのファイルにまとめられており,グラフ化するには格好のデータである.

 年齢(5歳階級),男女別-都道府県(大正9年~平成27年)というファイルである.リンク先のページにはファイルが 3 つあるが,最後のものが最も粒度が細かいので,これをグラフ化する.

年齢(5歳階級),男女別人口-都道府県(大正9年~平成27年)
年齢(5歳階級),男女別人口-都道府県(大正9年~平成27年)

“1920年から2015年までの都道府県別の5歳階級別人口推移” の続きを読む

国勢調査から5歳階級の人口推移を調べる

日本人口の年齢階級推移(国勢調査より筆者作成)

 人口統計は最も重要な基幹統計の一つである.総務省の e-Stat は確かに有用であるが,かゆいところに手が届かない.例えば「市区町村ごと,年齢5歳階級ごとの人口構成の国勢調査ごとの推移を知りたい」という要求には全く無力である.

 主として技術的な理由によるものと,統計調査の粒度の細かさによる.技術的な理由としては,データベースの画面表示セル数の上限を容易に超えてしまうデータ量になってしまうことである.しかし,根本的な理由は調査の粒度の細かさである.

 2005 年以前と 2010 年以降とでは調査の精度が違う.今後は高精度なデータファイルが e-Stat に掲載されていくものと思われるが,2005 年以前に関しては都道府県より細かい粒度は存在しない.そこを求めると手作業になってしまい,現実的ではない.国立社会保障・人口問題研究所ならデータを持っているかもしれない.

 2020 年は国勢調査の年にあたる.総務省にはできるだけ細かい粒度でのデータ掲載を望むものである.

“国勢調査から5歳階級の人口推移を調べる” の続きを読む