D3.js 酥脆的边缘,还有什么?

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

Mike Bostock共享了一系列全球范围的topojson文件

由于我需要更多的数据和更高的质量,我现在从自然地球生成自己的高质量topojson文件。为了简单起见,我的makefile/命令如下:

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简化保留的点的比例
  • --宽度缩放和平移以适合指定宽度的视口
  • --高度缩放和平移以适合指定高度的视口
这可能对我有帮助。我做了一些测试,主要是为了了解这一点。我想问有经验的用户如何处理和平衡他们的拓扑结构

你自己采取什么方法?所以。。。 我应该使用哪些topojson参数来使我的topojson更漂亮?(没有脆脆的楼梯台阶边缘,形状正确)

-q VS-s 有关的更多详细信息

几何体的总大小由两个因素控制:几何体的大小 每个坐标的位数(精度)数字 点的数量

量化
-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的细节要少一百倍
  • 最近,我已经开始预投影TopoJSON。这允许您以屏幕像素为单位指定直观的简化阈值(
    --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