SaveToGridLayer method (IReliefLayer)

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

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

IReliefLayer

Синтаксис:

Visual Basic:

Function SaveToGridLayer(Path As String, UserName As String, Step As Double, BaseX As Double, BaseY As Double, inCRS As CRS, nFlags As Long, vSrc As Variant) As Boolean

Path - имя слоя для записи.

UserName - пользовательское название слоя для записи.

Step - шаг сетки. Должен быть больше нуля.

BaseX, BaseY - опорная точка, от которой строится сетка.

inCRS - система координат, в которой заданы шаг и опорная точка.

nFlags - флаги, складываются:

1 - не создавать семантическую таблицу, а записать номера соседних ячеек и высоты в двоичный файл

1024 - создать описатель слоя

vSrc - с флагом 1 полный путь двоичного файла, иначе имя источника данных для таблицы.

Описание:

Каждая ячейка сетки становится отдельным площадным объектом нового слоя (графический тип eGraphTypePrimSquare из eElemGraphType). Ячейки создаются только там, где рельеф определён: сетка нумеруется по полному прямоугольнику, но ячейки за границей триангуляции в слой не попадают. Поэтому номера в таблице идут с пропусками.

Вместе со слоем создаётся семантическая таблица со столбцами Sys, Z, Ngb1Ngb4: высота ячейки и номера четырёх соседних ячеек. Номера ссылаются на Sys той же таблицы и взаимны; -1 означает, что с этой стороны соседа нет. У метода SaveToLayer признак отсутствия соседа другой — 0.

Step задаётся в единицах системы координат inCRS и обязан быть больше нуля. Шаг крупнее габаритов слоя допустим — сетка тогда сводится к нескольким ячейкам.

При недоступном пути метод возвращает False.

Флаг 1 отменяет создание семантической таблицы: вместо неё создаётся двоичный файл, полный путь которого задаётся в vSrc. Путь должен быть полным — при относительном имени файл не создаётся, хотя метод возвращает True. В файле лежат записи по 20 байт, по одной на ячейку и в том же порядке, что и строки таблицы: четыре четырёхбайтовых целых — номера соседних ячеек, затем четырёхбайтовое число с плавающей точкой — высота.

Флаг 1024 добавляет к слою файл-описатель с расширением zl. Флаги складываются: 1025 и описатель создаёт, и таблицу отменяет.

Без флага 1 аргумент vSrc задаёт источник данных для таблицы. Имя источника начинается со знака доллара: $sqlite, $msaccess, $localdb. Пустая строка равнозначна $sqlite: таблица ложится в файл с расширением sqlite рядом со слоем, а $msaccess создаёт вместо него базу Microsoft Access с расширением mdb.

Есть ещё имя $local — оно относится к локальным таблицам Paradox и оставлено только для совместимости со старыми версиями. В 64-разрядной программе оно не работает, а в 32-разрядной требует установленного BDE.

Если источник недоступен, таблица не создаётся вовсе, а метод всё равно возвращает True. Наличие таблицы стоит проверять по самому слою.

Пример:

Visual Basic:

Sub IReliefLayer_SaveToGridLayer
'Слой рельефа из примеров поставки
Set L = CreateObject("ZuluLib.Layer")
L.Open "C:\Program Files\ZuluGIS\Examples\Thermo\Kvartal\relief.ztr"
Set R = L.ReliefLayer
'Опорную точку берем в левом нижнем углу слоя, шаг - 20 единиц
Set rc = L.GetBoundsRectangle
If R.SaveToGridLayer("C:\Data\grid", "Сетка высот", 20.0, rc.Xmin, rc.Ymin, L.GetCRS, 0, "") Then
  Set G = CreateObject("ZuluLib.Layer")
  G.Open "C:\Data\grid"
  'Обход завершается по Key = -1, коллекция никогда не отдает Nothing
  Set els = G.Elements
  Set e = els.FirstItem
  n = 0
  Do While e.Key <> -1
    n = n + 1
    Set e = els.NextItem
  Loop
  MsgBox "Ячеек в сетке: " & n
Else
  MsgBox "Слой создать не удалось"
End If
End Sub

Python:

import zulu

def Macro_IReliefLayer_SaveToGridLayer():
    # Слой рельефа из примеров поставки
    L = zulu.Layer()
    L.Open(r"C:\Program Files\ZuluGIS\Examples\Thermo\Kvartal\relief.ztr")
    R = L.ReliefLayer
    # Опорную точку берем в левом нижнем углу слоя, шаг - 20 единиц
    rc = L.GetBoundsRectangle()
    if R.SaveToGridLayer(r"C:\Data\grid", "Сетка высот", 20.0,
                         rc.Xmin, rc.Ymin, L.GetCRS(), 0, ""):
        G = zulu.Layer()
        G.Open(r"C:\Data\grid")
        # Обход завершается по Key = -1, коллекция никогда не отдает None
        els = G.Elements
        e = els.FirstItem
        n = 0
        while e.Key != -1:
            n += 1
            e = els.NextItem
        print("Ячеек в сетке:", n)
    else:
        print("Слой создать не удалось")