带有 topojson 的脆边?

Crispy edges with topojson?

Mike Bostock 分享了一系列全球范围内的 topojson 文件。

因为我想要更多的数据和更高的质量,我现在从 Natural Earth 生成我自己的高质量 topojson 文件。为了简单起见,我的生成文件/命令是这样的:

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 .topojson 很脆,很脏,图形很乱。看看海岸线,你会看到最讨厌的东西:线条看起来像 "stairs" :水平,垂直,水平,垂直,...

在他这边,M. Bostock 的 90kb .topojson 在优雅方面出奇的好。不完美,但很好,他的线条确实有对角线 (!) 和各种角度。

我尝试将量化降低到-q 1e3,但它仍然很脆,而且更难看:楼梯的台阶更大。

command line API,我注意到并尽可能多地阅读了 :

这可能对我有帮助。我做了一些测试,主要学习balancing simplification is tricky。我想请教有经验的用户如何处理和平衡他们的 topojson 简化。

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

-q VS -s

有关 Topojson: quantization VS simplification 的更多详细信息。

The total size of your geometry is controlled by two factors: the number of digits (the precision) of each coordinate and the number of points.

量化-q减少了每个坐标的位数。最初,地理点具有非常高的精度,例如

…,[-90.07231180399987,29.501753271000098],[-90.06635619599979,29.499494248000133],…

量化 -q 1e4 其中 1e4=10000 创建一个 10,000×10,000 的网格,其整数值介于 0 和 9999 之间,例如 [-6700,1030]。坐标字符从 ~40 减少到 12,减少了 ~75%,最大 4 数字值。其次,量化使得在输入 shapefile 中不同的地理点现在共享相同的坐标,例如 [24,62],[24,62],[24,62]…。这些重复项被合并。最终结果是由网格上的点定义的形状。 如果您只使用量化,您的形状将由从网格点到网格点的垂直线和水平线组成。

相比之下,简化通过移除点来移除信息。 TopoJSON 使用的 Visvalingam 方法去除了最不引人注目的点,原理在 Line Simplification article 中巧妙地说明了。要精细去除许多精细三角形,首先使用更高的量化,然后进行简化:

 #world
 topojson -q 1e6 -s 7e-5 -o world-110m.json -- NaturalEarth-110m.shp

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

-s

在 google 组中询问,M. Bostock proposed 一些聪明的技巧。

  1. For the USA, use -s 7e-7. "e" stands for exponent, measured in steradians for spherical coordinates. 7e-8 is ten times smaller, which is a lot more detail! 7e-5 is one hundred times less details.

Lately, I’ve started pre-projecting the TopoJSON. This allows you to specify an intuitive simplification threshold in screen pixels (--cartesian --width 960 -s 1 for one square pixel, e.g.) and makes rendering very fast on the client since the TopoJSON is already projected.

演示

两个live use和另一个是这样的:

# 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.

笛卡尔

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