Compartilhar via


geo_line_to_s2cells()

Aplica-se a: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft Sentinel

Calcula tokens de célula S2 que cobrem uma linha ou multilinha na Terra. Essa função é uma ferramenta de junção geoespacial útil.

Leia mais sobre a hierarquia de células S2.

Sintaxe

geo_line_to_s2cells(linhaString [, nível[ , raio]])

Saiba mais sobre as convenções de sintaxe.

Parâmetros

Nome Digitar Obrigatória Descrição
linhaString dynamic ✔️ Linha ou multilinha no formato GeoJSON.
level int Define o nível de célula solicitado. Os valores suportados estão no intervalo [0, 30]. Se não for especificado, o valor padrão 11 será usado.
raio real Raio do buffer em metros. Se não for especificado, o valor padrão 0 será usado.

Devoluções

Matriz de cadeias de caracteres de token de célula S2 que cobrem uma linha ou uma multilinha. Se o raio for definido como um valor positivo, a cobertura terá a forma de entrada e todos os pontos dentro do raio da geometria de entrada.

Se qualquer um dos seguintes: linha, nível, raio for inválido ou a contagem de células exceder o limite, a consulta produzirá um resultado nulo.

Observação

  • Cobrir a linha com tokens de célula S2 pode ser útil para combinar coordenadas com linhas, encontrando assim pontos próximos às linhas.
  • Os tokens de cobertura de linha são do mesmo nível de célula S2.
  • A contagem máxima de tokens por linha é 65536.
  • O dado geodésico usado para medir a distância na Terra é uma esfera. As arestas de linha são geodésicas na esfera.
  • Se as arestas da linha de entrada forem retas cartesianas, considere usar geo_line_densify() para converter arestas planas em geodésicas.

Escolhendo o nível da célula S2

  • Idealmente, gostaríamos de cobrir cada linha com uma ou apenas algumas células únicas, de modo que duas linhas não compartilhem a mesma célula.
  • Na prática, tente cobrir com apenas algumas células, não mais do que uma dúzia. A cobertura com mais de 10.000 células pode não produzir um bom desempenho.
  • O tempo de execução da consulta e o consumo de memória podem diferir muito devido a diferentes valores de nível de célula S2.

Sugestões de melhoria de desempenho

  • Se possível, reduza o tamanho da tabela de coordenadas antes de unir, agrupando coordenadas muito próximas umas das outras usando clustering geoespacial ou filtrando coordenadas desnecessárias devido à natureza dos dados ou às necessidades de negócios.
  • Se possível, reduza a contagem de linhas devido à natureza dos dados ou às necessidades de negócios. Filtre linhas desnecessárias antes de unir, defina o escopo para a área de interesse ou unifique linhas.
  • No caso de linhas muito grandes, reduza seu tamanho usando geo_line_simplify().
  • Alterar o nível da célula S2 pode melhorar o desempenho e o consumo de memória.
  • Alterar o tipo de junção e a dica pode melhorar o desempenho e o consumo de memória.
  • Caso o raio positivo seja definido, reverter para o raio 0 na forma em buffer usando geo_line_buffer() pode melhorar o desempenho.

Exemplos

A consulta a seguir localiza todas as estações de metrô dentro de 500 metros de ruas e agrega a contagem de tubos pelo nome da rua.

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
Palácio de Buckingham 1
Ponte de Londres 1

Em caso de linha inválida, um resultado nulo será retornado.

let line = dynamic({"type":"LineString","coordinates":[[[0,0],[0,0]]]});
print isnull(geo_line_to_s2cells(line))
print_0
Verdadeiro