Создает по слою рельефа векторный слой с регулярной сеткой ячеек, в которых записаны высоты.
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, Ngb1 … Ngb4: высота ячейки и номера четырёх соседних ячеек. Номера ссылаются на 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 SubPython:
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("Слой создать не удалось")