SQL Server Management Studio の空間結果タブに表現できるジオメトリには何らかの制約がある.その閾値は何で決まり,その値はいくつなのだろうか.MedicalAreaDBを使って検証してみた.
ポリゴン1個あたりのポイント数の上限は10万個?
根室医療圏のNumPoints()メソッドの返り値
きっかけは北海道の根室医療圏を表現できなかったことである.SQL Server にはジオメトリの形状を維持したままポリゴンのポイント数を減らす Reduce() メソッドが存在する.そのメソッドを適用したところ,表現できなかった根室医療圏が表示できた.根室医療圏の元のポイント数は10万を超える.Reduce(1) メソッドを適用すると約6万に減る.違いはポイントの数なのかもしれない.
ポイント数で大まかに切り分ける
色々試行錯誤した末,下記クエリにたどり着いた.
SELECT geog.STGeometryType() AS GeometryType , geog.STNumPoints() AS NumPoints , geog.Reduce(1).STNumPoints() AS ReducedNumPoints , geog FROM dbo.T_MedicalArea2_Dissolved AS M WHERE geog.STNumPoints() BETWEEN 100000 AND 1000000 ORDER BY geog.STNumPoints() DESC
結果は以下である.
(26 行処理されました)
しかし,空間結果タブには何も表示されない.BETWEEN 句の範囲を一桁ずつ減らす.
SELECT geog.STGeometryType() AS GeometryType , geog.STNumPoints() AS NumPoints , geog.Reduce(1).STNumPoints() AS ReducedNumPoints , geog FROM dbo.T_MedicalArea2_Dissolved AS M WHERE geog.STNumPoints() BETWEEN 10000 AND 100000 ORDER BY geog.STNumPoints() DESC
(173 行処理されました)
空間結果タブには11件表示される.どうやらポイント数1万と10万の間に閾値がありそうだ.
ポリゴンを一つずつ検証する
その後,更にクエリを変更して下記のようにしてみた.
SELECT TOP 30 M.A38b_003 , M.A38b_004 , geog.STNumPoints() AS NumPoints , geog FROM dbo.T_MedicalArea2_Dissolved AS M ORDER BY NumPoints DESC
結果は以下の通り.
0409 石巻・登米・気仙沼 531130 2403 南勢志摩 381462 1313 島しょ 354724 0307 宮古 291525 2201 賀茂 254700 4202 佐世保県北 222537 3603 南部 200646 4201 長崎 196932 4612 奄美 188285 3007 新宮 166430 3806 宇和島 161481 2404 東紀州 159823 4705 八重山 154497 0305 気仙 149441 0306 釜石 143146 4209 対馬 132163 4208 壱岐 130835 2808 但馬 127599 0308 久慈 125225 3803 今治 122840 4206 五島 118297 4207 上五島 113142 0504 秋田周辺 109414 0121 根室 106850 4611 熊毛 101434 1804 嶺南 100877 4311 天草 98571 0105 後志 98361 4605 川薩 96212 4001 福岡・糸島 95433
二次医療圏コード 1804 と 4311 の間でポイント数が 10 万を切っている.次のクエリを実行して,上から順に空間結果タブにポリゴンが表現されるか確認していく.**** には二次医療圏コードを指定する.
SELECT M.A38b_003 , M.A38b_004 , geog.STNumPoints() AS NumPoints , geog FROM dbo.T_MedicalArea2_Dissolved AS M WHERE M.A38b_003 = ****
結果はポイント数10万個を境に空間結果タブにポリゴンが表現されるか否か,決まるようであるが,厳密な閾値は分からなかった.
総数100万ポイントが上限?
ポリゴン一つあたりのポイント数とは別に,空間結果タブ全体でのポイント総数にも上限があるのかもしれない.
SELECT M.A38b_003 , M.A38b_004 , geog.STNumPoints() AS NumPoints , geog FROM dbo.T_MedicalArea2_Dissolved AS M WHERE geog.STNumPoints() < 100000
(309 行処理されました)
空間結果タブには「表示する空間オブジェクトが多すぎるため,最初の33個のオブジェクトが表示されています.クエリを修正してください.」と表示される.最初の33個に注目する.結果の NumPoint 列をExcelにコピペして最初の33セルを合計すると 986000 である.
次に SELECT 句の geog を geog.Reduce(1) と置換して実行し,表示されているオブジェクトの数だけ NumPoints を合計する.さらに Reduce() メソッドの引数 (Tolerance) を 2, 3, … と増やし同様の手順を繰り返す.引数 (Tolerance) が 7 に達した時点で表現件数が301 件と頭打ちになったため,インクリメントをそこで終了した.
結果をグラフに示す.おそらく100万が上限と思われるが,データが少なく確証が持てない.
まとめ
SQL Server Management Studio の空間結果タブに表現できるポリゴンの 1 個あたりの Point の上限は 10 万個と推測される.
同様に,空間結果タブに表現できるポリゴンの個数はその Point の総数により制限され,その上限は 100 万個と推測される.
いずれも筆者の環境に依存しており,他の環境で再現できるかは不明である.