2017-11-10 12 views
1

D3を使用してサンフランシスコのGeoJSONマップを表示しようとしています。私が使用して提供しています、次のファイルを持っている "HTTPサーバ-c-1":D3はGeoJSONパスをSVGに追加しますが、何も表示されません。

のindex.html:

<!DOCTYPE html> 
<html> 
    <head> 
    <script src="http://d3js.org/d3.v4.min.js"></script> 
    </head> 
    <body> 
    <script src="./d3Map.js"></script> 
    </body> 
</html> 

d3Map.js:

const d3 = window.d3; 

// Append a svg to the HTML body and set its height and width: 
const svg = d3.select('body') 
    .append('svg') 
    .attr('height', 500) 
    .attr('width', 500) 
// Append the <g> element which is used for grouping SVGs: 
const g = svg.append('g'); 

// Get the GeoJSON data and use it to setup the paths: 
d3.json('./sfmaps/neighborhoods.json', (error, topology) => { 
    // Setup the projection: 
    const bounds = d3.geoBounds(topology); 
    const centerX = d3.sum(bounds, (d) => d[0])/2; 
    const centerY = d3.sum(bounds, (d) => d[1])/2; 
    const projection = d3.geoMercator() 
    .center([centerX, centerY]); 

    // Create a geographic path generator and set its projection: 
    const path = d3.geoPath() 
    .projection(d3.geoMercator()); 

    g.selectAll('path') 
    .data(topology.features) 
    .enter() 
     .append('path') 
     .attr('d', path); 
}); 

私は点検表示されたSVGは空白ですが、表示されるSVGは空白です。

<body> 
    <svg> 
    <g> 
     <path d="..."></path> 
     <path d="..."></path> 
     ... 
    </g> 
    </svg> 
</body 

ただし、表示されるSVGは空白です。

プロジェクションが正しくスケールされていないと思われたので、.center(...)を省略し、サンフランシスコの緯度と経度でハードコーディングし、.fitSize(...)を使用しました。

私はドキュメントの用語で少し混乱しています。値がGeoJSONオブジェクトでなければならないということは、JSON全体(コード内で「トポロジ」と名付けたもの)、フィーチャ(トポロジ・フィーチャ)、または個々のパス(トポロジ.features [0])。しかし、私は3つすべてを使用しようとしましたが、いずれもコンソールでエラーを表示したり表示したりしませんでした。

GeoJSONファイルは他の人が作ったファイルなので、正しいことは間違いありません。

私は何が間違っているのか、これをデバッグするためにどのような道が必要なのか、ご意見はありますか?

答えて

0

2つの問題:

  1. 投影を適用

あなたが投影

を設定する。しかし、あなたがそれを使用しないでください:

const path = d3.geoPath() 
    .projection(d3.geoMercator()); // applies default mercator 

してみてください。

const path = d3.geoPath() 
    .projection(projection); // applies mercator with modified parameters 
  • あなた投影翻訳
  • デフォルトD3投影に変換するには、センタリングがそのSVGの中央座標配置され、[480250]一般的に960×500ピクセルです。あなたのSVGは500×500であるので、あなたが使用する必要がありますにGeoJSONオブジェクトに関するご質問に関しては

    projection.translate([250,250]) 
    

    。 geojsonオブジェクトは、フィーチャコレクション(コード内のtopology変数)またはフィーチャコレクションのフィーチャセット内の特定のフィーチャ/シェイプ(topology.features[0])ですが、topology.featuresのような配列にすることはできません。有効なgeojsonオブジェクトの詳細は、More than you ever wanted to know about geojsonを参照してください。

    なfitSizeにフィーチャーコレクションとして、にGeoJSONオブジェクトを渡した場合は、あなたのコードは次のようになります。

    projection = d3.geoMercator() 
        .fitSize([width,height],topology) 
    

    注これはセンタリング座標を変更するが、合うようにマップ機能を変換し、スケールしません。指定された寸法。このメソッドを使用する場合は、このメソッドが変換自体を定義するため、変換を指定する必要はありません。

    中心座標を.center([long,lat])(fitSizeを使用しない)と指定する場合は、上記の2のように変換を指定する必要があります。


    最後の注意:

    にGeoJSONはトポロジーをコードしない、topojsonフォーマットは、機能のトポロジーを記録します。 topojson.jsによって処理されると、topojsonはgeojsonに変換されます。変数名として、トポロジの使用はgeojsonではなくtopojsonの使用を推論します。

    関連する問題