使用Turf,Leaflet对六角网格进行分类

时间:2016-10-22 14:59:59

标签: javascript leaflet turfjs

我有一个过滤的十六进制网格,我想分类。

我用

创建了十六进制
var hexgrid = turf.hexGrid(bbox, cellWidth, units);

我用

汇总了值
var aggregated = turf.collect(hexgrid, myGeoJson, 'MyValue', 'NewCol');

其中myGeoJson是多点FeatureCollection,而MyValue是一个要素属性null或> 0

我用

过滤了十六进制
var hexFiltered = L.geoJson(aggregated, {
    filter: function(feature, layer) {
        return feature.properties.NewCol.length > 0;
    }
}).addTo(map);

可以使用

访问每个十六进制对象
console.log(hexFiltered["_layers"]);

output = Object { 49: Object, 51: Object, 52: Object, 53: Object...

每个对象都有.feature.properties.NewCol [n] 每个数组都有索引(0,1,2)和值(null,1 +)

如何使用数组值的总和对每个十六进制网格进行分类?

我用原生的javascript尝试了这个,但我能做到的只是一个包含每个值的字符串。

var counts = {};
for (var obj in hexFiltered["_layers"]) {
    // Output the id of each obj (hex)
    // console.log("Object: " + obj);
    var cnt = 0;
    for (var i in hexFiltered["_layers"][obj]["feature"]["properties"] ) {
        // print values out as 1 line (i)
        console.log("One line of values :" + hexFiltered["_layers"][obj]["feature"]["properties"][i]);
        // output = One line of values :,,,1,,,,1,1,,1

        // add values
        cnt = cnt + hexFiltered["_layers"][obj]["feature"]["properties"][i];
        console.log(cnt);
        // output = 0,,,1,,,,1,1,,1
    }
    // attach cnt to counts object
    counts += cnt;
}

我哪里错了?有没有更简单的方法?

1 个答案:

答案 0 :(得分:0)

如果你的问题是你得到一个字符串而不是数组值的总和,那么解决方案是迭代数组并单独添加每个元素,而不是试图将数组添加到整数。

如果您添加0 + [1,2,3,4,5],则会获得'01,2,3,4,5'。你应该做的是添加另一个循环,迭代包含数组的属性并单独添加每个元素。如何执行此操作的示例将是

    for (var j in hexFiltered["_layers"][obj]["feature"]["properties"]["NewCol"] ) {
        cnt += j
    }

此代码应替换您的第二个循环。我不确定你在counts += cnt的代码末尾要做什么,因为count是一个对象。如果您只想要一个值列表,那么您应该对一个数组(counts = [])进行计数,这样您就可以counts.push cnt而不是counts += cnt

如果这不能回答你的问题,请告诉我,我会更新答案。如果您需要进一步的帮助,请详细说明您的需求。