【 D3.js 高級系列 — 8.0 】 標線

有時候,需要在地圖上繪製連線,表示“從某處到某處”的意思,這種時候在地圖上繪製的連線,稱爲“標線”。

801


1. 標線是什麼

標線,是指地圖上需要兩個座標以上才能表示的元素。例如,北京和上海之間連線。用於繪製標線的圖形元素有兩種:線段元素<line>和路徑元素<path>。如果是在平面地圖上,且不要求兩點之間有曲線,<line>已足夠;如果是在球面地圖上,或對於平面地圖上的曲線,則需使用<path>。標線有時帶有箭頭,表示方向。


2. 如何添加帶箭頭的標線

如果需要表示標線的方向,則可以在末端加箭頭。【進階 - 第 4.0 章】,提到了給SVG定義標記,從而爲<line>或<path>添加箭頭的方法。箭頭的標記如下:

<defs>
<marker id="arrow" 
	markerUnits="strokeWidth" 
	markerWidth="12" 
	markerHeight="12" 
	viewBox="0 0 12 12" 
	refX="6" 
	refY="6" 
	orient="auto">
<path d="M2,2 L10,6 L2,10 L6,6 L2,2" 
style="fill: #000000;" />
</marker>
</defs>


標記是定義在<defs>中的。其中,<marker>是標記的主體,<marker>中的<path>是標記的圖形,此處是箭頭的路徑,也可用其他圖形,如圓形、矩形等。參照此結構,使用d3的代碼添加一個箭頭標記的代碼如下。

var defs = svg.append("defs");
 
var arrowMarker = defs.append("marker")
					.attr("id","arrow")
					.attr("markerUnits","strokeWidth")
					.attr("markerWidth","12")
                  .attr("markerHeight","12")
                  .attr("viewBox","0 0 12 12") 
                  .attr("refX","6")
                  .attr("refY","6")
                  .attr("orient","auto");
 
var arrow_path = "M2,2 L10,6 L2,10 L6,6 L2,2";
						
arrowMarker.append("path")
	.attr("d",arrow_path)
	.attr("fill","#000");

對於需要添加箭頭的線段,設定其marker-end屬性爲url(#arrow)即可添加箭頭,arrow是箭頭標記的id號。


3. 平面地圖上的標線

下面在平面的中國地圖上添加一個帶箭頭的標線,表示“從桂林到北京”的路徑。對於平面地圖上兩點之間連線,用<line>元素即可。

根據兩座城市的經緯度分別計算其像素座標,並添加一個<line>,設置屬性marker-end的值爲url(#arrow)。

var peking = projection([116.3, 39.9]);
var guilin = projection([110.3, 25.3]);

svg.append("line")
.attr("class","route")
.attr("x1",guilin[0])
.attr("y1",guilin[1])
.attr("x2",peking[0])
.attr("y2",peking[1])
.attr("marker-end","url(#arrow)");


如此一來,標線的末尾會帶一個箭頭,結果如下圖所示。

802

4. 爲標線的起點添加一個圓

上面的箭頭是添加到線段終點的。此外,可定義一個新的標記,添加到線段的起點。例如,起點顯示一個圓。

定義一個新的標記,代碼如下。

var startMarker = defs.append("marker")
						.attr("id","startPoint")
						.attr("markerUnits","strokeWidth")
					    .attr("markerWidth","12")
                      .attr("markerHeight","12")
                      .attr("viewBox","0 0 12 12") 
                      .attr("refX","6")
                      .attr("refY","6")
                      .attr("orient","auto");
						
startMarker.append("circle")
			.attr("cx",6)
			.attr("cy",6)
			.attr("r",2)
			.attr("fill","#000");


此標記的id號是startPoint,用其爲線段的marker-start賦值即可。將添加線段元素的代碼修改爲:

svg.append("line")
	.attr("class","route")
	.attr("x1",guilin[0])
	.attr("y1",guilin[1])
	.attr("x2",peking[0])
	.attr("y2",peking[1])
	.attr("marker-end","url(#arrow)")		//終點處添加箭頭
	.attr("marker-start","url(#startPoint)");	//起點處添加圓


結果如下圖所示,標線的起點處有一個圓,終點處有一個箭頭。

803


5. 結果

結果如本文開頭的圖片所示。

完整代碼請單擊以下鏈接,再右鍵查看源代碼。

http://www.ourd3js.com/demo/G-8.0/arrow.html

本例所需的JSON文件有二:china.topojsonsouthchinasea.svg

謝謝閱讀。



文檔信息

發佈了122 篇原創文章 · 獲贊 380 · 訪問量 109萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章