Возвращает площадь поверхности рельефа внутри заданного полигона.
Visual Basic:
Function GetSurfaceArea(Region As Contour, inCRS As CRS) As Double
Region - полигон в координатах слоя.
inCRS - система координат.
Полигон задаётся объектом Contour и обязан быть в координатах слоя рельефа. Замыкать его отдельной точкой не нужно: контур из четырёх вершин задаёт четырёхугольник.
Площадь возвращается в квадратных метрах и считается по поверхности эллипсоида, а не в плоскости проекции. У объекта Contour свойство Square, наоборот, даёт плоскую площадь и измеряет её в гектарах. Поэтому два числа расходятся дважды: единицами — гектары надо умножить на 10000 — и способом расчёта, из-за которого площадь по эллипсоиду выходит немного меньше проекционной.
Считается только та часть полигона, которая накрыта треугольниками. Для полигона целиком за пределами рельефа метод возвращает 0, для контура меньше чем из трёх вершин — тоже 0, без ошибки. На слое размером 366 на 402 метра у квадрата со стороной 200 метров результат составляет 0,998 плоской площади — это и есть расхождение расчёта по эллипсоиду, — а у квадрата со стороной 300 метров уже 0,846, потому что его углы выходят за границу триангуляции.
Параметр inCRS не используется: если оставить контур в координатах слоя, а вторым аргументом передать постороннюю систему координат, результат не меняется; если же пересчитать контур в эту систему, метод возвращает 0. Опустить аргумент нельзя — следует передавать систему координат самого слоя, её даёт метод GetCRS объекта Layer.
Вызов QuickAccessStart на результат не влияет.
Visual Basic:
Sub IReliefLayer_GetSurfaceArea 'Слой рельефа из примеров поставки Set L = CreateObject("ZuluLib.Layer") L.Open "C:\Program Files\ZuluGIS\Examples\Thermo\Kvartal\relief.ztr" Set R = L.ReliefLayer 'Квадрат 100 x 100 в центре слоя, координаты - в системе слоя Set rc = L.GetBoundsRectangle cx = (rc.Xmin + rc.Xmax) / 2 cy = (rc.Ymin + rc.Ymax) / 2 Set c = CreateObject("ZuluLib.Contour") c.AddPoint cx - 50, cy - 50 c.AddPoint cx + 50, cy - 50 c.AddPoint cx + 50, cy + 50 c.AddPoint cx - 50, cy + 50 'Square возвращает гектары, поэтому для сравнения переводим в квадратные метры MsgBox "Площадь поверхности: " & R.GetSurfaceArea(c, L.GetCRS) & " кв.м" & vbCrLf & _ "Плоская площадь: " & c.Square * 10000 & " кв.м" End SubPython:
import zulu def Macro_IReliefLayer_GetSurfaceArea(): # Слой рельефа из примеров поставки L = zulu.Layer() L.Open(r"C:\Program Files\ZuluGIS\Examples\Thermo\Kvartal\relief.ztr") R = L.ReliefLayer # Квадрат 100 x 100 в центре слоя, координаты - в системе слоя rc = L.GetBoundsRectangle() cx = (rc.Xmin + rc.Xmax) / 2.0 cy = (rc.Ymin + rc.Ymax) / 2.0 c = zulu.Contour() for x, y in ((cx - 50, cy - 50), (cx + 50, cy - 50), (cx + 50, cy + 50), (cx - 50, cy + 50)): c.AddPoint(x, y) # Square возвращает гектары, поэтому для сравнения переводим в квадратные метры print("Площадь поверхности:", R.GetSurfaceArea(c, L.GetCRS()), "кв.м") print("Плоская площадь:", c.Square * 10000, "кв.м")