Как разумно ухудшить или сглаживать данные GIS (упрощение полигонов)?

Если Вы пишете VM в C, оказывается что использование вычисленного gotos (gcc) как это:

char run(char *pc) {
    void *opcodes[3] = {&&op_inc, &&op_lda_direct, &&op_hlt};
    #define NEXT_INSTR(stride) goto *(opcodes[*(pc += stride)])
    NEXT_INSTR(0);
    op_inc:
    ++acc;
    NEXT_INSTR(1);
    op_lda_direct:
    acc = ram[++pc];
    NEXT_INSTR(1);
    op_hlt:
    return acc;
}

работы намного быстрее, чем стандартный переключатель в цикле.

49
задан ire_and_curses 4 December 2009 в 12:59
поделиться

3 ответа

Проблема с простым отбрасыванием точек состоит в том, что вы можете быстро исказить форму исходного многоугольника. Лучше подойти к этому с другой стороны; начните с базовой аппроксимации многоугольника, а затем уточните его вверх до вашей сложной формы.

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

30
ответ дан 7 November 2019 в 11:25
поделиться

Дуглас-Пойкер определенно правильный подход. Есть несколько простых способов получить доступ к его реализациям в PostGIS и QGIS, и я подумал, что добавлю сюда для тех, кто сталкивается с этим сообщением с похожим вопросом. Цель состоит в том, чтобы начать с чего-то вроде этого:

alt text

и получить что-то вроде этого:

alt text

В PostGIS Дуглас-Пекер реализован как simpleify , синтаксис, подробно описанный здесь, на bostongis. .org - это некий вариант:

SELECT transform (упрощение (transform (the_geom, 2249), 500), 4326) из the_geo_table

Это работало очень хорошо даже с полным национальным набором данных, с некоторыми ошибки, которые кажутся из-за плохих исходных данных. Также оказывается, что в QGIS пункт меню Инструменты> Инструменты геометрии>

62
ответ дан 7 November 2019 в 11:25
поделиться

Вот простой итеративный алгоритм сглаживания:

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

Повторяйте до тех пор, пока не получите желаемое.

8
ответ дан 7 November 2019 в 11:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: