Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Вычисляет маркеры ячейки S2, охватывающие линию или многострочный на Земле. Эта функция является полезным инструментом геопространственного соединения.
Дополнительные сведения об иерархии ячеек S2.
Синтаксис
geo_line_to_s2cells(
lineString [,
level[ ,
radius]])
Дополнительные сведения о соглашениях синтаксиса.
Параметры
Имя (название) | Тип | Обязательно | Описание |
---|---|---|---|
lineString | dynamic |
✔️ | Строка или многострочный формат GeoJSON. |
уровень | 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
имя | подсчет |
---|---|
Букингемский дворец | 1 |
Лондонский мост | 1 |
В случае недопустимой строки возвращается результат NULL.
let line = dynamic({"type":"LineString","coordinates":[[[0,0],[0,0]]]});
print isnull(geo_line_to_s2cells(line))
print_0 |
---|
Истина |