> [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支持少數的組件顯示和操作地理數據。這些組件使用GeoJSON格式——在JavaScript中標準的地理特征表示方法。(可以參見TopoJSON格式,它是GeoJSON的擴展格式,表示的更加緊密。)。要把圖形文件轉換為GeoJSON,使用ogr2ogr的GDAL包的一部分。
這有一些你可能感興趣的其他工具:
TopoJSON –簡化圖形文件,拓撲結構和GeoJSON壓縮。
Shapely –操作平面幾何圖形對象。
ColorBrewer –地圖顏色的比例尺。
PostGIS –一個地理空間數據庫。
顯示地理數據最主要的機制就是用到d3.geo.path。這個類是類似于d3.svg.line和其他SVG形狀生成程序:給定一個幾何形狀或功能的對象,它生成適合于SVG路徑元素的“d”屬性的路徑數據串。該d3.geo.path類可以直接渲染到畫布上,在動畫投影時可以提供更好的性能。
# d3.geo.path()
創建一個新的地理路徑生成器,使用默認設置:albersUsa投影和4.5個像素點的半徑。
# path(feature[, index])
為給定的功能feature返回路徑數據串,它可以是任何GeoJSON的特征或幾何對象:
Point –單個位置。
MultiPoint –一組位置。
LineString –一組位置形成一條連續的線。
MultiLineString - 位置數組的數組,形成多條線。
Polygon –位置數組的數組,形成一個多邊形(可能是由小洞組成的)。
MultiPolygon –位置的多維數組,形成了多個多邊形。
GeometryCollection –幾何對象的數組。
Feature - 包含了幾何對象其中的一個特征。
FeatureCollection –特征對象的數組。
“Sphere”類型也支持,對于繪制地球的輪廓是非常有用的。sphere球體沒有坐標。一個可選的index 索引可以被指定,傳遞給pointRadius存取器,Index在路徑生成器被selection.attr調用的時候自動地傳遞。
重要的是:一多邊形內部是所有的點,這些點是以順時針方向圍繞著多邊形。如果你的GeoJSON輸入有錯誤順序的多邊形,那么你必須扭轉它們,通過ST_ForceRHR,你也可以將你的GeoJSON轉換為TopoJSON,這樣的話,它就能自動生成。
顯示多個功能,你可以將它們放置在一個單一的特征集和單一路徑元素上:
svg.append("path")
.datum({type:"FeatureCollection",features:features})
.attr("d",d3.geo.path());
另外,您也可以創建多個不同的路徑元素:
svg.selectAll("path")
.data(features)
.enter().append("path")
.attr("d",d3.geo.path());
對于集合來說利用不同的路徑元素通常地比單個路徑元素要慢。但是,如果你想與特征分別進行交互的話,不同的路徑元素是最好的(例如,使用CSS:懸停或單擊事件)。
# path.projection([projection])
如果 指定了投影projection,設置為路徑生成器使用的投影為指定的投影函數。如果projection 投影沒有指定,那么返回當前的投影,默認為albersUsa。projection 投影通常是D3一個內置地理投影;然而,任何函數都可以使用。投影函數采用了兩元素的數字數組來代表坐標的位置,[longitude, latitude],并返回類似的表示該投影像素位置[x, y]的兩元素數字數組。例如,一個基本的spherical Mercator投影:
functionmercator(coordinates){
return[
coordinates[0]/360,
(-180/Math.PI*Math.log(Math.tan(Math.PI/4+coordinates[1]*Math.PI/360)))/360
];
}
從內在的說,這個點投影函數是包裹著一個備用的流變換,它可以執行自適應重采樣。然而,備用的流不執行任何裁剪或切割。
為了更好地控制流的變換,projection 投影可以被指定為一個對象來實現流方法(參見實例:http://bl.ocks.org/mbostock/5663666)。該流的方法需要一個輸出流作為輸入,并返回一個投影在輸入的幾何體上的包裝流,換句話說,它實現了projection.stream。
如果投影為null,則路徑使用恒等變換,其中輸入的幾何體不被投影并且不是直接以原始坐標來渲染。這對已經投影的幾何體快速渲染有用,或對正方形投影的快速渲染有用。
# path.context([context])
如果指定了context ,設置渲染上下文并返回生成的路徑。如果context 為空,當在一個給定的功能調用時,路徑生成器將返回一個SVG路徑字符串。如果context 非空,路徑生成器將替換調用函數為指定的上下文來渲染幾何圖形。context 必須實現以下方法:
beginPath()
moveTo(x, y)
lineTo(x, y)
arc(x, y, radius, startAngle, endAngle)
closePath()
可以注意到,這是畫布元素的二維渲染上下文的子集,這樣畫布context 可以被傳遞到路徑生成器,在這種情況下,幾何形狀將直接渲染到畫布上。如果context 沒有指定,則返回當前渲染的上下文,默認為null。
# path.area(feature)
對指定的功能feature計算投影面積(使用方形像素)。Point,MultiPoint,LineString和LineString特征有為零的區域。對多邊形Polygon和多邊形集合MultiPolygon的特征,該方法首先計算外部環形的面積,再減去內部有任何孔的區域。這種方法通過投影流觀察進行任何的剪裁和重新采樣。
# path.centroid(feature)
對指定的功能feature計算投影重心(以像素為單位),這是非常方便的。比如說,標記州或國家的邊界,或顯示符號映射。非連續統計圖,示例了圍繞其質心的每個狀態。這種方法觀察通過投影流運行的任何剪裁和重新采樣。
非連續統計圖:ttp://mbostock.github.com/d3/ex/cartogram.html
# path.bounds(feature)
對特定的功能計算投影的邊框(像素),這是非常方便的。比如說,放大到一個特定的形態。這種方法觀察通過投影流運行的任何剪裁和重新采樣。
# path.pointRadius([radius])
如果指定半徑,那么設置的半徑為特定的數,用來顯示點Point和多點MultiPoint的功能。如果未指定半徑,則返回當前的半徑。而半徑通常指定為一個數字常數,它也可以被指定為對每個特征進行計算的函數,傳遞來自路徑函數的feature 和index 參數。例如,如果你的GeoJSON數據有額外的屬性,你就可以訪問內置的半徑函數中的屬性來改變點的大小;或者,你可以用d3.svg.symbol 和一個投影來更好地控制顯示。
Shape Generators
注:在D3中生成一個巨大的弧線,只需要簡單地把一個LineString類型的幾何對象傳遞給d3.geo.path。D3的投影采用great-arc插值器生成中間點(使用了自適應重采樣)。因此沒有必要使用形狀生成器來創造大的弧線。
# d3.geo.graticule
構造一個特征生成器用來創建地理刻度。
# graticule()
返回一個MultiLineString幾何對象表示這個刻度的所有經線和緯線。
# graticule.lines()
返回LineString幾何對象,用于這個刻度的每一個經線和緯線。
# graticule.outline()
返回一個多邊形Polygon幾何對象,代表了這個地理坐標的輪廓,IE瀏覽器沿著它的經線和緯線界定其范圍。
# graticule.extent(extent)
如果extent 指定了,設置此刻度的主要和次要范圍。如果沒有指定范圍,返回當前次要的范圍,默認為??-180°, -80° - ε?, ?180°, 80° + ε??。
# graticule.majorExtent(extent)
如果extent 指定了,設置此刻度的主要范圍。如果未指定范圍,返回當前主要的范圍,默認為??-180°, -90° + ε?, ?180°, 90° - ε??。
# graticule.minorExtent(extent)
如果extent 指定了,設置此刻度的較小范圍。如果沒有指定范圍,返回當前較小的范圍,默認為??-180°, -80° - ε?, ?180°, 80° + ε??。
# graticule.step(step)
如果step 指定了,設置這個刻度的主要和次要的步長。如果沒有指定step ,則返回當前次要的step ,默認為?10°, 10°?。
# graticule.majorStep(step)
如果step 指定了,設置這個刻度的主要step。如果沒有指定step,返回當前的主要step,它默認為?90°, 360°?。
# graticule.minorStep(step)
如果step 指定了,設置這個刻度次要的step 。如果沒有指定step ,返回當前的次要step ,默認為?10°, 10°?。
# graticule.precision(precision)
如果指定了precision ,設置這個刻度的精度,以度為單位。如果沒有指定精度,則返回當前精度,默認值為2.5°。
# d3.geo.circle
為在一個給定的地理位置創建帶有給定半徑(以度為單位)的圓中心構建一個特征生成器。
# circle(arguments…)
返回一個接近圓形的GeoJSON多邊形。原點訪問器指定如何為給定的參數確定原點,默認的訪問使用的是常量?0°,0°?。
# circle.origin([origin])
如果指定了origin ,設置圓的原點。一個兩元坐標數組應該被指定,或訪問函數。如果origin 沒有指定,則返回當前的原點,默認值為?0°,0°?。
# circle.angle([angle])
如果指定了angle ,用度數來設置圓的角半徑。如果angle 沒有指定,則返回當前的半徑,默認為90°。
# circle.precision([precision])
如果precision 指定,以度為單位設置圓形片段的精度的插值器。當一個特征被圓形裁剪時,這些內插節段就被插入了。如果沒有指定precisionis,則返回當前精度,默認值為6°。
Spherical Math
# d3.geo.area(feature)
返回指定功能的球形區域(以球面度為單位)。可以參考path.area,其在Cartesian plane平面上計算投影區域。
# d3.geo.centroid(feature)
返回指定功能的球形重心。可參考path.centroid,其在Cartesian plane平面上計算投影重心。
# d3.geo.bounds(feature)
返回指定功能的球形邊框。邊界框是由一個二維數組來表示:[[left, bottom], [right, top]],其中left 是最小經度,bottom 是最小緯度,right 是最大經度和top 是最大緯度。可參考path.bounds,其在Cartesian plane平面上計算投影的邊界框。
# d3.geo.distance(a, b)
返回在兩個點a和b之間弧度的最大距離,每個點都被指定為一個數組[longitude, latitude],和表示十進制度的坐標。
# d3.geo.length(feature)
返回弧度指定功能的大弧great-arc的長度。對于多邊形,返回外環周長加上任何內置的環。
# d3.geo.interpolate(a, b)
返回給定的兩個位置a和b的插值器。每個位置必須被表示為一個[longitude, latitude]的二元數組。返回的插值器是一個函數,它可以接受單個參數t作為輸入,其中t的范圍是0?10,0返回a位置的,而1返回b的位置。中間值的插入是從a到b的大弧形。
# d3.geo.rotation(rotate)
設置一個旋轉為 [λ, φ, γ]形式的數組。數組的元素是以度為單位的角度,并指定按照下面的順序來旋轉:縱向,橫向和原點。如果數組的最后一個元素,γ,省略了,那么這個默認值就為0。返回一個函數,該函數就如所述的那樣轉動到一個指定的位置。
# rotation(location)
在上述描繪的順序下,這個旋轉是在一個指定的位置,根據特定的角度來旋轉的。位置被指定為一個數組[longitude, latitude],用度數表示的坐標。返回一個新的數組來表示旋轉的位置。
# rotation.invert(location)
該旋轉是根據指定的角度和位置來旋轉的,但與上述描述的相反順序來旋轉。一個位置指定為一個數組[longitude, latitude],用度數來表示坐標。返回一個新的數組來表示旋轉的位置。
* 翟琰琦譯 20141124
* 何凱琳 譯2014年11月27日 20:45:29
* Gulu 校對 2014-12-7 21:45:37