geo_line_to_s2cells()
Calcula os tokens de célula S2 que abrangem uma linha ou várias linhas na Terra. Esta função é uma ferramenta de associação geoespacial útil.
Syntax
geo_line_to_s2cells(
lineString [,
level[ ,
radius]])
Saiba mais sobre as convenções de sintaxe.
Parâmetros
Nome | Tipo | Necessário | Descrição |
---|---|---|---|
lineString | dynamic |
✔️ | Linha ou várias linhas no formato GeoJSON. |
nível | int |
Define o nível de célula pedido. Os valores suportados estão no intervalo [0, 30]. Se não for especificado, é utilizado o valor 11 predefinido. |
|
raio | real |
Raio da memória intermédia em metros. Se não for especificado, é utilizado o valor 0 predefinido. |
Devoluções
Matriz de cadeias de token de célula S2 que abrangem uma linha ou uma linha multilinha. Se o raio estiver definido como um valor positivo, a cobertura será da forma de entrada e de todos os pontos dentro do raio da geometria de entrada.
Se uma das seguintes opções: linha, nível, raio for inválido ou a contagem de células exceder o limite, a consulta produzirá um resultado nulo.
Nota
- Cobrir a linha com tokens de célula S2 pode ser útil para combinar coordenadas com linhas, encontrando assim pontos nas linhas próximas.
- Os tokens de cobertura de linha são do mesmo nível de célula S2.
- A contagem máxima de tokens por linha é de 65536.
- O datum geodético 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 linhas cartesianas retas, considere utilizar geo_line_densify() para converter arestas planares em geodésico.
Escolher o nível de célula S2
- Idealmente, queremos abranger todas as linhas com uma ou apenas algumas células exclusivas, de modo a que nenhuma das duas linhas partilhe a mesma célula.
- Na prática, experimente cobrir com apenas algumas células, não mais do que uma dúzia. Cobrir 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 antes da associação, agrupando coordenadas muito próximas umas das outras através da utilização de clustering geoespacial ou filtrando coordenadas desnecessárias devido à natureza dos dados ou necessidades empresariais.
- Se possível, reduza a contagem de linhas devido à natureza dos dados ou necessidades empresariais. Filtrar linhas desnecessárias antes da associação, definir o âmbito para a área de interesse ou unificar linhas.
- No caso de linhas muito grandes, reduza o tamanho com geo_line_simplify().
- Alterar o nível de célula S2 pode melhorar o desempenho e o consumo de memória.
- Alterar o tipo de associação e a sugestão podem melhorar o desempenho e o consumo de memória.
- Caso o raio positivo esteja definido, reverter para o raio 0 na forma em memória intermédia com geo_line_buffer() pode melhorar o desempenho.
Exemplos
A consulta seguinte localiza todas as estações de metro a menos de 500 metros de ruas e agrega os tubos que contam por nome de 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, será devolvido um resultado nulo.
let line = dynamic({"type":"LineString","coordinates":[[[0,0],[0,0]]]});
print isnull(geo_line_to_s2cells(line))
print_0 |
---|
Verdadeiro |
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários