> [Wiki](Home) ? [[API--中文手冊]] ? [[地理]] ? **地理投影**
* 如發現翻譯不當或有其他問題可以通過以下方式聯系譯者:
* 郵箱:zhang_tianxu@sina.com
* QQ群:[D3數據可視化](http://jq.qq.com/?_wv=1027&k=ZGcqYF)205076374,[大數據可視化](http://jq.qq.com/?_wv=1027&k=S8wGMe)436442115
D3默認包括了一些常見投影,如下所示。眾多的(不太常用的)投影在擴展地理投影插件和多面體投影插件中是可用的。
由D3提供的大多數投影都是通過d3.geo.projection來創建并配置的,你可以旋轉這個地球,縮放或轉換畫布等。除非你正在執行一個新的原始投影,否則你可能不會用D3.geo.projection來構造,但是你有可能使用這個配置方法。
# d3.geo.projection(raw)
從指定的原始raw 點投影的函數,構造一個新的投影。例如,一個Mercator投影可實現為:
varmercator=d3.geo.projection(function(λ,φ){
return[
λ,
Math.log(Math.tan(π/4+φ/2))
];
});
(可以參考src/geo/mercator.js全面的實現。)如果原始函數支持反轉方法,則返回的投影將會顯示一個對應的反轉方法。
src/geo/mercator.js:ttps://github.com/mbostock/d3/blob/master/src/geo/mercator.js
# projection(location)
投影從球面坐標(單位:度)轉到笛卡爾坐標(單位:像素),返回數組[x, y],給出輸入數組[longitude, latitude]。如果指定的位置沒有定義投影的位置,那么返回可能為null。例如,當位置在投影的裁剪邊界之外的時候。
# projection.invert(point)
投影反向是從直角坐標(像素),到球面坐標(度),返回一個數組[longitude, latitude],給定輸入數組[x, y]。但并非所有的投影都會實現反轉,對于可逆投影,這種方法是undefined。
# projection.rotate([rotation])
如果rotation 旋轉指定了,設置投影的三軸旋轉為指定的角度λ,φ和γ(偏航角,傾斜角和滾動角,或等效地經度,緯度和滾動),以度并返回投影。如果rotation 未指定,返回當前缺省的轉動值[0, 0, 0]。如果rotation 指定且只有兩個值,而不是3個值,那么滾動的角度被假設為0°。
# projection.center([location])
如果center 重心指定了,則設置投影中心為指定的位置,經度和緯度度數的兩元數組,并返回投影。如果沒有指定中心,則返回當前的中心,默認為?0°,0°?。
# projection.translate([point])
如果point 點指定了,則設置投影轉變的位移為指定的二元數組[x, y]并返回的投影。如果未指定點,則返回當前變換的位移,默認為[480, 250]。變換的位移確定投影的中心像素坐標。默認轉換位移的位置是?0°,0°?,在一個960×500區域的中心。
# projection.scale([scale])
如果scale 比例尺指定了,則設置投影的比例尺為特定的值,并返回投影。如果未指定比例尺,返回默認的值150。比例尺因子線性地對應于投影點之間的距離。然而,比例尺因子不能一直越過投影。
# projection.clipAngle(angle)
如果angle 角度指定了,則設置投影的裁剪圓半徑,指定角度并返回投影。如果角度為null,切換到子午線切割,而不是小圈的裁剪。如果沒有指定角度,返回當前裁剪的角度,默認為空。小圈裁剪是獨立于通過clipExtent的視窗裁剪。
antimeridian cutting:http://bl.ocks.org/mbostock/3788999
?
# projection.clipExtent(extent)
如果extent 范圍指定了,則設置投影的剪輯視窗范圍為指定的邊界,以像素為單位并返回投影。extent 范圍邊界被指定為一個數組[[x0, y0], [x1,y1]],其中x0 是視窗的左側,y0 是頂部,x1 為右側和y1 是底部。如果范圍為null,則視窗裁剪不執行。如果extent 范圍沒有指定,則返回當前視窗裁剪的范圍,默認為null。視窗裁剪是獨立于通過clipAngle的小圈剪裁。
# projection.precision(precision)
如果precision 精度指定了,則設置投影自適應重采樣的臨界值為指定的值,以像素為單位,并返回投影。此值對應于Douglas–Peucker 距離。如果precision 精度沒有指定,則返回投影當前重采樣的精度,其精度默認為Math.SQRT(1/2)。
0的精密度禁止自適應重采樣。
# projection.stream(listener)
返回一個投影流,包裝了特定的監聽器。任何幾何形狀的流對封裝器,都是在被傳輸到包監聽之前投影的。一個典型的投影包含多個流的變換:輸入的幾何形首先被轉換為弧度,在三軸上旋轉,在小圓圈或沿著子午線切割,最后投射到具有自適應重采樣,縮放和平移的笛卡爾平面上。
# d3.geo.projectionMutator(rawFactory)
構造一個新的投影,是從指定的原始點投影函數factory開始。此函數不直接返回投影,而是返回一個變換的方法,且你可以隨時調用原始投影函數發生變換的方法。例如,假設你正在實施Albers equal-area conic投影,它需要配置投影的兩大相似之處。使用閉包,可以實現原始投影,如下所示:
// φ0 and φ1 are the two parallels
functionalbersRaw(φ0,φ1){
returnfunction(λ,φ){
return[
/* compute x here */,
/* compute y here */
];
};
}
使用d3.geo.projectionMutator,可以實現一個標準的投影,使相似之處有所改變,重新分配由d3.geo.projection內部使用的原始投影:
functionalbers(){
varφ0=29.5,
φ1=45.5,
mutate=d3.geo.projectionMutator(albersRaw),
projection=mutate(φ0,φ1);
projection.parallels=function(_){
if(!arguments.length)return[φ0,φ1];
returnmutate(φ0=+_[0],φ1=+_[1]);
};
returnprojection;
}
因此,在創建一個可變的投影時,變化的函數永遠不會暴露出來,但可以很容易地重新創建底層的原始投影。對于完全實現,可以參考src/geo/albers.js。
Standard Projections
# d3.geo.albers()
d3.geo.albers是d3.geo.conicEqualArea的一個別名,默認為美國中心:scale 1000,translate [480, 250],rotation [96°, 0°],center ?-0.6°, 38.7°? 和parallels [29.5°, 45.5°],使其能夠適合的顯示美國,中心圍繞著Hutchinson,Kansas在一個960×500的區域。中央經線和緯線是由美國地質調查局在1970年國家地圖集規定的。
# d3.geo.albersUsa()
埃爾伯USA投影是一個復合投影,這復合的四個埃爾伯投影的設計是用來顯示美國下部48,在阿拉斯加和夏威夷旁邊。雖然用于等值線圖,它擴展阿拉斯加0.35x倍的區域(估計是3倍),夏威夷作為下部48顯示在相同比例尺的。
埃爾伯USA投影不支持旋轉或者居中。
# d3.geo.azimuthalEqualArea()
方位角等面積投影也適用于等值線圖。這個投影的極性方面用于聯合國標志。
polar aspect:ttp://bl.ocks.org/mbostock/4364903
# d3.geo.azimuthalEquidistant()
方位角的等距投影保留了從投影中心的距離,從任何投影點到投影中心的距離到大弧距離是成比例的。因此,圍繞投影中心的圓圈是投影在笛卡爾平面的圓圈。這可以用于相對一個參考點的可視化距離,如可交換距離。
# d3.geo.conicConformal()
蘭伯特的等角的二次曲線投影投影地球形狀成為一個錐形。
# conicConformal.parallels([parallels])
如果parallels 指定了,則設定投影的標準平行線為特定的二元緯度數組,并返回這個投影。如果parallels 沒有指定,返回當前的parallels 。
# d3.geo.conicEqualArea()
埃爾伯投影,作為一個區域相等的投影,被推薦用于等值線圖,因為它保留了地理特征的相對區域。
# conicEqualArea.parallels([parallels])
如果parallels 指定了,設置埃爾伯投影的標準平行線為指定的二元緯度數組(以度為單位),并返回投影。如果parallels 沒有指定,返回當前parallels 。為了最大限度地減少失真,平行線應選擇為圍繞投影的中心。
# d3.geo.conicEquidistant()
# conicEquidistant.parallels([parallels])
如果parallels 指定了,設定投影的標準parallels 到指定的二元緯度數組(度),并返回投影。如果parallels 沒有指定,返回當前的parallels 。
# d3.geo.equirectangular()
這個正方形投影,或plate carrée投影,是最簡單可行的地理投影:標識函數。它既不等面積也不等角,但有時用于光柵數據。見光柵重投影的一個例子,源圖像使用正方形投影。
raster reprojection:ttp://bl.ocks.org/mbostock/4329423
# d3.geo.gnomonic()
球心投影是一個方位角投影,它投射大圓為直線。參考interactive gnomonic 的例子。
interactive gnomonic:ttp://bl.ocks.org/mbostock/3795048
# d3.geo.mercator()
這個球面的Mercator投影是常用的分片式映射庫(例如OpenLayers 和Leaflet)。例如顯示柵格分片與Mercator投影,可以參見d3.geo.tile插件,它是正形投影的,然而,它的推行造成了世界范圍地區嚴重失真,因此不建議使用choropleths。
# d3.geo.orthographic()
正投影是適合于顯示單個半球的方位投影,透視的點在無窮遠處。可以看世界觀光的動畫和互動正投影的例子。對于一般的透視投影,可以參考衛星投影。
# d3.geo.stereographic()
立體投影是另一個角度(方位)投影。在表面上看,透視的點是球體。因此,這是常用的天體圖。參考交互式立體為例。
?
# d3.geo.transverseMercator()
橫向的墨卡托投影。
Raw Projections
D3提供了幾個原始的投影,當一個復合投影實現時,設計重用(如Sinu–Mollweide,它結合了原始的正弦曲線和摩爾維特投影)。原始投影在使用之前,通常是用d3.geo.projection封裝著。這些點函數都是采用球面坐標λ和φ(弧度)作為輸入,并返回一個二元數組(也是用弧度)作為輸出。許多原始投影從平面坐標映射到球面坐標,實現了一個反轉的投影。
# d3.geo.albers.raw(φ0, φ1)
是d3.geo.conicEqualArea.raw的一個別名。
# d3.geo.azimuthalEqualArea.raw
原始方位角的等面積投影。
# d3.geo.azimuthalEquidistant.raw
原始的等距方位投影。
# d3.geo.conicConformal.raw(φ0, φ1)
返回一個原始的等角的二次曲線投影,并用弧度指定parallels。
# d3.geo.conicEqualArea.raw(φ0, φ1)
返回一個原始的埃爾伯投影,并用弧度指定parallels。
# d3.geo.conicEquidistant.raw(φ0, φ1)
返回一個原始等距圓錐投影,并用弧度指定parallels。
# d3.geo.equirectangular.raw
原始的正方形投影。
# d3.geo.gnomonic.raw
原始的球心投影。
# d3.geo.mercator.raw
原始的墨卡托投影。
# d3.geo.orthographic.raw
原始的正投影。
# d3.geo.stereographic.raw
原始的立體投影。
* 何凱琳譯20141129
* gulu校對2014-12-7 23:27:06