YouTube | Facebook | Twitter  Feed

メルカトル図法の 1km は実際どれくらいの距離なのか

2018/10/21 (日)

今回はメルカトル図法の距離に関するお話です。前回は緯度・経度の 1度が場所によってどれくらいの距離なのかを測りましたが、今回はメルカトル図法で示される距離の実際を検証します。

はじめに

メルカトル図法は正角図法で形は正確だが距離や面積は正確ではない

メルカトル図法は上記の特性があります。前回の記事でも触れましたが、Google Maps は 2018年8月からメルカトル図法以外に外射図法でも表示できるようになりました。これで地図の見た目は宇宙からの見た目と同じになった訳ですが、ArcGIS Online地理院地図など他の Web マップ サービスは依然としてメルカトル図法(Webメルカトル)が多く使用されています。

メルカトル図法を使用して、例えばこのような主題図を作成したとします。この地図には大きな問題があるのですがお分かりでしょうか。

メルカトル図法にスケールバーを配置した例

メルカトル図法では(赤道上を除いて)距離は正しくないので、スケールバーを配置するのは不適切です。スケールバーが配置されると一般的に地図の読み手は図上どこでもスケールバーと同じ距離になると理解します。上記の地図で示されるスケールバーが正確なのは赤道上のみです。ArcGIS Online のマップ ビューアーや Google Maps でもスケールバーがありますが、これは現在表示されている地図のある場所(おそらく中心)における縮尺に基づいて動的に変化します。大縮尺で表示すれば誤差の範囲内ですが、小縮尺で表示すると正確な表示にはなりません。

メルカトル図法で示すスケールバーは正確でないと説明しましたが、どれくらい正確でないのか気になります。ということで、メルカトル図法によって示された 2点間の距離と測地線距離がどれくらい異なるのか計測してみます。

前提条件

地球の大きさには様々な定義がありますが、今回も赤道半径と極半径が異なる WGS84 楕円体を使用します。

WGS84楕円体
赤道半径:6,378,137m、扁平率の逆数:298.257223563
GCS_WGS_1984 (4326)

回転楕円体における計算式で長さを求めることもできますが、難しい計算は ArcGIS にやらせようということで今回も arcpy という API を使用して計算しました。

経度0度上で北緯0度~ 90度まで1度ずつの間隔で点を置き、その緯度経度の座標をメルカトル図法の座標に換算します。換算後の座標から東西南北に 500m 延伸させ、「東西・南北で 1km の線分」を作成します。作成した線分の測地線距離を測定します。

メルカトル図法上 1000m の測地線距離と拡大率

図法上 1000m の測地線距離を求めた結果です。メルカトル図法は緯度によって実際の距離が異なり、高緯度になると顕著に拡大率が大きくなります。89度以上は計算できないので除外しました。

Spatial Reference: World_Mercator (54004)
GCS: GCS_WGS_1984 (4326)

