geo_line_to_s2cells()
Область применения: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft 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 |
---|
Истина |