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 |
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de