topojson脆皮边缘?

Hug*_*lpz 2 maps d3.js topojson

Mike Bostock分享了一系列全球topojson文件.

由于我想要更多的数据和更高的质量,我现在从Natural Earth生成我自己的高质量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
Run Code Online (Sandbox Code Playgroud)

但我的3MB .topojson是脆的,讨厌的,图形凌乱.看看海岸线,你会看到最烦人的事情:看起来像"楼梯"的线条:水平,垂直,水平,垂直,......

在此输入图像描述

在他身边,M. Bostock的90kb .topojson在优雅方面做得非常好.不完美,但很好,他确实有对角线(!)和他的线条使用的各种角度.

在此输入图像描述

我尝试减少量化-q 1e3,但它保持松脆,而且更加难看:楼梯的台阶甚至更大.

命令行API,我注意到,读尽我所能在:

  • -q, - 量化, - 无量化沿任一维度的可微分点的最大数量
  • -s, - 简化Visvalingam简化的精度阈值
  • - 简化维持Visvalingam简化的点数比例
  • --width scale和translate以适合指定宽度的视口
  • - 高度缩放和平移以适合指定高度的视口

这可能都对我有帮助.我做了一些测试,主要是了解平衡简化是棘手的.我想请经验丰富的用户如何处理和平衡他们的topojson简化.

你自己采取什么方法?所以... 我应该使用什么topojson参数来使我的topojson更好?(没有酥脆的楼梯 - 台阶边缘,正确的忠诚形状)

Hug*_*lpz 5

-q VS -s

关于Topojson的更多细节:量化VS简化.

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

量化-q减少了每个坐标的位数.最初,地理输出具有非常高的精度

…,[-90.07231180399987,29.501753271000098],[-90.06635619599979,29.499494248000133],…
Run Code Online (Sandbox Code Playgroud)

量化-q 1e4其中1E4 = 10000 0和9999之间这样创建一个万×万格与整数值[-6700,1030].通过坐标的字符从~40减少到12,减少~75%,最多4个数值.其次,quatization使输入shapefile中不同的地理输出现在共享相同的坐标,例如[24,62],[24,62],[24,62]….这些重复项合并.最终结果是由网格上的点定义的形状.如果仅使用量化,则形状将由从网格点到网格点的垂直+水平线组成.

相反,简化通过删除点来删除信息.TopoJSON使用的Visvalingam方法消除了最不显着的点,原理在Line Simplification文章中有详细说明.为了精细地删除许多精细三角形,首先使用更高的量化,然后简化:

 #world
 topojson -q 1e6 -s 7e-5 -o world-110m.json -- NaturalEarth-110m.shp
Run Code Online (Sandbox Code Playgroud)

这是通过删除一些角点在基于topojson的形状中创建对角线的简化.

-s

在谷歌小组提问时,M.Bostock 提出了一些聪明的建议.

  1. 对于美国,请使用-s 7e-7."e"代表指数,以球面坐标测量球面坐标.7e-8小十倍,这是更详细的!7e-5的细节少了一百倍.

最近,我开始预先投影TopoJSON.这允许您在屏幕像素中指定直观的简化阈值(--cartesian --width 960 -s 1例如,对于一个方形像素),并且由于已经投影了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
Run Code Online (Sandbox Code Playgroud)

对于未投影,当您的映射区域的尺寸变小10倍(即内华达州)时,7e-7应该移动到较小的值7e-8.

笛卡尔

http://bost.ocks.org/mike/simplify/