我有一個d3地圖顯示了航運線路。這些線條作爲我使用投影和d3路徑繪製的座標列表提供。非常普通的東西。問題是如果我想要的路徑從-179°E到+ 179°E,發生了什麼。不幸的是它穿越了地圖。有什麼辦法讓它離開地圖的左邊並重新出現在地圖的右側?停止d3路徑穿越地圖
2
A
回答
2
如果在繪製連接它們的線(使用svg點陣列)之前用投影繪製點,則在穿過反子午線時線不會像所期望的那樣運行。畢竟,你只是在二維網格上繪製點並將它們連接起來,就好像它們是二維網格上的點一樣。
但是,如果您使用geoPath(使用long,lat字體數組)繪製線條,則路徑將遵循點之間的最短距離(大圓距)。一個地理路徑執行三維數學轉換將地球上的點連接到二維空間中的路徑的路徑。這意味着
- 兩個點之間的線將ARC(明顯地,如果離得足夠遠,並根據投影)
- 逆子午線並不重要 - 大圓距離是獨立的,其中子午線是
- 操縱地圖更容易了。
您可能已經在使用geoPath
作爲背景功能。如果不是,d3.geoPath()
需要分配投影,因爲您已經有一個投影,您可以使用var path = d3.geoPath().projection(projection)
。
A geoPath
需要geojson特徵或幾何對象。你可以像很容易地創建一個行:
var coords = [[-179,0],[179,0]];
svg.append("path")
.datum({ "type": "LineString", "coordinates": coords })
這裏的路徑脫落地圖的左側,remerging右側的例子。 (我不能製作足夠小的太平洋邊緣的片段,所以我已經使用了美國並旋轉了它,以便它被反經線切成兩半,但它也會切斷+/- 180的經度也參見,用於繪製兩個或多個點之間的地理路徑,this):
var width = 500;
var height = 300;
var svg = d3.select("body")
.append("svg")
.attr("width",width)
.attr("height",height);
var projection = d3.geoMercator()
.rotate([-75,0])
.scale(50)
.translate([width/2,height/2]);
var path = d3.geoPath().projection(projection);
var usa = {"type":"FeatureCollection", "features": [
{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-94.81758,49.38905],[-88.378114,48.302918],[-82.550925,45.347517],[-82.439278,41.675105],[-71.50506,45.0082],[-69.237216,47.447781],[-66.96466,44.8097],[-70.11617,43.68405],[-70.64,41.475],[-73.982,40.628],[-75.72205,37.93705],[-75.72749,35.55074],[-81.49042,30.72999],[-80.056539,26.88],[-81.17213,25.20126],[-83.70959,29.93656],[-89.18049,30.31598],[-94.69,29.48],[-99.02,26.37],[-100.9576,29.38071],[-104.45697,29.57196],[-106.50759,31.75452],[-111.02361,31.33472],[-117.12776,32.53534],[-120.36778,34.44711],[-123.7272,38.95166],[-124.53284,42.76599],[-124.68721,48.184433],[-122.84,49],[-116.04818,49],[-107.05,49],[-100.65,49],[-94.81758,49.38905]]],[[[-155.06779,71.147776],[-140.985988,69.711998],[-140.99777,60.306397],[-148.018066,59.978329],[-157.72277,57.570001],[-166.121379,61.500019],[-164.562508,63.146378],[-168.11056,65.669997],[-161.908897,70.33333],[-155.06779,71.147776]]]]},"properties":{"name":"United States of America"},"id":"USA"}
]};
svg.append("path")
.attr("d",path(usa));
var coords = [[-150,65],[-80,25],[-121,36]];
svg.append("path")
.datum({ "type": "LineString", "coordinates": coords })
.attr("fill","none")
.attr("stroke","steelblue")
.attr("stroke-width",4)
.attr("d",path);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.5.0/d3.min.js"></script>
相關問題
- 1. 防止穿越dagre-d3中的箭頭
- 2. D3 Sankey儘量減少鏈路穿越
- 3. Facebook和Twitter的iframes穿越路徑
- 4. 獲得的唯一路徑數量穿越而穿越利用我創建的Neo4j穿越API
- 5. CSS鼠標懸停穿越
- 6. 如何阻止玩家穿越圖層?
- 7. Voronoi情節,線路穿越
- 8. D3地圖:放大到路徑組
- 9. 穿越紅寶石地圖問題
- 10. 如何連接兩點而不穿越另一條路徑?
- 11. 防禦路徑穿越攻擊的最佳方法是什麼?
- 12. 停止路徑處理
- 13. 穿越迷宮的最佳路線
- 14. PHParray穿越
- 15. Android:NAT穿越?
- 16. 穿越堆棧
- 17. 穿越jQuery
- 18. vb.net穿越
- 19. 穿越鏈表
- 20. 穿越SQLite表
- 21. jQuery穿越.not
- 22. D3.js - 線圖:區域路徑在變焦上穿過x和y軸
- 23. 如何阻止我的角色穿越地面
- 24. d3.js地理 - 渲染svg路徑
- 25. 地圖和路線在D3
- 26. d3懸停css在圖表停止「滴答」時停止工作
- 27. JQuery的表穿越
- 28. XSLT節點穿越
- 29. 穿越一些點
- 30. 穿越回在asp.net