2016-06-29 9 views
4

私はD3を使用して、GeoJSONデータセットに基づいてベクターマップを描画しています。既存のD3パスの投影を見つけるには

私は既存のパスを持っており、トゥイーンを使用してパスを変換する必要があります。これを行うには、現在のprojectionオブジェクトをこのパスにルックアップするためにD3を使用する必要があります。しかし、私はこれを達成するための構文を理解しているように見えることはできません。既存のD3パスの投影をルックアップすることは可能ですか?

私はパスをルックアップすることができます。私はこのパスからの投影オブジェクトを取得するには、そこから行くことがどこか分からない、

const mapPath = d3.select('path.states'); 

しかし。あなたが提供できるかもしれないあらゆる助けや方向性に感謝します。

+0

具体的には「投影法」とはどういう意味ですか?あなたは 'd3.geo.projection'で使われた値か、パスのデータを意味しますか? –

+0

はい、私はこの例の行に沿って、 'projection'によって既存のパスを変換しようとしています:http://bl.ocks.org/mbostock/3711652。しかし、私はこの例のように永続変数として投影にアクセスすることができないので、D3経由でそれを探す方法を見つけようとしています。 –

+3

あなたが持っているものが ''のSVGであれば、そのパス文字列を生成するためにどの投影が使われたのか(つまり属性** d **の値)その答えは、それが不可能であるか、またはせいぜい非常に困難であるということです。これは、印刷された地図を見て、それにどのような投影が使われたのかを知ることに相当しますが、人はAIよりも優れているからです。 – meetamit

答えて

2

(コメント内の説明に基づいて)、地図上の投影を使って、アプリ内の他の場所でその投影を必要とするコードと同じアプリに存在するコードのように聞こえるので、これは本当に問題ですアプリアーキテクチャの - 投影検出ではありません。それを必要とするサブルーチンに投影するように設計する方法はありますが、これまでのフレームワークや実装には本当に依存しています。

アーキテクチャに入ることなく、これは、d3のデータバインディングを使用して、投影が助けたDOMノードの投影を掛けるためのMarkの提案(実際には元の質問のコードスニペットで示されている)に従っています。 IMOは、アプリケーションアーキテクチャのソリューションと比較して、この目的のためにデータバインディングを使用する方が、バグが発生しやすくなる可能性があるため、あまり選択肢がありません。しかし、それは動作し、少なくとも単純なアプリでは、このようにするのが妥当です。だから... ...

はおそらく、どこかが作成され、パスのレンダリングコードを持って、それは次のようになります。

var projection = d3.geo.mercator(); 
var mapG = svg.append('g').attr('class', 'map'); 
var mapG.selectAll('path').data(myMapData).enter() 
    .append('path') 
    .attr("d", d3.geo.path().projection(projection)); 

私はあなたが異なって見えることを確認んだけど、うまくいけば、それは近いですN個のエントリがmyMapDataに対応するN個のパスであり、各パスにはすでに関連付けられているデータ(それが表すジオ機能のデータ)があることを指摘する必要があるからです。だから、あなたの投影を掛ける良い場所は、複数のパスがあるので、パスにはありません。それらはすでにそれらにバインドされたデータを持っていますが、この場合はパスの親にあります。mapGあなたがそれを行う方法は、DOMノードへの投影をバインドする.datum()を使用している:

mapG.datum(projection); 

さて、あなたは投影を検索する必要があなたのコードでその場所から、あなたがdatum()を使用したいですそれを抽出する:

var mapG = d3.select('svg g.map') 
var projection = mapG.datum() 
関連する問題