Compartir a través de


geo_line_to_s2cells()

Se aplica a: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft 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

Nombre Type Obligatorio Descripción
lineString dynamic ✔️ Línea o multilínea en formato GeoJSON.
level int Define el nivel de celda solicitado. Los valores admitidos están en el intervalo [0, 30]. Si no se especifica, se usa el valor predeterminado 11.
radio real Radio de búfer en metros. Si no se especifica, se usa el valor predeterminado 0.

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