Поделиться через


geo_line_to_s2cells()

Область применения: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

Вычисляет маркеры ячейки S2, охватывающие линию или многострочный на Земле. Эта функция является полезным инструментом геопространственного соединения.

Дополнительные сведения об иерархии ячеек S2.

Синтаксис

geo_line_to_s2cells(lineString [, level[ , radius]])

Дополнительные сведения о соглашениях синтаксиса.

Параметры

Имя (название) Type Обязательно Описание
lineString dynamic ✔️ Строка или многострочный формат GeoJSON.
level int Определяет запрошенный уровень ячейки. Поддерживаемые значения находятся в диапазоне [0, 30]. Если не задано, по умолчанию используется значение 11.
радиус real Радиус буфера в метрах. Если не задано, по умолчанию используется значение 0.

Возвраты

Массив строк маркеров ячейки S2, охватывающих линию или многострочный. Если радиус имеет положительное значение, покрытие будет иметь как входную фигуру, так и все точки в радиусе входной геометрии.

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

Примечание.

  • Покрытие линии с маркерами ячейки S2 может быть полезно в сопоставлении координат с линиями, таким образом, поиск точек рядом с линиями.
  • Маркеры покрытия строк имеют одинаковый уровень ячейки S2.
  • Максимальное количество маркеров на строку составляет 65536.
  • Геостатический datum , используемый для измерения расстояния на Земле является сферой. Границы линии — геодесик на сфере.
  • Если границы линии ввода являются прямыми декартовыми линиями, рассмотрите возможность использования geo_line_densify() для преобразования планарных ребер в геодесетики.

Выбор уровня ячейки S2

  • В идеале мы хотели бы покрыть каждую строку одной или несколькими уникальными ячейками, так что две линии не используют одну и ту же ячейку.
  • На практике попробуйте покрыть всего несколько ячеек, не более десятка. Покрытие с более чем 10000 ячеек может не обеспечить хорошую производительность.
  • Время выполнения запросов и потребление памяти может значительно отличаться из-за разных значений уровня ячейки S2.

Предложения по улучшению производительности

  • Если это возможно, уменьшите размер таблицы перед присоединением, группируя координаты, которые очень близки друг к другу с помощью геопространственной кластеризации или путем фильтрации ненужных координат из-за характера данных или бизнес-потребностей.
  • По возможности уменьшите количество строк из-за характера данных или бизнес-потребностей. Отфильтруйте ненужные строки перед присоединением, областью интересующей области или объединяйте строки.
  • В случае очень больших строк уменьшите их размер с помощью geo_line_simplify().
  • Изменение уровня ячейки S2 может повысить производительность и потребление памяти.
  • Изменение типа соединения и намек может повысить производительность и потребление памяти.
  • Если задан положительный радиус, возврат к радиусу 0 в буферизованной фигуре с помощью geo_line_buffer() может повысить производительность.

Примеры

Следующий запрос находит все станции метро в пределах 500 метров от улиц и агрегирует трубки по имени улицы.

let radius = 500;
let tube_stations = datatable(tube_station_name:string, lng:real, lat: real)
[
    "St. James' Park",        -0.13451078568013486, 51.49919145858172,
     "London Bridge station", -0.08492752160134387, 51.504876316440914,
     // more points
];
let streets = datatable(street_name:string, line:dynamic)
[
    "Buckingham Palace", dynamic({"type":"LineString","coordinates":[[-0.1399656708283601,51.50190802248855],[-0.14088438832752104,51.50012082761452]]}),
    "London Bridge",    dynamic({"type":"LineString","coordinates":[[-0.087152,51.509596],[-0.088340,51.506110]]}),
    // more lines
];
let join_level = 14;
let lines = materialize(streets | extend id = new_guid());
let res = 
    lines
    | project id, covering = geo_line_to_s2cells(line, join_level, radius)
    | mv-expand covering to typeof(string)
    | join kind=inner hint.strategy=broadcast
    (
        tube_stations
        | extend covering = geo_point_to_s2cell(lng, lat, join_level)
    ) on covering;
res | lookup lines on id
| where geo_distance_point_to_line(lng, lat, line) <= radius
| summarize count = count() by name = street_name
name count
Букингемский дворец 1
Лондонский мост 1

В случае недопустимой строки возвращается результат NULL.

let line = dynamic({"type":"LineString","coordinates":[[[0,0],[0,0]]]});
print isnull(geo_line_to_s2cells(line))
print_0
Истина