为了提高我的在线地图的性能,特别是在智能手机上,我遵循Mike Bostock的建议,在将地理数据上传到服务器之前尽可能地准备地理数据(根据他的命令行制图).例如,我正在通过d3.geoConicEqualArea()命令行投射TopoJSON数据,而不是让观看者的浏览器在加载地图时执行这项繁重的工作.
不过,我也想用类似的方法.scale,.fitSize,.fitExtent和.translate动态,这意味着我不能"烤"的规模或价值事先翻译成TopoJSON文件.
Bostock建议使用d3.geoTransform()作为预测的代理,例如,d3.geoConicEqualArea()如果您正在使用已经预测的数据但仍希望扩展或翻译它.例如,要在y轴上翻转投影,他建议:
var reflectY = d3.geoTransform({
point: function(x, y) {
this.stream.point(x, -y);
}
}),
path = d3.geoPath()
.projection(reflectY);
Run Code Online (Sandbox Code Playgroud)
我的问题:如果我使用这个D3功能,我是不是仍然强迫观众的浏览器进行大量的数据处理,这会使性能恶化?预处理数据的目的是避免这种情况.或者我是否过高估计上述d3.geoTransform()功能涉及的处理工作?
我正在使用一个对于网络用户(尤其是智能手机用户)来说相对较大的数据集。我担心表现。对于用户来说哪个问题更大?
\n\nJSON)。CSV) 重新格式化为较大的文件 ( JSON) 以便可以使用。当我将数据编译为 时JSON,它大约为570KB \xe2\x80\x93,远远大于我通常使用的大小。这被直接剥离了(例如,我已将每个键减少为单个字符)。
当我将数据编译为 时CSV,大约为220KB。但是,无论如何,我都需要浏览器将其重新JSON格式化。
这是一个小例子。一份CSV文件:
"year","birth","101","102","103","104","105"\n1981,"Australia",5972,1099,573,747,667\n1981,"China",141,4,3,2,2\n1981,"India",139,5,4,6,2\n1981,"Indonesia",371,9,14,5,6\n1981,"Malaysia",838,72,42,11,14 \nRun Code Online (Sandbox Code Playgroud)\n\n...与相同数据相比JSON:
[{"year":1981,"birth":"Australia","101":5972,"102":1099,"103":573,"104":747,"105":667},\n{year":1981,"birth":"China","101":141,"102":4,"103":3,"104":2,"105":2},\n{year":1981,"birth":"India","101":139,"102":5,"103":4,"104":6,"105":2},\n{year":1981,"birth":"Indonesia","101":371,"102":9,"103":14,"104":5,"105":6},\n{year":1981,"birth":"Malaysia","101":838,"102":72,"103":42,"104":11,"105":14}]\nRun Code Online (Sandbox Code Playgroud)\n\nTLDR:对于性能来说,哪一个更重要:(1) 最小化数据文件的大小,或 (2) 最小化浏览器必须执行的数据处理量?
\n