D3.js 酥脆的边缘,还有什么?
Mike Bostock共享了一系列全球范围的topojson文件 由于我需要更多的数据和更高的质量,我现在从自然地球生成自己的高质量topojson文件。为了简单起见,我的makefile/命令如下:D3.js 酥脆的边缘,还有什么?,d3.js,maps,topojson,D3.js,Maps,Topojson,Mike Bostock共享了一系列全球范围的topojson文件 由于我需要更多的数据和更高的质量,我现在从自然地球生成自己的高质量topojson文件。为了简单起见,我的makefile/命令如下: admin_0: crop ../node_modules/topojson/bin/topojson \ --id-property name \ -p name=name \ -q 1e4 \ --filter=smal
admin_0: crop
../node_modules/topojson/bin/topojson \
--id-property name \
-p name=name \
-q 1e4 \
--filter=small \
-o admin_0.topo.json \
-- admin_0=./natural_earth_vector/10m_cultural/ne_10m_admin_0_countries.shp
但是我的3MB是脆的、令人讨厌的、图像混乱的。看看海岸线,你会看到最烦人的东西:看起来像“楼梯”的线条:水平、垂直、水平、垂直
博斯托克先生的90kb在优雅方面做得出奇地好。不完美,但很好,他有对角线(!)和他的线条使用的各种角度
我尝试将量化减少到-q1e3
,但它保持脆脆,而且更难看:楼梯的台阶更大
从网上,我注意到并尽可能多地阅读:
- -q、 --量子化,--没有量子化沿任一维度可微点的最大数量
- -s、 --Visvalingam简化的简化精度阈值
- --简化比例为Visvalingam简化保留的点的比例
- --宽度缩放和平移以适合指定宽度的视口
- --高度缩放和平移以适合指定高度的视口
-q
减少每个坐标的位数。最初,地质点具有非常高的精度,例如
…,[-90.07231180399987,29.501753271000098],[-90.06635619599979,29.499494248000133],…
量化-q1e4
其中1e4=10000创建一个10000×10000的网格,其整数值介于0和9999之间,如[-67001030]
。按坐标排列的字符从~40减少到12,减少了~75%,最大值为4。其次,量化使输入形状文件中不同的地理点现在共享相同的坐标,例如[24,62],[24,62],[24,62],[24,62]…
。这些重复项被合并。最终结果是由网格上的点定义的形状如果只使用量化,则从网格点到网格点的形状将由垂直+水平线组成。
相反,简化通过删除点来删除信息。TopoJSON使用的Visvalingam方法去除了最不明显的点,该原理在中进行了巧妙的说明。要精确删除许多精细三角形,请首先使用更高的量化,然后进行简化:
#world
topojson -q 1e6 -s 7e-5 -o world-110m.json -- NaturalEarth-110m.shp
这是一种简化,通过删除一些角点,可以在基于拓扑的形状中创建对角线
-
当被问及谷歌集团时,博斯托克先生提出了一些明智的建议
-s 7e-7
。“e”代表指数,以球坐标的斯特拉迪安为单位测量7e-8
小了十倍,更详细!7e-5的细节要少一百倍--cartesian--width 960-s1
,例如,对于一个正方形像素),并使客户端上的渲染速度非常快,因为TopoJSON已经投影
演示
两个和另一个是这样的:
# projected (giving node extra memory since input shapefile is big)
us-albers.json: County_2010Census_DP1.shp
node --max_old_space_size=8192 node_modules/.bin/topojson \
-q 1e5 \
-s 1 \
--projection 'd3.geo.albersUsa()' \
--id-property=GEOID10 \
-p name=NAMELSAD10,pop=+DP0010001 \
-o $@ \
-- counties=County_2010Census_DP1.shp
# non-projected (not used by this example, but included for reference)
topojson --max_old_space_size=8192 \
-q 1e6 \
-s 7e-5 \
-o world-110m.json \
-- NaturalEarth-110m.shp
#USA
topojson \
-q 1e5 \
-s 7e-7 \
--id-property=GEOID10 \
-p name=NAMELSAD10,pop=+DP0010001 \
-o $@ \
-- counties=County_2010Census_DP1.shp
对于未投影,当映射区域的尺寸变小10倍(即内华达州)时,7e-7
应移到更小的值,如7e-8
笛卡尔
您可能希望减少量化参数。。。试试1e8,看看它是否有帮助,很明显,你的TopoJSON文件越详细,你的文件就越大。1e8会增加量化并生成一个超大文件。我对此一无所知,但你不是在寻找-s或--simplify比例参数吗?提高量化因子,然后使用——简化比例,在保持可感知细节的同时,将文件大小降低到您想要的大小。谢谢,伊桑,讨论得很好。这确实接近我目前的计划。我不确定增加
-q
然后做大量的-s
或-简化比例
是好的,因为简化算法会增加失真。需要一张最终的1200px的地图,我目前正在进行刚好高于我需要的量化以及一些小的简化,比如-q1e4-s
。