Compartir a través de


geo_line_to_s2cells()

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.

Syntax

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

Obtenga más información sobre las convenciones de sintaxis.

Parámetros

Nombre Tipo Requerido 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 varias líneas. 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 alguna de las siguientes opciones: línea, nivel, radio no es válida 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 para buscar coordenadas coincidentes 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 recuento máximo de tokens por línea es 65536.
  • La referencia geodética utilizada para medir la distancia en la Tierra es una esfera. Los bordes de línea son geodesics en la esfera.
  • Si los bordes de la línea de entrada son líneas cartesianas rectas, considere la posibilidad de usar geo_line_densify() para convertir bordes planores 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 no haya dos líneas que compartan la misma celda.
  • En la práctica, trate de cubrir con solo unas pocas celdas, no más de una docena. Cubrir con más de 10.000 celdas podría no producir 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 la combinación mediante la agrupación de coordenadas muy cercanas entre sí mediante la agrupación en clústeres geoespaciales o mediante el filtrado de 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 unir, ámbito al área de interés o unificar 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 la forma almacenada en búfer mediante geo_line_buffer() puede mejorar el rendimiento.

Ejemplos

La siguiente consulta busca todas las estaciones de tubo en 500 metros de calles y los tubos agregados cuentan 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
name count
Palacio de Palace 1
London Bridge 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