Как соединить данные .csv с TopoJSON в D3 - PullRequest
1 голос
/ 15 апреля 2019

Я делаю картографическую карту, используя D3, и хочу использовать данные из CSV для заполнения карты.

Я использовал следующий код для определения и объединения данных. Когда я его консолью .log, я просто получаю пустые полигоны и вижу пустую карту вместо цветной в зависимости от значения (функция, которая делает это, находится в другом месте кода).

    var promises = [];
    promises.push(d3.csv("data/nyplData.csv"));
    promises.push(d3.json("data/nycNTA.topojson"));
    promises.push(d3.json("data/manhattan.topojson"));
    Promise.all(promises).then(callback);



    function callback(data){

        //console.log(data);
        csvData = data[0];
        nyc = data[1];
        manhattan = data[2];

        //place graticule on the map
        setGraticule(map, path);

        //translate New York/Manhattan into TopoJSONs
        var nycNeighborhoods = topojson.feature(nyc, nyc.objects["nyc-neighborhoods"]),
            manhattanNeighborhoods = topojson.feature(manhattan, manhattan.objects.manhattan).features;

        //add Europe countries to map
        var nyc = map.append("path")
            .datum(nycNeighborhoods)
            .attr("class", "nyc")
            .attr("d", path);

        //join csv data to GeoJSON enumeration units
        manhattan = joinData(manhattan, csvData);
        //console.log(manhattan);

        //create the color scale
        var colorScale = makeColorScale(csvData);

        //add enumeration units to the map
        setEnumerationUnits(manhattanNeighborhoods, map, path, colorScale);

        //add coordinated visualization to the map
        setChart(csvData, colorScale);

        //create dropdown for attribute selection
        createDropdown(csvData);
    };
}; //end of setMap()

. , .

function joinData(manhattan, csvData){
    //loop through csv to assign each set of csv attribute values to geojson region
    for (var i=0; i < csvData.length; i++){

        var csvRegion = csvData[i]; //the current region

        var csvKey = csvRegion.ntacode; //the CSV primary key

        //loop through geojson regions to find correct region
        for (var a=0; a < manhattan.length; a++){
            //console.log(manhattan.length);
            var geojsonProps = manhattan[a].properties; //the current region geojson properties
            var geojsonKey = geojsonProps.ntacode; //the geojson primary key

            //where primary keys match, transfer csv data to geojson properties object
            if (geojsonKey == csvKey){

                //assign all attributes and values
                attrArray.forEach(function(attr){
                    var val = parseFloat(csvRegion[attr]); //get csv attribute value
                    geojsonProps[attr] = val; //assign attribute and value to geojson properties
                });
            };
        };
    };

    return manhattan;
};

Я ожидаю, что эта функция объединит данные из CSV-файла в файл topoJSON на карте, основываясь на общем поле поля "ntacode", но я снова получаю карту, заполненную нулевыми значениями. Кто-нибудь может увидеть, где я иду не так?

...