geo_line_to_s2cells()
Se aplica a: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Calcula los tokens de celda S2 que cubren una línea o varias líneas en la Tierra. Esta función es una herramienta de combinación geoespacial útil.
Obtenga más información sobre la jerarquía de celdas S2.
Sintaxis
geo_line_to_s2cells(
lineString [,
level[ ,
radius]])
Obtenga más información sobre las convenciones de sintaxis.
Parámetros
Devoluciones
Matriz de cadenas de token de celda S2 que cubren una línea o una línea múltiple. Si el radio se establece en un valor positivo, la cubierta será de la forma de entrada y de todos los puntos dentro del radio de la geometría de entrada.
Si alguno de los siguientes: línea, nivel, radio no es válido o el número de celdas supera el límite, la consulta generará un resultado nulo.
Nota:
- Cubrir la línea con tokens de celda S2 puede ser útil en la coincidencia de coordenadas con líneas, por lo que buscar puntos líneas cercanas.
- Los tokens de cobertura de línea son del mismo nivel de celda S2.
- El número máximo de tokens por línea es 65536.
- El dato geodético utilizado para medir la distancia en la Tierra es una esfera. Los bordes de línea son geodesics en la esfera.
- Si los bordes de línea de entrada son líneas cartesianas rectas, considere la posibilidad de usar geo_line_densify() para convertir bordes planar a geodesics.
Elección del nivel de celda S2
- Idealmente, queremos cubrir todas las líneas con una o solo unas pocas celdas únicas, de modo que ninguna dos líneas compartan la misma celda.
- En la práctica, intente cubrir con solo unas pocas celdas, no más de una docena. Es posible que la cobertura con más de 10 000 celdas no produzca un buen rendimiento.
- El tiempo de ejecución de la consulta y el consumo de memoria pueden diferir considerablemente debido a distintos valores de nivel de celda S2.
Sugerencias de mejora del rendimiento
- Si es posible, reduzca el tamaño de la tabla de coordenadas antes de unirse, mediante la agrupación de coordenadas muy cercanas entre sí mediante la agrupación en clústeres geoespaciales o filtrando las coordenadas innecesarias debido a la naturaleza de los datos o las necesidades empresariales.
- Si es posible, reduzca el número de líneas debido a la naturaleza de los datos o las necesidades empresariales. Filtre las líneas innecesarias antes de unirse, ámbito al área de interés o unifique las líneas.
- En el caso de líneas muy grandes, reduzca su tamaño mediante geo_line_simplify().
- Cambiar el nivel de celda S2 puede mejorar el rendimiento y el consumo de memoria.
- Cambiar el tipo de combinación y la sugerencia puede mejorar el rendimiento y el consumo de memoria.
- En caso de que se establezca un radio positivo, revertir al radio 0 en forma almacenada en búfer mediante geo_line_buffer() puede mejorar el rendimiento.
Ejemplos
La consulta siguiente busca todas las estaciones de tubo dentro de 500 metros de calles y agrega tubos recuento por nombre de calle.
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
nombre | count |
---|---|
Palacio deOvsk | 1 |
Puente de Londres | 1 |
En el caso de una línea no válida, se devolverá un resultado NULL.
let line = dynamic({"type":"LineString","coordinates":[[[0,0],[0,0]]]});
print isnull(geo_line_to_s2cells(line))
print_0 |
---|
True |