凸包よ、こんにちは
Geographyで遊んでいたら凸包(ConvexHull)を簡単に求めることが出来ることを知りました。
STConvexHull (geography データ型) - SQL Server | Microsoft Docs
凸包とは、「与えられた集合を含む最小の凸集合」のことで、「集合を輪ゴムで囲んだ時にできる形」などと喩えられることが多いです。
凸包で遊んだ備忘録です。
国で見る凸包
まずは日本の凸包と、面積比を求めることにします。
使うデータベースはNatural Earthのもの(1:10m)を利用しました。
そして、日本の凸包と面積比は次のような形になります。
右下(南東)に随分と伸びているのは小笠原諸島南鳥島ですね。
日本の面積がおよそ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
も反応に困ります)
とりあえず、Type:Sovereign country
やType:Country
を見ると、
あたりが凸に近い国だといえそうです。
全ての凸包を一度に描画すると次のようになりました。カッコイイですね。*1
その他
「凸包と面積の比」というのはよくありそうな指標ですが何か数学的な名前があるのか分かりません。
調べてみたら、GISの分野では"Compactness"という指標を計算する際にこの値も使われているようです。
↑のリンクを読んで出てきた"Gerrymander"なる言葉は初めて知りました。