2017-05-06 6 views
1

デフォルトのメルカトル投影スケール値でスケールの動作に特有の問題が発生しました。私の場合は、なんとか私ができる唯一の方法だったので、かなりばかげた値(75000)私のTOPOJsonマップをドット以外のものとしてプロジェクトにするD3デフォルトのメルカトル投影スケールを使用した初期ズーム

私はマップの投影を作成し、ズームとパンを追加したいと思います。私の機能は、デフォルトのズーム値を除いてすべて機能します。ズームするためにスクロールすると、値はマウスホイールに基づいてスケーリングするのではなく、デフォルトの投影スケール値に戻ります。その理由は、マップを表示するためには、私の投影スケール値を本当に高く(75000)する必要があったからです。

ので、ページが読み込まれると、ズームはthisのように、正常に見える...しかし、あなたは1つのマウスホイールクリックまたはアウトパンやズームしようとすると、それは私がコードを制限しようとしたthis

にジャンププロジェクションとズームのロジックだけになります。

<body> 
    <script src="//d3js.org/d3.v3.min.js" charset="utf-8"></script></script> 
    <script src="//d3js.org/topojson.v1.min.js"></script> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
     <div id = "map" style = "float : left; min-width:320px;width :50%;height : 600px;"></div> 
    <script> 

    var width = 900, 
    height = 800; 

    var projection = d3.geo.mercator() 
    .center([-73.94, 40.70]) 
    .scale(75000) 
    .translate([(width/2), (height/2)]); 

    var svg = d3.select("#map").append("svg") 
    .attr("viewBox", "0 0 900 800") 
    .attr("preserveAspectRatio", "xMidYMid meet"); 

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

    var g = svg.append("g") 
    .attr("transform", "translate(-793.0489643729818,-630.1796382734433)scale(3.01487286910262)"); 

    d3.json("ny.json", function(error, ny) { 
    g.append("path") 
    .attr("id", "boroughs") 
    .datum(topojson.feature(ny, ny.objects.boroughs)) 
    .attr("d", path); 

// zoom and pan 
var zoom = d3.behavior.zoom() 
    .on("zoom",function() { 
     g.attr("transform","translate("+ 
      d3.event.translate.join(",")+")scale("+d3.event.scale+")"); 
     g.selectAll("path") 
      .attr("d", path.projection(projection)); 
    }); 

svg.call(zoom) 

    }); 
+0

シェープファイルはここからダウンロードしたhttp://www1.nyc.gov/site/planning/data-maps/open-data/districts-download-metadata.page mapshaper –

+0

をすることができますし、私はそれを変換あなたの問題を再現できるように、 'ny.json'ファイルをどこかに投稿してください。私は[jsonblob](https://jsonblob.com/)を使用するのが好きです... – Mark

+0

@マークああ!私はjsonエディタをオンラインで使用しようとしていましたが、それは大きすぎるようでした。ここに行きます:https://jsonblob.com/96ada11e-3285-11e7-ae4c-4b5e1959573f –

答えて

1

私はあなたの問題は、あなたが最初のスケーリングを設定し、gに値を変換してからズームでそれらをリセットすることであると信じています。規模については、例えば:

あなたは3.01からgためのスケールが起動するように設定:

var g = svg.append("g") 
    .attr("transform", "translate(-793.0489643729818,-630.1796382734433)scale(3.01487286910262)"); 

しかし、あなたはd3.eventでズーム初めて、それが0.607または1.647、(戻りますこれは、両方のスケールとして、あなたが見ているのジャンプを作成して、リセットして、初期値のように独立している翻訳

g.attr("transform","translate("+ 
    d3.event.translate.join(",")+")scale("+d3.event.scale+")"); 

:)ズームイン、ズームアウトの両方が3.01に対してズームアウトしています。私は翻訳の価値は大丈夫だろうと思うが、あなたはsvgでそれを呼び、最初の翻訳を指定するのはgではない。

gでは、最初のトランスフォームを設定しない方が簡単です(2ステップの中心ではなく、投影と変形の両方でズームする)。そうすれば、すべてのコードを変更せずにそのまま残しておき、最初のg変換を設定した線を削除し、投影を修正することができます。

+0

それは意味があります、私の最初の試みは投影変数の値を変換して再生しますが、これは主に推測ゲームのようですが、投影変数でズームが正しく機能するようにはできません。だから、私はそれを "g"の属性に強制しようとし始めました...しかし、それは私が今どこにいるのかです。私は実際に私と一緒に作業するために投影の翻訳属性を取得する方法に固執しています –

+0

ちょっと私はあなたのブロックプロファイル上で実際に周りを突っ込んでいたとあなたはhttp://bl.ocks.org/andrew -reid/9556697440f43f576ed79cd5c445910e 私はtopojsonを使用していることに気付きました。そこには、その内部に定義されたバウンディングボックスがあり、そこからスケールを取得します。このようなアプローチがこの場合私を助けるだろうと思いますか? –

+0

うん、それはうまくいくはずです。投影パラメータはあなたのjsonに基づいて設定されます。次に、必要に応じてパンを拡大縮小して表示することができます(地図をナビゲートするときにプロジェクションを変更できますいくつかの状況)。 d3v4は、この方法で遊んだ後、より簡単な投影自動フィット(fitExtentとfitSize) –

関連する問題