SimplifySelectionGeometry method (Layer)

Сокращает чило вершин полигонов и полилиний выделенных объектов слоя при помощи алгоритма Рамера — Дугласа — Пекера

Применяется к:

Layer

Синтаксис:

Visual Basic:

Function SimplifySelectionGeometry(Tolerance As Double) As Long

Tolerance - допуск в см, параметр алгоритма

Описание:

Упрощаются объекты, набранные в выделение слоя (Selection). Допуск - это наибольшее расстояние, на которое упрощенная линия может отойти от исходной: вершины, отклоняющиеся меньше чем на Tolerance, выбрасываются.

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

Метод возвращает 0 и при упрощении, и при пустом выделении, поэтому судить о результате нужно по числу вершин - NumTops у PolyLine объекта.

Пример:

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

Visual Basic:

Sub Layer_SimplifySelectionGeometry
'Берем активный слой карты
Set L = Zulu.ActiveMapDoc.Layers.Active
Set R = L.GetBoundsRectangle
nBefore = L.GetLargestID
'Своя ломаная из 21 вершины с отклонениями в 2 см
Set PL = CreateObject("ZuluLib.PolyLine")
For i = 0 To 20
  PL.AddPoint R.Xmax + 100 + i * 10, R.Ymin + (i Mod 2) * 2
Next
Key = L.AddPolyLine(PL, CreateObject("ZuluLib.ElemStyle"), 6, 1)
S = "Вершин было: " & L.Elements.Item(Key).PolyLine.NumTops
'Упрощаем с допуском 5 см
L.Selection.Clear
L.Selection.AddElem Key
L.SimplifySelectionGeometry 5
S = S & vbCrLf & "стало: " & L.Elements.Item(Key).PolyLine.NumTops
'Убираем за собой все, что добавили
L.Selection.Clear
Set Keys = L.ElementKeys
For i = Keys.Count To 1 Step -1
  If Keys.Item(i) > nBefore Then L.DeleteElement Keys.Item(i)
Next
MsgBox S
End Sub

Python:

import zulu

def Macro_Layer_SimplifySelectionGeometry():
    # Берем активный слой карты
    L = zulu.App.ActiveMapDoc.Layers.Active
    R = L.GetBoundsRectangle()
    n_before = L.GetLargestID()
    # Своя ломаная из 21 вершины с отклонениями в 2 см
    pl = zulu.PolyLine()
    for i in range(21):
        pl.AddPoint(R.Xmax + 100 + i * 10, R.Ymin + (i % 2) * 2)
    key = L.AddPolyLine(pl, zulu.ElemStyle(), 6, 1)
    print("Вершин было:", L.Elements.Item(key).PolyLine.NumTops)
    # Упрощаем с допуском 5 см
    L.Selection.Clear()
    L.Selection.AddElem(key)
    L.SimplifySelectionGeometry(5)
    print("стало:", L.Elements.Item(key).PolyLine.NumTops)
    # Убираем за собой все, что добавили
    L.Selection.Clear()
    keys = L.ElementKeys
    for i in range(keys.Count, 0, -1):
        if keys.Item(i) > n_before:
            L.DeleteElement(keys.Item(i))