5

私の目的は、d3 を使用して、特定の GeoJSON 機能コレクション内の各機能の svg パスを生成することです。

リーフレットを使用してパスをマッピングすると、すべての機能が完璧に見えます。

d3.json("ct_counties.geo.json", function(data) {
    var leaflet_paths = leaflet_map.addLayer(new L.GeoJSON(data));
});

2 つのマップ

しかし、d3 を使用してパスをマッピングすると、一部の機能が正しく見えません。

d3.json("ct_counties.geo.json", function(collection) {
    var bounds = d3.geo.bounds(collection);

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

    var feature = g.selectAll("path")
        .data(collection.features)
      .enter().append("path")
        .attr('class','county');

    d3_map.on("viewreset", reset);

    reset();

    function project(x) {
      var point = d3_map.latLngToLayerPoint(new L.LatLng(x[1], x[0]));
      return [point.x, point.y];
    }

    function reset() {
      var bottomLeft = project(bounds[0]); 
      var topRight = project(bounds[1]);
      svg.attr("width", topRight[0] - bottomLeft[0])
        .attr("height", bottomLeft[1] - topRight[1])
        .style("margin-left", bottomLeft[0] + "px")
        .style("margin-top", topRight[1] + "px");
      g.attr("transform", "translate(" + -bottomLeft[0] + "," + -topRight[1] + ")");
      feature.attr("d", path);
    }
});

ここでマップの違いを表示します。

ここで完全なコードを参照してください。

両方のマップが同じフィーチャ コレクションを使用しているのに、d3 バージョンが間違っているのはなぜですか?

4

1 に答える 1

23

D3は間違っていません。データは正しくなく、Leafletの方が寛大です。

例として、リッチフィールド (左上の郡) を取り上げます。

{
    "type" : "Feature",
    "properties" : {
        "kind" : "county",
        "name" : "Litchfield",
        "state" : "CT"
    },
    "geometry" : {
        "type" : "MultiPolygon",
        "coordinates" : [ [ [ [ -73.0535, 42.0390 ], [ -73.0097, 42.0390 ],
                [ -73.0316, 41.9678 ], [ -72.8892, 41.9733 ],
                [ -72.9385, 41.8966 ], [ -72.9495, 41.8090 ],
                [ -73.0152, 41.7981 ], [ -72.9823, 41.6392 ],
                [ -73.1631, 41.5571 ], [ -73.1576, 41.5133 ],
                [ -73.3219, 41.5078 ], [ -73.3109, 41.4694 ],
                [ -73.3876, 41.5133 ], [ -73.4424, 41.4914 ],
                [ -73.4862, 41.6447 ], [ -73.5191, 41.6666 ],
                [ -73.4862, 42.0500 ] ] ] ]
    }
}

マルチポリゴンは閉じていません。その終点は始点と等しくありません。座標をプロットし、最初の座標を赤でマークし、最後の座標を緑でマークしました。 マルチポリゴン内のポイント

ご覧のとおり、最後の座標は d3 によって破棄されます。

GeoJSON仕様によると

LinearRing は、4 つ以上の位置を持つ閉じた LineString です。最初と最後の位置は同等です (同等のポイントを表します)。

したがって、d3 にはポイントがあり (しゃれは意図されていません)、MultiPolygon は最後に開始座標を追加して閉じる必要があります。

...[ -73.4862, 42.0500 ], [ -73.0535, 42.0390 ] ] ] ]
于 2013-03-17T11:43:54.187 に答える