SQL Server(T-SQL)にて、空間データ型(geograhy)で遊んだ備忘録 Part.3

凸包よ、こんにちは

Geographyで遊んでいたら凸包(ConvexHull)を簡単に求めることが出来ることを知りました。

STConvexHull (geography データ型) - SQL Server | Microsoft Docs

凸包とは、「与えられた集合を含む最小の凸集合」のことで、「集合を輪ゴムで囲んだ時にできる形」などと喩えられることが多いです。

ja.wikipedia.org

凸包で遊んだ備忘録です。

国で見る凸包

まずは日本の凸包と、面積比を求めることにします。

使うデータベースはNatural Earthのもの(1:10m)を利用しました。

www.naturalearthdata.com

そして、日本の凸包と面積比は次のような形になります。
右下(南東)に随分と伸びているのは小笠原諸島南鳥島ですね。

f:id:mrgchr:20190926213448p:plain

南鳥島 - Wikipedia

日本の面積がおよそ378,000 km²とのことなので、上の図中に記載した面積の計算も誤差はありますがおおむね合っています。
そして日本の面積が凸包に占める割合はおよそ9%とのことです。思った以上に面積比が小さいです。

変換に用いたSQLメモ

;WITH CTE as (
  SELECT
    ROW_NUMBER() OVER(ORDER BY (SELECT NULL))  as row_id
  , geography::STGeomFromWKB(CONVERT(varbinary(max), [geohex], 1), 4326).MakeValid() as geog
  FROM [dbo].[geo]
)
SELECT
  row_id as 'Id'
  , CASE
      WHEN [geog].EnvelopeAngle() >= 90 THEN [geog].ReorientObject()
      ELSE [geog]
    END as 'Geograpy'
FROM CTE
  • 16進文字列[geohex]varbinary型に変換したのちに、STGeomFromWKB()geography型に変換
  • MakeValid()をしないとSTConvexHull()でエラーが出た
  • いくつかのデータでは「外側」が面積として認識された。ReorientObject()で回避できた。

最も凸な国を探す

そうなると「最も凸な国はどこ?」と思うのは自然なことです。
凸包と国の面積の比が高い順にTOP20を算出してみました。比が同じばあいは面積が大きい順で並べました。

Name Name_ja Type Sovereignt Area CovArea ratio
Baykonur Cosmodrome バイコヌール Lease Kazakhstan 6501.492 6501.492 1.000
Clipperton Island クリッパートン島 Dependency France 5.002 5.002 1.000
Nauru ナウル Sovereign country Nauru 28.767 28.767 1.000
Ashmore and Cartier Islands アシュモア・カルティエ諸島 Dependency Australia 2.695 2.695 1.000
Serranilla Bank セラニャ・バンク Indeterminate Serranilla Bank 0.105 0.105 1.000
Scarborough Reef スカボロー礁 Indeterminate Scarborough Reef 0.098 0.098 1.000
Bajo Nuevo Bank (Petrel Is.) バホヌエボ Indeterminate Bajo Nuevo Bank (Petrel Is.) 0.036 0.036 1.000
Coral Sea Islands コーラル・シー諸島 Dependency Australia 0.021 0.021 1.000
Vatican バチカン Sovereign country Vatican 0.012 0.012 1.000
San Marino サンマリノ Sovereign country San Marino 60.317 60.672 0.994
Sint Maarten シント・マールテン Country Netherlands 23.359 23.543 0.992
Monaco モナコ Sovereign country Monaco 18.840 19.158 0.983
Gibraltar ジブラルタル Dependency United Kingdom 3.692 3.775 0.978
Saint Barthelemy サン・バルテルミー島 Dependency France 24.423 25.520 0.957
Saint Lucia セントルシア Sovereign country Saint Lucia 605.131 635.722 0.952
Andorra アンドラ Sovereign country Andorra 17111.845 18255.353 0.937
Antigua and Barbuda アンティグア・バーブーダ Sovereign country Antigua and Barbuda 99.597 106.706 0.933
Uruguay ウルグアイ Sovereign country Uruguay 177345.126 192102.543 0.923
Singapore シンガポール Sovereign country Singapore 510.503 554.410 0.921
Macedonia マケドニア共和国 Sovereign country Macedonia 25385.269 27709.254 0.916

「ん?バイコヌールなんて国あったっけ?Cosmodromeって何だ?」と思って調べてみたらどうやら次のようなことらしいです。(Type:Leaseも反応に困ります)

ja.wikipedia.org

とりあえず、Type:Sovereign countryType:Countryを見ると、

あたりが凸に近い国だといえそうです。

全ての凸包を一度に描画すると次のようになりました。カッコイイですね。*1

f:id:mrgchr:20190926220648p:plain

その他

「凸包と面積の比」というのはよくありそうな指標ですが何か数学的な名前があるのか分かりません。
調べてみたら、GISの分野では"Compactness"という指標を計算する際にこの値も使われているようです。

Measuring Compactness

↑のリンクを読んで出てきた"Gerrymander"なる言葉は初めて知りました。

ja.wikipedia.org

*1:ノルウェーの凸包だけが何故かうまく描画できなかったのでここでは描画されていません