墨卡託預測

墨卡託投影是地圖中最容易識別的投影之一。像所有地圖投影一樣,它具有失真,對於墨卡託,投影這在極地地區最為明顯。它是一個圓柱形投影,經線垂直執行,緯度水平延伸。

比例取決於你的 svg 的大小,在這個例子中,所有使用的比例都是 960 畫素寬,450 畫素高的 svg。

下面的地圖顯示了天梭的墨卡託投影的 Indicatrix ,每個圓圈實際上都是相同的尺寸,但投影顯然有些比其他更大: StackOverflow 文件

這種失真是因為投影試圖避免地圖的一維拉伸。隨著經線開始在北極和南極合併,它們之間的距離開始接近零,但是投影的表面是矩形的(不是地圖,雖然它也是矩形)並且不允許改變距離在投影中的經絡之間。這將沿著極點附近的 x 軸拉伸特徵,扭曲它們的形狀。為了解決這個問題,墨卡託伸展 y 軸以及接近極點,這使得指標呈圓形。

上面地圖的投影基本上是預設的墨卡託投影向上移動了一點:

var projection = d3.geoMercator()
    .scale(155)
    .center([0,40]) // Pan north 40 degrees
    .translate([width/2,height/2]);

要使投影在具有已知緯度和已知經度的給定點上居中,你可以通過指定中心輕鬆平移到該點:

var projection = d3.geoMercator()
    .center([longitude,latitude])

這將平移到投影表面上的那個特徵(但不是縮放)(看起來像上面的地圖)。

比例需要根據感興趣的區域進行調整,較大的數字等於較大的特徵(較大的放大程度),較小的數字則相反。縮小可以是一個很好的方法,讓你的方向看你的功能相對於你所關注的點 - 如果你找不到它們。

由於墨卡託投影的性質,赤道附近或低緯度地區的這種投影效果最好,而極地區域可能會高度扭曲。失真甚至沿著任何水平線,因此寬但不高的區域也可能是好的,而在其北極和南極之間具有大的差異的區域具有更多的視覺失真。

例如,對於印度,我們可以使用:

var projection = d3.geoMercator()
    .scale(800)
    .center([77,21])
    .translate([width/2,height/2]);

這給了我們(再次使用天梭的指示器顯示失真): StackOverflow 文件

這具有低水平的失真,但是圓圈的大小基本相同(你可以看到頂部兩行之間的重疊比底部兩行更大,因此可以看到失真)。總的來說,地圖顯示了印度熟悉的形狀。

區域內的變形不是線性的,它極向誇大了兩極,因此加拿大北極和南極的距離相當遠,並且位置相當接近極點意味著扭曲可能是站不住腳的:

var projection = d3.geoMercator()
    .scale(225)
    .center([-95,69.75])
    .translate([width/2,height/2]);

StackOverflow 文件

這一預測使得格陵蘭島看起來像加拿大一樣大,而實際上加拿大的面積幾乎是格陵蘭島的五倍。這只是因為格陵蘭島比加拿大的大部分地區更北(對不起安大略省,我似乎已經切斷了你的一些南極)。

由於 y 軸在墨卡託的極點附近相當大,因此該投影使用了加拿大地理中心以北的一個點。如果處理高緯度區域,你可能需要定製中心點以考慮此拉伸。

如果你需要極地區域的墨卡託投影,有一種方法可以最大限度地減少失真並仍然使用墨卡託投影。你可以通過旋轉地球來實現此目的。如果你在預設墨卡託上旋轉 x 軸,你會看到它向左或向右平移(你只需在你投射到的圓柱體中旋轉地球儀),如果你改變了預設墨卡託的 y 軸,你可以將地球轉向側面或任何其他角度。這是一個旋轉 -90 度的墨卡託:

var projection = d3.geoMercator()
.scale(155)
.rotate([0,-90]);
.translate([width/2,height/2]);

StackOverflow 文件

指標點與上面的第一張地圖位於相同的位置。當達到地圖的頂部或底部時,失真仍會增加。如果地球圍繞[0,0]的北極和[180,0]處的南極旋轉,這就是預設墨卡托地圖的顯示方式,旋轉已將我們投射的圓柱體轉向 90 度相對於兩極。注意兩極不再具有難以保持的變形,這提供了另一種方法來投射極點附近的區域而不會有太多的區域變形。

再次以加拿大為例,我們可以將地圖旋轉到中心座標,這樣可以最大限度地減少區域內的失真。為此,我們可以再次旋轉到中心點,但這需要一個額外的步驟。通過居中我們平移到一個特徵,通過旋轉,我們將地球移動到我們之下,所以我們需要我們的居中座標的負數:

var projection = d3.geoMercator()
    .scale(500)
    .rotate([96,-64.15])
    .translate([width/2,height/2]);    

StackOverflow 文件

請注意,天梭的指示器現在在區域中顯示出低失真。比例因子也比以前大得多,因為加拿大現在位於投影的原點,並且沿著地圖中間的特徵小於頂部或底部(參見上面的第一個指標)。我們不需要居中,因為這個投影的中心點或原點位於 [-96,64.15],居中會讓我們離開這一點。