0

私は 4000 のデータポイントのようなもので米国の地図を作成していますが、可能であれば d3 で作成したいと考えています。これらの多くのポイントを一度にレンダリングすると、Chrome の速度がいくらか低下し、Firefox のグリッドが停止することに気付きました。私が欲しいのは、次のことを行う redraw() 関数です。

topRightCorner = [x1,y1]
bottomLeftCorner = [x2,y2]
data = data.filter(function(d) {
    projectedCoordinates = proj(lat,lon)
    return(projectedCoordinates[0] < x1 
      && projectedCoordintes[0] > x2
      && projectedCoordinates[1] < y1
      && projectedCoordinates[1] > y2}

つまり、投影後 (私の場合は albersUsa) が可視領域に収まるポイントのみを保持します。ただし、投影された可視寸法が見つからないようです。この機能は利用できますか?

4

2 に答える 2

0

投稿して以来、私はある種の機能を思いつき、別のアプローチをとっています。

AlbersUsa() プロジェクションですべてを行っています。これは、アラスカとハワイが必要なためレイアウトには最適ですが、invert() 関数がないためコーディングにはあまり適していません。通常の Albers().invert() を使用し、常に AK と HI にポイントを描画しました。とにかく比較的少ないためです。

最初にコーナーを定義しました:

    projAlbers.scale(defaultScale * d3.event.scale);
    topLeft = projAlbers.invert([0,0]);
    bottomRight = projAlbers.invert([purewidth,pureheight]);

次に、すべての再描画ですべての座標を投影するのではなく、ボックスの反転座標を実際の緯度/経度と比較しました。

    allCircles.remove();
        visibleDots = data.filter(function(d) {
            return (
                (d.latitude >=49) ||
                (d.longitude < -130) ||
                (d.latitude < topLeft[1] && d.latitude > bottomRight[1] &&
                d.longitude > topLeft[0] && d.longitude < bottomRight[0])); 
        });

これは機能します - 唯一のことは、地図が曲がっているニューイングランドまたは太平洋岸北西部に到達すると、円錐図法が私のビューポートの長方形 1:1 に対応しないため、すべてのポイントが描画されないことです。まだそれを理解しています。

(>= 49 と < -130 で常にハワイとアラスカを描画します)

于 2012-08-09T16:27:24.040 に答える