Документация Engee

Значения по умолчанию

В SF множество функций, но большинство применяются только к одному типу геометрических объектов. Особое положение занимают ngeom и getgeom, которые для каждого типа геометрических объектов автоматически преобразуются в следующие функции:

ngeom getgeom

AbstractPointTrait

-

-

AbstractCurveTrait, MultiPointTrait

npoint(geom)

getpoint(geom)

AbstractPolygonTrait

nring(geom)

getring(geom)

AbstractMultiLineStringTrait

nlinestring(geom)

getlinestring(geom)

AbstractMultiPolygonTrait

npolygon(geom)

getpolygon(geom)

AbstractPolyhedralSurfaceTrait

npatch(geom)

getpatch(geom)

AbstractGeometryCollectionTrait

ngeom(geom)

getgeom(geom)

Многоугольники

Заслуживают внимания объекты PolygonTrait: они могут иметь отверстия, для которых автоматически добавляются следующие функции в зависимости от функции ngeom, реализованной авторами пакета. В некоторых случаях это допущение неверно (наиболее яркий пример — Shapefile): второе кольцо необязательно является отверстием, а может быть еще одной внешней частью.

getexterior(p::AbstractPolygonTrait, geom) = getring(p, geom, 1)
nhole(p::AbstractPolygonTrait, geom) = nring(p, geom) - 1
gethole(p::AbstractPolygonTrait, geom, i) = getring(p, geom, i + 1)

Ломаные линии

Так же как для LineStringTrait, имеются следующие функции.

startpoint(geom) = getpoint(geom, 1)
endpoint(geom) = getpoint(geom, length(geom))

Резервные варианты

В некоторых случаях возвращаемое значение функции для определенного (под)типа геометрических объектов известно заранее: такие значения уже реализованы.

npoint(::LineTrait, geom) = 2
npoint(::TriangleTrait, geom) = 3
npoint(::RectangleTrait, geom) = 4
npoint(::QuadTrait, geom) = 4
npoint(::PentagonTrait, geom) = 5
npoint(::HexagonTrait, geom) = 6

Реализации

GeoInterface реализован для кортежей NTuple, кортежей NamedTuple и векторов AbstractVector, которые должны выступать в роли точек. Имейте в виду, что eltype всегда должен быть Real. Для кортежей NamedTuple поддерживаются только ключи X, Y, Z и M.

a = [1, 2, 3]
GeoInterface.x(a) == 1

b = (1, 2, 3)
GeoInterface.y(b) == 2

c = (;X=1, Y=2, Z=3)
GeoInterface.z(c) == 3

Типы-оболочки

Зачастую в том или ином пакете реализованы не все объекты, поддерживаемые GeoInterface.jl, и может отсутствовать возможность реализации признаков. Полезно определить универсальные объекты, которые можно использовать при тестировании и для написания скриптов, создающих геометрические объекты из компонентов. Использование универсальных оболочек означает отсутствие зависимости от бэкенда: один и тот же код будет работать независимо от источника геометрических объектов (GeoJSON.jl, Shapefile.jl, LibGEOS.jl или другие пакеты, в которых определены типажи GeoInterface.jl).

Типы-оболочки позволяют создавать геометрические объекты из любых низкоуровневых компонентов, реализующих типажи GeoInterface.jl. Они могут служить оболочками для объектов одного типажа (например, для добавления данных области), векторов дочерних объектов или вложенных векторов низкоуровневых дочерних объектов, таких как точки.

Например, можно создать многоугольник на основе любых геометрических объектов, совместимых с GeoInterface.jl, которые возвращают LinearRingTrait из GeoInterface.geomtrait:

poly = Polygon([interior, hole1, hole2])

Дополнительные сведения см. в документации по API для каждой оболочки.

  • Point

  • Line

  • LineString

  • LinearRing

  • Polygon

  • MultiLineString

  • MultiPolygon

  • MultiPoint

  • PolyhedralSurface

  • GeometryCollection

Оболочки для треугольника, шестиугольника и некоторых других геометрических объектов еще предстоит реализовать. Если они вам нужны, откройте проблему на GitHub.

Кроме того, доступны оболочки Feature и FeatureCollection для добавления свойств, эталонной системы координат и областей к любым совместимым с GeoInterface.jl геометрическим объектам.

  • Feature

  • FeatureCollection

По умолчанию оболочки не экспортируются, так как они имеют очень распространенные имена, используемые в других пакетах. Чтобы использовать их напрямую, выполните команду using GeoInterface.Wrappers.