Сопоставление с D3: ошибка обрезки объектов в моем вращающемся глобусе

Я использую D3 для создания карты мира с орфографической проекцией, которую пользователь может «вращать» с помощью мыши, как глобус.

Я столкнулся с некоторыми проблемами с дрожащим рендерингом в Firefox, поэтому я упростил свои функции карты, используя реализацию алгоритма Дугласа-Пейкера в R. Я выгрузил это в geoJSON и отрисовал его с помощью D3, как в этом примере: http://jsfiddle.net/cmksA/8/. (Обратите внимание, что проблема, которую я описываю ниже, не возникает с неупрощенными функциями, но Firefox непригоден для использования, если я не упрощаю.)

Производительность в Firefox по-прежнему низкая (улучшается), но появилась новая проблема. Когда вы поворачиваете земной шар так, что Индонезия находится примерно в центре земного шара, один из полигонов трансформируется, чтобы покрыть весь земной шар. Та же проблема возникает, когда Северная и Южная Америка находятся в центре.

В рамках панорамирования я повторно проецирую/перерисовываю глобус, используя следующую функцию (строка 287 jsfiddle):

function panglobe(){
    var x=d3.event.dx;
    var y=d3.event.dy;
    var r = mapProj.rotate();
    r[0] = r[0]+lonScale(x)
    r[1] = r[1]+latScale(y)
    mapProj.rotate(r);
    countries.attr("d",function(d){
        var dee=mapPath(d)
        return dee ? dee : "M0,0";
    });

}

Любая помощь/проницательность/советы будут высоко оценены. Ваше здоровье


person Al R.    schedule 06.06.2013    source источник


Ответы (1)


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

Вполне возможно, что ваши упрощенные полигоны содержат некоторые самопересечения, например. сегмент, который восходит сам к себе. Это может вызвать проблемы для D3, например. при сортировке пересечений вдоль края области отсечения (хотя в будущих выпусках я надеюсь также поддерживать самопересекающиеся полигоны).

Лучше использовать алгоритм Висвалингама–Уайатта, например как используется TopoJSON, поскольку он упрощается в зависимости от области. Однако он также может создавать самопересекающиеся многоугольники, хотя, возможно, реже, чем метод Дугласа-Пекера.

Для интерактивных глобусов я бы рекомендовал world-110m.json из world-atlas Майка Бостока.

person Jason Davies    schedule 07.06.2013
comment
Большое спасибо за эту информацию. Очень полезный материал. - person Al R.; 07.06.2013