Хрустящие края с топойсоном?

Майк Босток поделился рядом файлов топожсона со всего мира.

Поскольку мне нужно было больше данных и более высокого качества, я теперь создаю свои собственные высококачественные файлы топожсона из Natural Earth. Для простоты мой makefile/command такой:

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

Но мой 3 МБ .topojson хрустящий, противный, графически грязный. Взгляните на береговую линию, вы увидите самое неприятное: линии, похожие на «лестницы»: горизонтальные, вертикальные, горизонтальные, вертикальные,...

введите здесь описание изображения

Со своей стороны, 90kb .topojson М. Бостока удивительно хорошо работает в срок элегантности. Не идеально, но приятно, и у него есть диагонали (!) и различные углы, используемые его линиями.

введите здесь описание изображения

Пробовал уменьшать квантование до -q 1e3, но держится хрустяще, и это еще более некрасиво: ступени лестницы еще больше.

Из API командной строки я заметил и прочитал столько же, может на:

  • -q, --quantization, --no-квантование максимальное количество дифференцируемых точек по любому измерению
  • -s, --simplify порог точности для упрощения Висвалингама
  • --simplify-пропорциональная пропорция баллов, которую нужно сохранить для упрощения Висвалингама
  • --width масштабировать и переводить, чтобы соответствовать области просмотра указанной ширины
  • --height масштабировать и переводить, чтобы соответствовать области просмотра указанной высоты

что может мне все помочь. Я сделал несколько тестов, чтобы в основном узнать, что упрощение балансировки сложно. Я хотел бы спросить у опытных пользователей, как тогда справиться и сбалансировать их упрощение topojson.

Какой подход вы используете для себя? и так... Какие параметры топойсона я должен использовать, чтобы сделать мой топожсон красивее? (без четких краев ступенек, правильная верность формы)


person Hugolpz    schedule 11.02.2015    source источник
comment
вы, вероятно, хотите уменьшить параметр квантования ... попробуйте 1e8 и посмотрите, поможет ли это, очевидно, чем больше у вас деталей, тем больше ваш файл TopoJSON.   -  person Ben Lyall    schedule 11.02.2015
comment
1e8 увеличит квантование и приведет к очень большому файлу.   -  person Hugolpz    schedule 11.02.2015
comment
Ничего не знаю об этом, но разве вы не ищете параметры -s или --simplify-proportion? Увеличьте коэффициент квантования, а затем используйте --simplify-proportion, чтобы уменьшить размер файла до желаемого, сохраняя при этом заметные детали. Довольно хорошо обсуждается на github.com/mbostock/topojson/wiki/   -  person Ethan Jewett    schedule 11.02.2015
comment
Спасибо, Итан. Это действительно близко к тому, что я сейчас планирую делать. Я не уверен, что увеличивать -q, а затем делать массивные -s или --simplify-proportion хорошо, поскольку алгоритмы упрощения добавляют искажения. Нужна окончательная карта размером 1200 пикселей, и в настоящее время я собираюсь провести количественную оценку чуть выше моей потребности вместе с небольшим упрощением, что-то вроде -q 1e4 -s <something small>.   -  person Hugolpz    schedule 12.02.2015


Ответы (1)


-q VS -s

Подробнее о Topojson: квантование VS упрощение .

Общий размер вашей геометрии зависит от двух факторов: количество цифр (точность) каждой координаты и количество точек.

Квантование -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 цифр. Во-вторых, quatization делает геоточки, которые были разными во входном шейп-файле, теперь имеют одни и те же координаты, такие как [24,62],[24,62],[24,62]…. Эти дубликаты объединены. Конечным результатом являются формы, определяемые точками на сетке. Если вы используете ТОЛЬКО квантование, ваши фигуры будут состоять из вертикальных и горизонтальных линий от точки сетки до точки сетки.

Напротив, упрощение удаляет информацию, удаляя баллы. Метод Visvalingam, используемый TopoJSON, удаляет наименее заметные точки, принцип остроумно проиллюстрирован в статье Line Simplification. . Чтобы деликатно удалить много тонких треугольников, сначала используйте более высокое квантование, а затем упрощение:

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

Это упрощение, которое путем удаления некоторых угловых точек создает линии диагоналей в формах на основе топожсона.

-s

На вопрос в группе Google М. Босток предложил несколько умных советов.

  1. Для США используйте -s 7e-7. e обозначает показатель степени, измеряемый в стерадианах для сферических координат. 7e-8 в десять раз меньше, а это намного больше деталей! 7е-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

При непроецировании, поскольку размеры вашей нанесенной на карту области становятся в 10 раз меньше (например, Невада), 7e-7 должно двигаться к меньшим значениям, таким как 7e-8.

декартовский

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

person Hugolpz    schedule 26.02.2015