如何在d3中使用多面投影获得屏幕坐标

时间:2013-12-11 14:34:27

标签: d3.js

我使用D3来显示县内的客户位置。对于我的大多数县,我没有任何问题。我使用以下代码片段来获取我的县的XY坐标

var countyCoords = county.geometry.coordinates[0];
...
for (var j = 0; j < countyCoords.length; j++)
{
    var x = projection(countyCoords[j])[0];
    var y = projection(countyCoords[j])[1];

像魅力一样,有一个例外。如果我的county.geometry [“type”]是MultiPolygon,则这些行会失败。如何在d3中获取MultiPolygon的屏幕位置(即x,y)?

以下是我输入到d3.json()[编辑此处显示]

的一些行
"counties":
 {
"type":"GeometryCollection",
"geometries":[
         {"type":"MultiPolygon","properties":{"NAME":"Chester"},"id":"Chester","arcs":[[[13,2111,15,2112,17,18,2113,2114,20,2115,2116,-1951,2117,2118,2119,9,2120,11,2121]],[[2122,2123]]]},
         {"type":"Polygon","properties":{"NAME":"Clarion"},"id":"Clarion","arcs":[[-1966,2124,-2004,-2018,-2063]]},

我通过使用这条线获得了县:

counties = topojson.feature(topoData, topoData.objects.counties);

我遍历县并收集上面提到的XY位置,如下所示:

for (var i = 0; i < counties.features.length; i++)
{
    var county = counties.features[i];
    var countyCoords = county.geometry.coordinates[0];
    var xy = [];

    for (var j = 0; j < countyCoords.length; j++)
    {
        var x = projection(countyCoords[j])[0];
        var y = projection(countyCoords[j])[1];

        var dataPoint = [x,y];
        xy.push(dataPoint);
    }

    county.properties["XY"] = xy;
}

这对于“Clarion”县来说是正确的,但是对于“切斯特”县来说却失败了。

2 个答案:

答案 0 :(得分:1)

GeoJSON multipolygon对其结构有一个额外的数组级别,您需要迭代:

http://geojson.org/geojson-spec.html

为了解决这个问题,你必须做这样的事情:

if (county.geometry.type == "MultiPolygon") {
 for (var x=0; x< countyCoords.length;x++) {

  for (var j = 0; j < countyCoords[x].length; j++) {
    var x = projection(countyCoords[x][j])[0];
    var y = projection(countyCoords[x][j])[1];

答案 1 :(得分:0)

这是解决我的问题的代码。这几乎是以利亚的建议,但根据我的具体需求量身定制。 (注意:这仅适用于Multipolygon类型,普通多边形类型应使用我原始帖子中标识的代码)。另外,请随时指出我的代码可以改进的地方。

 for (var i = 0; i < counties.features.length; i++)
{
    var county = counties.features[i];

    if (county.geometry["type"] === "MultiPolygon")
    {
        var xy = [];

        for (var k = 0; k < county.geometry.coordinates.length; k++)
        {
            var countyCoords = county.geometry.coordinates[k][0];

            for (var j = 0; j < countyCoords.length; j++)
            {
                var x = projection(countyCoords[j])[0];
                var y = projection(countyCoords[j])[1];

                var dataPoint = [x,y];
                xy.push(dataPoint);
            }
            county.properties["XY"] = xy;
        }
    }
}