緯度東西距離 (m)南北距離 (m)東西拡大率 (%)南北拡大率 (%)
8835.016758035.01675812855.77551272855.7755069
8752.511534452.51153451904.34351611904.3435122
8669.989993169.98999321428.77568031428.7756775
8587.446704187.44670421143.55367741143.5536751
84104.8762450104.8762452953.5047714953.5047695
83122.2732033122.2732036817.8406820817.8406804
82139.6321783139.6321785716.1672993716.1672979
81156.9477825156.9477828637.1545898637.1545886
80174.2146444174.2146448574.0045581574.0045570
79191.4274098191.4274101522.3912298522.3912288
78208.5807435208.5807439479.4306431479.4306422
77225.6693320225.6693324443.1262286443.1262278
76242.6878845242.6878850412.0518839412.0518831
75259.6311354259.6311358385.1618176385.1618169
74276.4938455276.4938460361.6717031361.6717024
73293.2708046293.2708051340.9817767340.9817761
72309.9568324309.9568330322.6255709322.6255703
71326.5467811326.5467816306.2348362306.2348356
70343.0355364343.0355370291.5149872291.5149867
69359.4180200359.4180206278.2275636278.2275631
68375.6891905375.6891911266.1774747266.1774743
67391.8440456391.8440462255.2035717255.2035713
66407.8776238407.8776244245.1715764245.1715760
65423.7850055423.7850062235.9687075235.9687071
64439.5613152439.5613159227.4995468227.4995465
63455.2017227455.2017233219.6828242219.6828239
62470.7014446470.7014452212.4488912212.4488909
61486.0557461486.0557467205.7377180205.7377177
60501.2599423501.2599429199.4972899199.4972896
59516.3093996516.3094002193.6823155193.6823152
58531.1995372531.1995378188.2531761188.2531759
57545.9258284545.9258290183.1750666183.1750664
56560.4838021560.4838027178.4172881178.4172879
55574.8690440574.8690446173.9526611173.9526609
54589.0771979589.0771985169.7570375169.7570374
53603.1039670603.1039675165.8088911165.8088910
52616.9451149616.9451154162.0889729162.0889727
51630.5964672630.5964677158.5800194158.5800193
50644.0539124644.0539129155.2665050155.2665049
49657.3134030657.3134034152.1344302152.1344301
48670.3709565670.3709569149.1711403149.1711402
47683.2226568683.2226573146.3651695146.3651694
46695.8646550695.8646554143.7061062143.7061061
45708.2931703708.2931707141.1844758141.1844758
44720.5044911720.5044914138.7916401138.7916400
43732.4949758732.4949761136.5197077136.5197077
42744.2610540744.2610543134.3614575134.3614575
41755.7992269755.7992271132.3102703132.3102703
40767.1060684767.1060686130.3600690130.3600690
39778.1782261778.1782263128.5052661128.5052660
38789.0124216789.0124217126.7407170126.7407169
37799.6054515799.6054516125.0616786125.0616786
36809.9541881809.9541882123.4637730123.4637730
35820.0555803820.0555802121.9429541121.9429541
34829.9066535829.9066535120.4954793120.4954793
33839.5045113839.5045112119.1178828119.1178828
32848.8463352848.8463351117.8069526117.8069526
31857.9293856857.9293855116.5597095116.5597096
30866.7510024866.7510021115.3733884115.3733884
29875.3086050875.3086047114.2454209114.2454209
28883.5996935883.5996932113.1734209113.1734209
27891.6218489891.6218485112.1551700112.1551700
26899.3727332899.3727328111.1886055111.1886055
25906.8500902906.8500898110.2718091110.2718091
24914.0517460914.0517455109.4029965109.4029966
23920.9756089920.9756084108.5805086108.5805086
22927.6196704927.6196699107.8028024107.8028024
21933.9820050933.9820044107.0684440107.0684441
20940.0607706940.0607700106.3761016106.3761016
19945.8542091945.8542085105.7245388105.7245388
18951.3606465951.3606458105.1126094105.1126094
17956.5784931956.5784923104.5392518104.5392519
16961.5062437961.5062430104.0034848104.0034849
15966.1424782966.1424774103.5044026103.5044026
14970.4858614970.4858606103.0411714103.0411715
13974.5351433974.5351425102.6130260102.6130261
12978.2891595978.2891586102.2192662102.2192663
11981.7468310981.7468301101.8592542101.8592543
10984.9071648984.9071639101.5324120101.5324121
9987.7692536987.7692527101.2382190101.2382191
8990.3322763990.3322753100.9762101100.9762102
7992.5954977992.5954967100.7459738100.7459739
6994.5582691994.5582681100.5471505100.5471506
5996.2200280996.2200270100.3794314100.3794315
4997.5802983997.5802973100.2425571100.2425572
3998.6386904998.6386894100.1363165100.1363166
2999.3949014999.3949003100.0605465100.0605466
1999.8487145999.8487135100.0151308100.0151309
01000.0000000999.9999990100.0000000100.0000001

メルカトル図法の誤解

メルカトル図法が「球に円筒を巻きつけて球の中心から投影すればメルカトル図法が得られる」のであれば、各緯度における赤道距離との比率は余弦でこのように求められます。

拡大率 200% cos-1(0.5) = 60°
拡大率 400% cos-1(0.25) = 75.52248781407° 75°31′20.96″
拡大率 500% cos-1(0.2) = 78.463040967185° 78°27′46.95″
拡大率 1000% cos-1(0.1) = 84.260829522733° 84°15′38.99″

しかし、ソフトウェアで計測した結果は

60°:199.497%
75°:385.162%
84°:953.505%

となっており、75.5224878140度で 398.743%、78.463040967185度で 498.391%、84.260829522733°で 996.681%なので前述の計算結果と拡大率が異なります。

以下の書籍で解説されています。

地図投影法

地図投影法

政春尋志
4,200円(07/12 08:13時点)
発売日: 2011/09/10
Amazonの情報を掲載しています

P45 column4 地図投影法についてよくある間違い
地図投影法に関して広まっている誤解の筆頭は、メルカトル図法の原理に関するものであろう。球に円筒を巻きつけて球の中心から投影すればメルカトル図法が得られるという解説や図解は、学生用参考書や一般向けの地図に関する書籍によく見られるものであるが、間違いである。こうして得られる投影は心射円筒図法であってメルカトル図法ではない。

