SQL Server Management Studioの空間結果タブに表現できる上限とは

 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で表現できるPointの総数
SQL Server Management Studioで表現できるPointの総数

まとめ

 SQL Server Management Studio の空間結果タブに表現できるポリゴンの 1 個あたりの Point の上限は 10 万個と推測される.

 同様に,空間結果タブに表現できるポリゴンの個数はその Point の総数により制限され,その上限は 100 万個と推測される.

 いずれも筆者の環境に依存しており,他の環境で再現できるかは不明である.

コメントを残す

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

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