GeoGraphics
Wolfram言語のバージョン10.0以来,GeoGraphicsは地球上あるいはその他の天体上の地図を作成するための一般的で簡単な方法となっている.GeoGraphicsは強力なGraphics機能を,高速で高精度の測地学計算,およびEntityフレームワークを使ったWolfram Knowledgebaseへの直接アクセスと統合する.
標準の2DGraphicsに対してGeoGraphicsに含まれる新しい基本的な事項は,地球の表面は曲面なので紙上やコンピュータスクリーン上で平坦な地図を作成する場合,変形させる必要があるということである.このため,曲面上の点を平坦な地図上の点にどのようにマップすればよいかを決定する関数,地図投影法の選択が常に必要である.GeoProjectionDataパクレットは多数の投影法を提供する.
GeoGraphicsは地球の曲率に適応したGeoPath,GeoDisk,GeoHemisphere等の新しい地理的プリミティブや,DayHemisphere,DayNightTerminator等の時間依存の測地プリミティブも導入している.
GeoGraphicsはWolfram Knowledgebaseに簡単にアクセスし,Entityフレームワークを使って地理的情報を得ることができる.国や都市から橋,地震,人工衛星までのさまざまなタイプのオブジェクトに関する多数の特性に一様にアクセスできるのである.
GeoGraphicsは,バージョン10.0で大きく更新されたWolfram言語の測地学機能とも完全に統合されている.この機能は格段に高速になり,楕円体地球の表面でミリ単位まで正確になっている.GeoPositionを使うと地球上の任意の位置を指定するのに,GPS衛星によって使われるWGS84の準拠楕円体をはじめとしたGeodesyDataの多数の楕円体のどれでも使える.
これは,GeoGraphicsとそれに関連した関数についての入門チュートリアルである.まず,GeoGraphicsに適切な座標範囲,投影法等を選ばせることで,任意の地域または地理的実体の地図を簡単に作成する方法を見ていく.次にニーズに応じて地図を調整するために,オプションを選ぶ方法について説明する.
最も簡単であるが最も重要な操作は,指定された領域の地図を取得することである.Entityフレームワークは,要求された位置情報を得るための高速で均整の取れた方法を提供する.GeoGraphicsにより適切な投影法が選ばれるが,通常スケールが小から中(対角線がおおよそ2000km未満)の場合は"Mercator"図法が選ばれる.
GeoGraphics[primitives,options] | 地図を描画する |
世界の地図は,オプション値GeoRange"World"を使って得ることができる.このような地図はデフォルトでは"Equirectangular"図法を使って与えられる.これは,横軸が厳密に経度であり縦軸が厳密に緯度である.同様にGeoRange"Country"ではユーザがいる国の地図が返され,GeoGraphicsによって地図の歪みを最小にする投影法が選ばれる.
$GeoLocationにより判定される国の地図:
オプションGeoRange,GeoRangePadding,GeoCenter,GeoZoomLevelを使うと,いくつもの方法で関心領域を指定することができる.その方法については,このチュートリアルの後半で扱う.
ここまで,指定された領域に対応する測地背景画像を表示する地図を作ってきた.GeoGraphics言語は,地図の上に置くことのできる測地プリミティブという多様なオブジェクトを提供している. これらの測地プリミティブには,点状(PointあるいはGeoMarker),線状(GeoPath,GeoCircle,Line等),領域状(GeoDisk,GeoHemisphere,Polygon等)のものがある.
地図にスタイルを付けるのには,いくつかの方法がある.緯線や子午線,スケールバーを加えたり,測地背景を変更して高度データや等高線プロットの起伏地図を描いたりすることができる.色や透明度を変更したり,測地円板や多角形のような2Dの測地プリミティブの内部に画像を入れたり等,多数のオプションがある.
GeoPositionと測地実体
地球上の特定の位置はGeoPosition[{lat,lon}]オブジェクトで与えることができる.これは標準的な慣習に従い, 緯度経度の座標は度単位で与えられる.GeoPositionは,地理的なEntityオブジェクトおよびEntityClassオブジェクト等,他の形式の入力でも変換することができる.
GeoPosition[{lat,lon}] | 地球表面の位置 |
Entity["type",name] | 指定されたタイプの実体 |
EntityClass["type",name] | 指定されたタイプの実体のクラス.実体のリストに等しい |
ラジアンをQuantityオブジェクトとして任意の単位で与える:
地理的なEntityデータを数値座標に変換する:
GeoPositionは座標の配列を扱うこともできる.これは多数の点を同時に効率的に操作できて便利である.配列の点は異なる表記法で与えてもよい.GeoPositionがそのすべてを数値座標に変換する.
EntityClassオブジェクトは,そのメンバーのリストの代表として解釈される:
距離と方位(角度)
指定された場所の座標位置の他,2地点の間の距離,および人が1点から別の点に移動するのに辿る必要のある羅針方位を知ることも重要な場合が多い.距離は測地線,つまり2地点間の最短曲線に沿って計算される.角度は,北からその測地線までの角度を時計回りに測定した方位として与えられる.Wolfram言語では,地球表面の距離はGeoDistanceで測定され,方位はGeoDirectionで計算される.
GeoDistance[loc1,loc2] | 2地点間の測地距離 |
GeoDirection[loc1,loc2] | loc1から loc2までの測地線 loc1における北からの角度 |
GeoDisplacement[loc1,loc2] | loc1から loc2までの測地線 loc1の距離と角度 |
GeoDestination[loc1,displ] | loc1から始まり displ によって与えられる測地線の終点の位置 |
別の単位に変更するためには,UnitConvertを使う:
GeoDistanceの呼出しで必要な単位系を変更することもできる:
距離を計算するためにEntityオブジェクトを直接使うこともできるが,Wolfram言語関数は可能な限り,純粋に点状の位置ではなく多角形情報を使おうとする.つまりGeoDistanceは多角形のすべての点を考慮してできるだけ最短の距離を返すのである.
方位はGeoDirectionを使って計算される.現在,この関数は多角形情報ではなく位置情報のみを扱う.必要に応じて警告メッセージが出力される.
GeoDirectionは常に中心位置を使うため,上の結果と下の結果は同じになる:
GeoDisplacementは距離(単位:メートル)と方位(単位:度)の両方を返す:
関係を示す位置付け
位置が与えられたとき,その場所から短距離内に特定のタイプの実体が存在するかどうかを知ることが重要な場合がよくある.これを行うのが関数GeoNearestである.位置あるいは実体が拡張されると,面白い包含関係が見付かることもある.
GeoNearest[enttype,loc] | loc に最も近い enttype タイプの実体 |
GeoIdentify[enttype,loc] | loc を含む enttype タイプの実体 |
GeoEntities[reg,enttype] | 領域 reg に含まれる enttype タイプの実体 |
GeoWithinQ[reg,loc] | loc が領域 reg に含まれるかどうか |
逆に,GeoEntitiesは与えられた拡張実体に含まれる実体をリストする.
関数GeoWithinQは地理的領域内部に地理的位置(拡張か否かにかかわらない)が含まれるかどうかをチェックする.
これらの計算はすべてWolframの測地サーバに送られ,結果はそのサーバからダウンロードされる.Nearestを使ってローカルで操作を実行することが可能な場合もある.
測地実体の限定子
小さい島や距離が大きく離れている属領を含まない,主たる国土部分の地図だけが欲しい場合もあれば,すべての領土を含む地図が欲しい場合もある.このような場合,Wolfram言語は頭部GeoVariantを使って追加の情報を指定する.
GeoVariant[entity,variant] | 地理的な限定子付きの実体 |
この他の測地関数も測地実体の限定子を扱うことができる.しかしデフォルトは必ずしも同じではない.例えば,GeoNearestのデフォルトの限定子は,対応するGeoGraphicsのデフォルトよりも大きい場合がある.
$GeoLocationとFindGeoLocation
Wolfram言語はGeoIP情報を使って,ユーザの大体の位置を判定することができる.これにはFindGeoLocationが使われ,結果は大域変数$GeoLocationに保存される.変数Hereを使っても,現在の測地位置にアクセスすることができる.GeoGraphicsに関連する関数の多くは,位置情報が提供されない限りデフォルトで現在位置になる.$GeoLocationは手動で好きな位置に設定することができ,そのWolfram言語セッションはその位置にいるかのように動作する.$GeoLocationの値を設定すると,変数$GeoLocationCityと$GeoLocationCountryは$GeoLocationを含む都市と国,あるいは最も近い都市と国に自動的に設定される.$GeoLocationを変更しても$TimeZoneは自動的に変更されないので注意のこと.
$GeoLocation | ユーザの現在の測地位置を含む,再設定可能な変数 |
Here | 現在の測地位置を得る簡単な方法 |
$GeoLocationCity | 現在の測地位置に最も近い都市 |
$GeoLocationCountry | 現在の測地位置も近い国 |
FindGeoLocation[] | GeoIP情報を使って現在の測地位置を求める |
現在の$GeoLocation:
$GeoLocationを他の場所に変更する:
FindGeoLocationを使って,ある場所のおおよその位置を求める:
LatitudeとLongitude:GeoRange
経緯度座標で覆われる地図上の領域を指定する最も一般的な方法は,オプションGeoRange{{latmin,latmax},{lonmin,lonmax}}を使うことである.ここでも角度は標準的に度で指定される.この他の測地範囲の指定は, 最終的に内部的にこのような範囲の指定に変換され,GeoRangePaddingオプションで指定されたように拡張されることもある.
GeoRange | 地図の範囲を指定する,GeoGraphicsのオプション |
GeoBoundsは任意の地理的領域の経緯度範囲を計算する:
GeoCenter
測地範囲を与える別の方法として,中心と半径の距離を与えて地球表面に測地円板を定義するというものがある.測地範囲はその測地円板を完全に包囲する{lat,lon}座標の矩形となる.これはオプションGeoCenterとGeoRangeを使って行うことができる.後者は半径距離だけを含む.
GeoCenter | 地図の中心を指定する,GeoGraphicsのオプション |
GeoCenterオプションは地図の中心点を選ぶために使うこともできる.地図のGeoRangeは入力から自動的に得られる.オプションGeoRangeが明示的に領域を指定する場合,これがGeoCenterで提供される他の情報を常にオーバーライドする.
地図領域のその他の指定
GeoGraphicsは測地プリミティブ内部ではなく入力で位置情報を受け付ける.この情報は地図の範囲指定の一因となるが,それに関連付けられた地図上には何も描画されない.中心の情報だけが利用できる場合,地図のデフォルトのスケールは半径約10マイルとなる.
Entityオブジェクトを使う場合,GeoGraphicsは位置と多角形の情報が存在するかどうかをEntityValueでチェックする.測地多角形が得られる場合はスケールが明確である.多角形が得られない場合は,前述のように中心位置とデフォルトスケールを使う.
投影座標
世界の多くの地域に対するデフォルトの投影法は"Equirectangular"である.この投影法では,地図の座標が直接経度と緯度となる.しかし,変形を少なくするために他の投影法を選んだ方がよい地域もある.地図の座標は直接角度を意味しない.例えば,低いスケール(対角線が約2000km未満)の場合,デフォルトの投影法は,形状を維持する"Mercator"である.この場合,横軸は緯度を表すが,縦軸は経度ではない.
メルカトル図法はインターネットの地図サービスでよく使われる.しかしこれでは両極付近の距離や地域が大きく変形する.実際両極は垂直線に沿った無限遠で描かれるので,メルカトル図法では全世界を一つの地図で示すことができない.GeoGraphicsを使うと,必要な投影法を選ぶことができ,パクレットGeoProjectionDataは利用できる投影法の広範なコレクションを提供する.投影法が明示的に指定されていない場合,GeoGraphicsはスケールと地図の中心に従って,適切な投影法を選択する.
GeoProjection | 地図投影法を指定するGeoGraphicsのオプション |
GeoGridPositionは,選ばれた投影法における厳密な座標を与える:
地図投影法について
Wolfram言語には地図投影法や投影座標を制御するための関数やパラメータが多数ある.このセクションではその概要を紹介する.詳細はGeoProjectionおよびGeoProjectionDataのドキュメントをご参照いただきたい.
地図投影法とは,地球表面上の点を平坦な地図の表面に投影する関数であり,常に何らかの変形が存在する.このための関数は多数あるが,変形を最小限にする等,結果の外観や目的によってどれを選ぶかが決定される.投影法はいくつかに分類できる.
投影法の多くは,球上の点を接平面上にマップする幾何的方法(方位角投影),接円筒(円筒図法),接円錐(円錐図法)を使って定義される.それぞれの割図法に対して,簡単に式を一般化することができる.基本的には,円筒や円錐の軸が球体の極軸に揃えられる.
これらの基本的なタイプの投影法には多数のバリエーションがある.たとえば,緯線が水平直線で経線が任意の曲線となれる場合,結果は「擬円筒」図法となる.特定のタイプを元来持たない投影法は通常「その他」と分類される.
地図投影法にはパラメータがある.GeoProjectionData[projname]は投影法のパラメータのデフォルト値を与える.
充填
緯度と経度の範囲を明示的に数値で指定したGeoRangeオプションは,リクエストされた正確な領域の地図を返す.円筒図法ではない場合,地図の境界は,指定された緯線と経線に対応する曲線になる.
GeoRangePadding | 測地範囲の充填を指定するGeoGraphicsのオプション |
GeoRangePadding->Fullを使うと,矩形の地図を完全にすることができる:
地理的なEntityオブジェクトあるいはEntityClassオブジェクトにより指定される地図は,まずGeoBoundsでオブジェクトの緯度と経度の限界を計算し,少量の充填を加え,矩形のプロット範囲にすることで構築される.これはGeoRangePadding->Fullを使うことに等しい.
次はGeoGraphicsによって選ばれた測地範囲:
もとの地図を得るためには,充填指定とFullを組み合せる:
GeoRangePaddingオプションは非常に柔軟である.地図の四方向にそれぞれ別の充填を指定することも,距離,角度,全体地図のスケールの比率等,実際の充填を異なる方法で指定することもできる.その名前のリンクをクリックすると,可能なものがすべて見られる.
GeoZoomLevelとImageSize
測地範囲を指定する別の方法に,点(GeoCenterを選ぶか,GeoGraphicsの第1引数に点のようなオブジェクトを与える)やズームレベルを選ぶというものがある.GeoGraphicsは測地範囲の半径を選び,測地背景画像が256×256画素の小さい数のタイル(通常10個)で構築されるようにする.地図のImageSizeオプションを大きくすると測地範囲を大きくすることができる.
GeoZoomLevel | ズームレベルを指定するGeoGraphicsのオプション |
ImageSize | 最終的な地図の画素サイズを指定するオプション |
点とマーカー
違う色でもっと大きい点を描く.位置のリストにマップせずに,Pointを使うことができる:
EntityClassオブジェクトは,そのメンバーのリストを表すので,そのオブジェクト自体を使うこともできる:
GeoMarkerプリミティブは指定された位置に何かを置く際に柔軟性を提供する.
上の画像をそれぞれの位置に使う.アイコンEntityオブジェクトの代りに画像を使うことができる:
経路
GeoPathプリミティブは,地球表面上の任意の直線が平面地図上に投影される前の直線を表す.つまり,GeoPathオブジェクトは地球の曲面上で幾何学的意味を持つ軌道なのである.そのような線は,現在"Geodesic"(指定された2点間の最短経路),"Loxodrome"(同じ方位角あるいは角度を持つすべての経線を横切る曲線),"GreatCircle"(地球を,中心を通る平面で切断することで得られる曲線)の3種類がサポートされている.経線は常に航程線であり大圏コースでもある.緯線は常に航程線であるが,大圏コースであるとは限らない.赤道は大圏コースと一致する唯一の緯線である.
GeoPath[locs,pathtype] | タイプ pathtype の経路で指定された位置を繋ぐプリミティブ |
指定された2点間を,3つのタイプのGeoPathで比較する:
ここまで2点間の測地経路の例を見てきた.GeoPath[{p1,p2,…,pn},type]は連続する点 pi 間の,指定されたタイプのセグメントで形成される連続直線を与えるが,完全な直線は一般にそのタイプにはならない.
測地経路には{"Parallel",lat},{"Meridian",lon},および特殊な場合の"Equator","PrimeMeridian","DateLineMeridian"を含む名前付きのタイプがある.
緯線の一部を西から東,あるいは東から西に描画する.Arrowを使って測地経路に鏃を加える:
円と円板
中心が p で半径が r の測地円は p を囲む閉じた線である.その点はすべて p から測地距離 r のところにある.地球の曲率のため,測地円の全長は2π r より小さい.実際,r が大きくなるほど,測地円のサイズは小さくなり p の対蹠地を中心とするようになる.
半球
半球は,平面が地球の中心を通過することで分割されるため,地球の表面の半分を厳密に含む.したがって,半球の境界線は大円である(地球の楕円モデルが使われているため,実際には大楕円である).Wolfram言語は半球に使える測地プリミティブを2タイプ提供している.ひとつは表面上の点 p 周囲の半球GeoHemisphere[p]であり,もうひとつは指定された日付における太陽の位置から決定された,特に重要な半球DayHemisphere[date]とNightHemisphere[date]である.GeoHemisphere[p]の境界線はGeoHemisphereBoundary[p]であり,昼半球と夜半球の境界線はDayNightTerminator[date]である.
GeoHemisphere[loc] | loc を中心とする半球 |
DayHemisphere[date] | 指定された日付における昼半球 |
NightHemisphere[date] | 指定された日付における夜半球 |
GeoHemisphereBoundary[loc] | loc を中心とする半球の境界線 |
DayNightTerminator[date] | date における昼半球と夜半球の境界線 |
昼半球と夜半球は,太陽の位置の投影に対するGeoHemisphereを地球表面,あるいはその反対側の点に応用したものである.曖昧さを避けるために,日付は明示的なTimeZone指定で指定しなければならない.
高いところから見える領域
測地半球は,ある方向の非常に遠いところ(実際には無限距離)から見ることのできる地球の部分と考えることができる. ここで,ビューポイントが楕円体地球の表面上の有限高さである場合の概念の一般化を導入する.得られる領域は常に半球よりも小さい.しかし幾何学的構造は非常に類している.可視領域は正割面によっても決定されるが,それは地球の中心を通過しない.
GeoVisibleRegion[loc] | 高い位置 loc から可視の領域 |
GeoVisibleRegionBoundary[loc] | 高い位置 loc から可視の領域の境界線 |
線,多角形,その他の標準的なグラフィックスプリミティブ
Line,Polygon,Circleのような,測地的グラフィックスではない標準的なプリミティブもGeoGraphicsで使うことはできるが,測地的グラフィックスのプリミティブのように地球表面上ではなく,平坦な地図上のプリミティブとして解釈される.これらはGraphicsにおける場合と同じ標準的な特性を持っている.特に,2つの連続する点の間のLineおよびPolygonのセグメントは直線である.
一方,測地線の点は一意に定義されているが,Lineの点はそうではない.投影法によっては,黒い線がブラジルを通過する場合もある:
すべての場合において,一つの測地線の一部がモザンビークとマダガスカルの間を通過するが,対応するLineの部分が通過するアフリカの国々は,,投影法により異なる:
測地プリミティブではない標準のプリミティブで,直接投影された座標を使うことも可能であるが,どの投影法が使われているかを考慮しなければならない.これは,地球の表面に存在する要素に直接関連するものではなく,グラフィカルな要素を地図に加える場合に便利である.実際,地球の表面のどの点にも対応しない座標を使うことすらできる.この場合,より多くのプリミティブが追加されたときにGeoGraphicsが別の投影法を選ばないように,使った投影法を入力に明示的に加えておくことをお勧めする.
異なる投影法を使うと,GeoGraphicsで指定された位置が自動的に変更されるが,投影された座標で指定された位置は変更されない:
PlotRangeとGeoRangeは完全に独立したオプションである.通常GeoRangeが指定され,GeoGraphicsで適切なPlotRangeが選ばれるが,両方を指定することもできる.GridLinesとGeoGridLinesも独立している:
高度なトピック:GeoGraphicsの結果の構造
GeoGraphics入力式の結果は頭部GeoGraphicsを持つが,その第1引数は,地図として表示される実際のグラフィックスオブジェクトのGraphicsオブジェクトである.この出力GeoGraphicsは絶対値を持つ一連のオプションも含む.入力で与えられたオプションとGeoGraphicsにより決定されたオプションの両方である.
出力におけるGeoGraphicsの構造を分析する:
出力には頭部GeoGraphicsがある:
第1引数はGraphicsオブジェクトであり,その後に一連のオプションが続く:
高度なトピック:測地プリミティブの測地的評価
GeoGraphics`GeoEvaluateの第2引数は,使用されている回転楕円体のモデルを指定する.数値(単位はメートル),その半径の球を表すQuantity距離,あるいは回転楕円体の半軸のペア{a,b}で指定する.結果は異なる.
GeoGraphics`GeoEvaluateの第3引数は必要とされる分解能距離をメートル単位で指定する.この数が小さいほど測地プリミティブが分解される点が多くなり,その距離よりも近傍の方が近くなるよう保障される.
地図のスタイル付け
GeoGraphicsは,色,不透明度,テクスチャ等をはじめとした,地図にスタイルを付けるために使うことのできる多様な指示子をGraphicsから継承している.その上,使用されている投影法に自動的に対応する,地図の特性となる新しい要素を加える.最も重要な新要素はGeoStyling[mapstyle,directive]である.これは地図の任意の部分,特に測地背景にどのようなスタイルを付けるかを指定するものである.
GeoStyling[mapstyle] | mapstyle を使って,2Dの測地プリミティブの内部にスタイルを付ける |
GeoBackground | 背景の地図スタイルを指定するGeoGraphicsのオプション |
GeoStylingは,測地円板や多角形のような2Dのプリミティブ内部に何を置くかを指定し,実質的にTextureのように動作する.その意味では,GeoBackgroundオプションは,地図全体に何を置くかを指定する特殊な場合であると考えることができる.
指定された領域の境界線に囲まれた地図を表示するために,GeoStylingを使うことができる:
地図上に任意の画像やグラフィックスを置くことのできる地図スタイルには,{"Image",image}と{"GeoImage",image}の2つがある.前者では,画像は変換なし(縦横比の変更だけはあり得る)で指定領域に置かれるが,後者では画像は地図領域に沿って投影される.したがって,"GeoImage"は他の地図上に地図の部分を置くように構成される.
"Image"地図スタイルを使うと,画像はどの投影法の中でもその向きを維持する:
不透明度と色
背景は通常空で,何かで覆われなければならないので,Graphics 2Dプリミティブはデフォルトでは不透明である.しかしGeoGraphicsは通常測地背景として地図の画像を含んでいる.これはその上のプリミティブによって完全に覆われてはならない.そのため,2Dプリミティブのデフォルトの不透明度は小さく,0.2である.これはGeoGraphicsでどのように不透明度が扱われるかに少し捻りを加えている.2Dプリミティブの不透明度は,デフォルトでは不透明の他のプリミティブ(点や線)の不透明度とは区別されなければならないからである.これにはGeoStylingを使う.
円板の不透明度を変更するためにはGeoStyling[opacity]を使うが,濃い測地円には影響しない:
GeoStylingの内部に置かれた色は,2Dプリミティブに優先し,後で与えられる色にも優先する:
測地線格子とスケールバー
緯線や経線を描画することは地図上の要素の向きを理解するのに便利であるが,非円筒図法を使っているときはなおさらである.オプションGeoGridLinesとそのスタイル付けのGeoGridLinesStyleは,いわゆる経緯線網を描画するための柔軟なインターフェースを提供する.
GeoScaleBar | スケールバーの使用をオンにするGeoGraphicsのオプション |
GeoGridLines | 経緯線網の使用をオンにするGeoGraphicsのオプション |
GeoGridLinesStyle | 測地線格子のスタイルを指定するGeoGraphicsのオプション |
経緯度線網の下位区分をQuantity角として指定する:
地図でスケールを読むためには,GeoScaleBarオプションを使うことができる.大きいスケールの地図では, 距離のスケール係数が点により異なる場合があるため,スケールバーは平均のみを表す.
上はすべて地球についてのものであったが,火星,冥王星,月等,衛星画像が利用できる天体には同様に適用することができる.GeoGraphicsはオプションGeoModelの値によって決定される,適切な背景タイルを使う.
GeoModel | 測地系あるいは天球儀を指定するGeoGraphicsのオプション |