2016-12-19 16 views
2

d3.jsとtopoJSONを使ってアフリカの地図を作成したいと思います。私はそのデータソースを持っていますhttps://gist.githubusercontent.com/bricedev/3905007f1794b0cb0bcd/raw/ad5c995f6990f7c3c7fad5c6206bc6fd5462f1fb/africa.jsond3.jsとtopoJSONを使ってアフリカの地図を作成する

これは私のコードです。私はどのようにプロパティを取得し、正しい地図を作成できますか?エラーがどこにあるのか教えてください。

<!DOCTYPE html> 
<html> 
<head> 
<meta name="description" content="D3byEX 12.15" /> 
<meta charset="utf-8"> 
</head> 
<body> 
<script src="http://d3js.org/d3.v3.min.js"></script> 
<script src="http://d3js.org/topojson.v1.min.js"></script> 
    <script> 
    var width = 1000, height = 728; 


    var svg = d3.select("body").append("svg") 
     .attr({ width: width, height: height }); 
    var mainGroup = svg.append("g"); 
    mainGroup.style({ stroke: "white", "stroke-width": "2px", "stroke-opacity": 0.0 }); 

    var projection = d3.geo.mercator(); 

    var path = d3.geo.path().projection(projection); 

    var url = 'https://gist.githubusercontent.com/bricedev/3905007f1794b0cb0bcd/raw/ad5c995f6990f7c3c7fad5c6206bc6fd5462f1fb/africa.json'; 
    d3.json(url, function (error, africa) { 
     var countries = topojson.feature(africa, africa.objects.countries).features; 
     var neighbors = topojson.neighbors(africa.objects.countries.geometries); 

     var color = d3.scale.category20(); 
     mainGroup.selectAll("path", "countries") 
      .data(countries) 
      .enter().append("path") 
      .attr("d", path) 
      .style("fill", function (d, i) { 
       return color(d.color = d3.max(neighbors[i], 
        function (n) { return countries[n].color; }) + 1 | 0); 
      }); 

     mainGroup.selectAll("path") 
      .on("mouseover", function() { 
       console.log("mouseover"); 
       d3.select(this).style("stroke-opacity", 1.0); 
      }); 
     mainGroup.selectAll("path") 
      .on("mouseout", function() { 
       d3.select(this).style("stroke-opacity", 0.0); 
      }); 
    }); 

</script> 

答えて

2

あなたtopojsonはWGS84ではない、それは緯度/長いスペースや、非投影座標データと言うことです。 D3.projection()にはWGS84が必要です。

あなたのtopojsonはすでに投影されています、私が仮定しているのはAfrica Lambert Conformal Conicです。これをd3.jsに表示するには投影を使う必要はありません。これはtopojsonは、データがどこから来たということでthe blockに投影された方法です

path = d3.geoPath().projection(null); 

:投影せずに、このデータを表示するためには、あなたはあなたのようgeoPathの投影を定義することができます。

投影を拡大または変換する必要がある場合は、d3.geoTransformが役に立ちます。this blockを参照してください。

また、topojsonを再投影して緯度/経度のペアを使用し、d3.projection()を使用して適切に投影することができます。

関連する問題