私もこの書籍を読んではじめて誤りに気づきました。メルカトル図法の計算式はこちらに記載があります。

まとめ

計測した結果、緯度25度くらいまでは1割程度、36度あたりで2割の拡大率で、60度になるとほぼ2倍となり、高緯度になるほど顕著に拡大率が大きくなりました。そのため、メルカトル図法は距離や面積の測定には不向きだということが分かります。また、同一地点で東西と南北の拡大比率ははほとんど同じです。このことから、メルカトル図法は歪みが少ない(形状は正確)ということが分かります。

2年ほど前「意外と日本って大きい。」というタイトルで The True Size Of... サイトを紹介し、ネットで盛り上がりましたがあのタイトルはナンセンスです。メルカトル図法は北にいくほど拡大されるのだから日本が大きくなるのは当たり前です。比較するなら赤道に移動させ「ロシアって意外と小さい。」というタイトルにするべきでしょう(ロシアは面積世界一なので赤道に移動しても大きいんだけど)。

ソースコード

Python ウィンドウにそのまま貼り付けてご利用ください。ArcMap 10.4、AcGIS Pro 1.3、ArcGIS Pro 2.2 で動作確認しております。arcpy.SpatialReference の引数である EPSG 番号を変更して一般的に使用される球体としての地球で計算することもできます。

#coding:UTF-8

# メルカトル図法の指定距離における測地線距離
# 経度0度、北緯0度~90度を中心に東西・南北の指定距離を
# 測地線距離に換算して比較

# ArcGIS Pro 1.3,ArcGIS Pro 2.2, ArcMap 10.4.1 で動作確認

import arcpy
import copy

# WGS84楕円体
# 赤道半径:6,378,137m、扁平率の逆数:298.257223563
# GCS_WGS_1984 (4326)
gcs = arcpy.SpatialReference(4326)
#gcs = arcpy.SpatialReference(4035)	# 地球半径 Authalic Shpere GCS_Shpere GCS_Sphere (4035)

# メルカトル図法
pcs = arcpy.SpatialReference(54004)

# 測定係数
ratio = 1000 # (m)

print("Spatial Reference: {0} ({1})".format(pcs.PCSName, pcs.PCSCode))
print("              GCS: {0} ({1})\n".format(gcs.GCSName, gcs.GCSCode))
print("メルカトル図法上 {}m の測地線距離\n".format(ratio))
print("{}\t{}\t{}\t{}\t{}".format("緯度", "東西距離 (m)".ljust(10), "南北距離 (m)".ljust(10), "東西誇張率 (%)".ljust(10), "南北誇張率 (%)".ljust(10)))

for lat in range(88, -1, -1):
    # 中心点を投影変換
    point = arcpy.Point(0, lat)
    point_gcs = arcpy.PointGeometry(point, gcs)
    point_pcs = point_gcs.projectAs(pcs)

    # 東西長
    point_width_from = copy.copy(point_pcs.trueCentroid)
    point_width_to = copy.copy(point_pcs.trueCentroid)
    point_width_to.X += 1 * ratio
    polyline_width = arcpy.Polyline(arcpy.Array([point_width_from, point_width_to]), pcs)
    length_width = polyline_width.getLength("GEODESIC")
    
    # 南北長
    point_height_from = copy.copy(point_pcs.trueCentroid)
    point_height_from.Y -= 0.5 * ratio
    point_height_to = copy.copy(point_pcs.trueCentroid)
    point_height_to.Y += 0.5 * ratio
    polyline_height = arcpy.Polyline(arcpy.Array([point_height_from, point_height_to]), pcs)
    length_height = polyline_height.getLength("GEODESIC")  
    
    print("{:0=2}\t{:0=13.7f}\t{:0=13.7f}\t{:0=13.7f}\t{:0=13.7f}".format(lat, length_width, length_height, ratio / length_width * 100, ratio / length_height * 100))

関連記事

  • この記事を書いた人

羽田 康祐

Esri認定インストラクター、GIS上級技術者、測量士補、潜水士。GISy / GISc とその関連分野である地理学・地図学について日々の出来事で学んだ記憶を記録するためにブログを書いています。行動原理は伊達と酔狂。好きな地形は圏谷。好きな地図投影法はパースクインカンシャル図法。呉市生まれ広島市出身。GIS を使った自己紹介はこちら

-基礎知識, ArcGIS
-, , ,

© 2020 WINGFIELD since1981