2014-11-05 60 views
0

我拥有世界上的D3地图上,我感兴趣的纬度和经度点标记。在D3地图添加静态行北纬和经度点

现在我想提请连接简单,静态生产线这些点。我该怎么做呢?

这是我带标记的地图代码:

<!DOCTYPE html> 
<meta charset="utf-8"> 
<body> 
<script src="http://d3js.org/d3.v3.min.js"></script> 
<script src="http://d3js.org/topojson.v1.min.js"></script> 
<script> 

    var width = 900, 
      height = 500; 

    // Create Projection 
    var projection = d3.geo.mercator() 

    // Generate paths based on projection 
    var path = d3.geo.path() 
      .projection(projection); 

    // Create SVG 
    var svg = d3.select("body").append("svg") 
      .attr("width", width) 
      .attr("height", height); 

    // Group for the map features 
    var features = svg.append("g") 
      .attr("class","features"); 

    // Build map with markers 
    d3.json("countries.topojson",function(error,geodata) { 
     if (error) return console.log(error); 

     //Create a path for each map feature in the data 
     features.selectAll("path") 
       .data(topojson.feature(geodata, geodata.objects.subunits).features) 
       .enter() 
       .append("path") 
       .attr("d", path) 
     // Add markers for cities by their latitude and longitude. 
     d3.csv("cities.csv", function (error, data) { 
      features.selectAll("circle") 
        .data(data) 
        .enter() 
        .append("circle") 
        .attr("cx", function (d) { 
         return projection([d.lon, d.lat])[0]; 
        }) 
        .attr("cy", function (d) { 
         return projection([d.lon, d.lat])[1]; 
        }) 
        .attr("r", 5) 
        .style("fill", "red"); 

     }); 
    }); 
</script> 

cities.csv

name,lat,lon 
LA,34.05,-118.25 
NY,40.7127,-74.006 

这段代码产生这样的:

Map with points 现在我要连接的标志与线。只是一个静态的线条,不需要动画或任何东西。结果应该是这样的:

Map with points and line connecting points

我添加了一个新组的d3.json()拨打以上线路:

var lines = features.append("g"); 

然后d3.json()电话里面,我补充这样的东西来创建数组线坐标:

var theLines = [ 
       { 
        type: "LineString", 
        coordinates: [ 
         [ data[0].lon, data[0].lat ], 
         [ data[1].lon, data[1].lat ] 
        ] 
       } 
      ]; 

但我不确定接下来要做什么(或者如果我的方法是正确的)来实际添加连接标记的线。

我想用CSS来设置标记和线条的颜色和大小。

更新:

我试图改变代码的圆圈画线来代替,但它不工作:

srbdev's答案,我改变lineStringline

d3.csv("cities.csv", function (error, data) { 
    features.selectAll("line") 
      .data(data) 
      .enter() 
      .append("line") 
      .attr("x1", function (d) { 
       return projection([d.lon])[0]; 
      }) 
      .attr("y1", function (d) { 
       return projection([d.lat])[0]; 
      }) 
      .attr("x2", function (d) { 
       return projection([d.lon])[1]; 
      }) 
      .attr("y2", function (d) { 
       return projection([d.lat])[1]; 
      }) 
      .style("stroke", "red"); 
}); 

但我得到以下结果:x2y2在控制台中有"NaN"值。 enter image description here

+0

D3的方式是从你的城市数据中为这些链接构建数据(例如,只有2个元素的数组与起始和终止城市),并用它来添加行。最简单的方法可能是使用'line'元素,其坐标是直接从数据中获取的,您可以使用类似的方式为当前城市添加圆圈。 – 2014-11-06 09:39:26

+0

谢谢拉尔斯。你能举个例子吗?我更新了我的问题,我尝试修改我的代码来绘制一条线而不是点。 – brno792 2014-11-07 00:16:48

+0

那么你如何确定在哪些城市线路之间应该绘制? – 2014-11-07 09:20:14

回答

0

您的编辑,你应该更改您的代码:

d3.csv("cities.csv", function (error, data) { 
features.selectAll("line") 
     .data(data) 
     .enter() 
     .append("line") 
     .attr("x1", function (d) { 
      return projection([d.lon])[0]; 
     }) 
     .attr("y1", function (d) { 
      return projection([d.lat])[0]; 
     }) 
     .attr("x2", function (d) { 
      return projection([d.lon])[1]; 
     }) 
     .attr("y2", function (d) { 
      return projection([d.lat])[1]; 
     }) 
     .style("stroke", "yellow"); 
}); 

我改变了 “线串” 到 “线”。有关可用SVG元素的列表,请参阅此link

另一种解决方案,虽然不是真正的D3方式拉尔斯提到的,是一个ID分配给每个圆的和创建线如下:

svg.append("line") 
    .attr("x1", d3.select("#circle1").attr("cx")) 
    .attr("y1", d3.select("#circle1").attr("cy")) 
    .attr("x2", d3.select("#circle2").attr("cx")) 
    .attr("y2", d3.select("#circle2").attr("cy")) 
    .style("stroke", "yellow"); 

希望这有助于!

+0

谢谢。我试过你的第一个解决方案它有点工作,但我得到了一些奇怪的结果。请用新的屏幕截图查看我更新的问题。 x2和y2正在返回“NaN,所以行都在原点处结束,并且由于某种原因它也增加了2行 – brno792 2014-11-07 23:34:50

+0

我看到...它表现的原因是因为您使用了d3.data和d3.enter函数会为每个数据点绘制两条线,您需要提取这些数据点并直接绘制线条,而不使用d3.selectAll,d3.data和d3.enter。对于线的属性,请使用例如.attr (“x1”,data [0] .lon)等等......如果你可以把你的代码放在jsfiddle或类似的东西中,我可以为你编辑它 – srbdev 2014-11-08 03:33:48

+0

抱歉使用类似.attr(“x1”,function() {return projection(data [0] .lon);})这个行的属性 – srbdev 2014-11-08 03:42:19

相关问题