Partilhar via


geo_line_lookup plugin (pré-visualização)

Aplica-se a: ✅Microsoft FabricAzure Data Explorer

O geo_line_lookup plug-in procura um Line valor em uma tabela de pesquisa e retorna linhas com valores correspondentes. O plugin é invocado com o operador evaluate.

Sintaxe

O|evaluategeo_line_lookup(Tabela, de PesquisaLookupLineKey,SourceLongitude,SourceLatitude,Raio, [ return_unmatched ] , [ lookup_area_radius ] , [ return_lookup_key ])

Parâmetros

Nome Tipo Obrigatório Descrição
T string ✔️ A entrada tabular cujas colunas SourceLongitude e SourceLatitude são usadas para correspondência de linhas.
Tabela de Pesquisa string ✔️ Expressão de tabela ou tabela com dados de pesquisa de linhas, cuja coluna LookupLineKey é usada para correspondência de linhas.
LookupLineKey dynamic ✔️ A coluna de LookupTable com linha ou multilinha no formato GeoJSON e de tipo dinâmico que é correspondida em relação a cada SourceLongitude, SourceLatitudes valores.
SourceLongitude real ✔️ A coluna de T com o valor de longitude a ser pesquisado em LookupTable. Valor da longitude em graus. O valor válido é um número real e está no intervalo [-180, +180].
SourceLatitude real ✔️ A coluna de T com o valor de latitude a ser pesquisado em LookupTable. Valor de latitude em graus. O valor válido é um número real e está no intervalo [-90, +90].
Raio real ✔️ Comprimento da linha onde o local de origem é considerado uma correspondência.
return_unmatched bool Um sinalizador booleano opcional que define se o resultado deve incluir todas ou apenas linhas correspondentes (padrão: false - somente linhas correspondentes retornadas).
lookup_area_radius real Uma distância de raio de área de pesquisa opcional em valores de metros que pode ajudar na correspondência de locais com suas respetivas linhas.
return_lookup_key bool Um sinalizador booleano opcional que define se o resultado deve incluir a coluna LookupLineKey (padrão: false).

Devoluções

O geo_line_lookup plugin retorna um resultado de junção (pesquisa). O esquema da tabela é a união da tabela de origem e da tabela de pesquisa, semelhante ao resultado do lookup operador.

A distância de localização de uma linha é testada via geo_distance_point_to_line().

Se o argumento return_unmatched estiver definido como true, a tabela resultante incluirá linhas correspondentes e não correspondentes (preenchidas com nulos).

Se o argumento return_unmatched for definido como false, ou omitido (o valor padrão de é usado), a tabela resultante terá tantos registros quanto os resultados correspondentes false . Esta variante de pesquisa tem melhor desempenho em comparação com a return_unmatched=true execução.

A definição do comprimento lookup_area_radius substitui o mecanismo de correspondência interno e pode melhorar ou piorar o tempo de execução e\ou o consumo de memória. Isso não afeta a correção da consulta. Leia mais abaixo sobre como definir esse valor opcional.

Observação

  • Este plugin cobre o cenário de classificar locais para linhas dentro de um raio da linha, assumindo um pequeno tamanho de tabela de pesquisa, com a tabela de entrada opcionalmente tendo um tamanho maior.
  • O desempenho do plug-in depende dos tamanhos das tabelas de pesquisa e fonte de dados, do número de colunas e do número de registros correspondentes.
  • As coordenadas geoespaciais são interpretadas como representadas pelo sistema de referência de coordenadas WGS-84 .
  • O dado geodésico usado para medir a distância na Terra é uma esfera. As bordas das linhas são geodésicas na esfera.
  • Se as bordas da linha de entrada forem linhas cartesianas retas, considere usar geo_line_densify() para converter arestas planas em geodésicas.
  • As linhas de entrada devem ser válidas.

Definição e restrições de LineString

dynamic({"type": "LineString","coordinates": [[lng_1,lat_1], [lng_2,lat_2],..., [lng_N,lat_N]]})

dynamic({"type": "MultiLineString","coordinates": [[line_1, line_2, ..., line_N]]})

  • A matriz de coordenadas LineString deve conter pelo menos duas entradas.
  • As coordenadas [longitude, latitude] devem ser válidas quando a longitude é um número real no intervalo [-180, +180] e a latitude é um número real no intervalo [-90, +90].
  • O comprimento da aresta deve ser inferior a 180 graus. Escolhe-se a aresta mais curta entre os dois vértices.

Configuração lookup_area_radius (se necessário)

A configuração do raio da área de pesquisa substitui o mecanismo interno para fazer a correspondência entre os locais e suas respetivas linhas. O valor é uma distância em metros. Idealmente, o raio da área de pesquisa deve representar uma distância do centro da linha, de modo que, dentro dessa distância, um ponto corresponda exatamente a uma linha de uma maneira um-para-um e, dentro dessa distância, não haja mais do que uma única linha. Como os dados de linhas podem ser grandes, as linhas podem variar muito em tamanho e forma em comparação umas com as outras e a proximidade da linha uma com a outra, pode ser um desafio chegar ao raio que tem o melhor desempenho. Se necessário, aqui está um exemplo que pode ajudar.

LinesTable | valor do projeto = geo_line_length(linha) | resumir min = min(valor), avg = avg(valor), max = max(valor)

Tente usar o raio de pesquisa a partir do valor médio para o mínimo (se as linhas estiverem próximas umas das outras) ou máximo por múltiplos de 2.

Sugestão

  • Se a tabela Locais tiver muitas coordenadas próximas umas das outras, considere agregá-las usando geo_point_to_s2cell().
  • Talvez seja possível criar uma funcionalidade de junção mais personalizada (ou de alto desempenho) usando geo_line_to_s2cells().

Exemplos

O exemplo a seguir retorna apenas linhas correspondentes.

let roads = datatable(road_name:string, road:dynamic)
[
    "5th Avenue NY", dynamic({"type":"LineString","coordinates":[[-73.97291864770574,40.76428551254824],[-73.99708638113894,40.73145135821781]]}),
    "Palace Ave", dynamic({"type":"LineString","coordinates":[[-0.18756982045002246,51.50245944666557],[-0.18908519740253382,51.50544952706903]]}),
];
let locations = datatable(location_name:string, longitude:real, latitude:real)
[
    "Empire State Building", -73.98567337898565, 40.74842629977377,
    "Grand Central Terminal", -73.97713140725149, 40.752730320824895,
    "Statue of Liberty",  -74.04462223203123, 40.689195627512674,
    "Kensington Palace", -0.1885272501232862,  51.504906159672316
];
locations
| evaluate geo_line_lookup(roads, road, longitude, latitude, 100, return_lookup_key = true)

Realização

location_name longitude latitude road_name estrada
Edifício Empire State -73.9856733789857 40.7484262997738 5ª Avenida NY {"type":"LineString","coordenadas":[[-73.97291864770574,40.76428551254824],[-73.99708638113894,40.73145135821781]]}
Palácio de Kensington -0.188527250123286 51.5049061596723 Palácio Ave {"type":"LineString","coordenadas":[[-0.18756982045002247,51.50245944666557],[-0.18908519740253383,51.50544952706903]]}

O exemplo a seguir retorna linhas correspondentes e não correspondentes.

let roads = datatable(road_name:string, road:dynamic)
[
    "5th Avenue NY", dynamic({"type":"LineString","coordinates":[[-73.97291864770574,40.76428551254824],[-73.99708638113894,40.73145135821781]]}),
    "Palace Ave", dynamic({"type":"LineString","coordinates":[[-0.18756982045002246,51.50245944666557],[-0.18908519740253382,51.50544952706903]]}),
];
let locations = datatable(location_name:string, longitude:real, latitude:real)
[
    "Empire State Building", -73.98567337898565, 40.74842629977377,
    "Grand Central Terminal", -73.97713140725149, 40.752730320824895,
    "Statue of Liberty",  -74.04462223203123, 40.689195627512674,
    "Kensington Palace", -0.1885272501232862,  51.504906159672316
];
locations
| evaluate geo_line_lookup(roads, road, longitude, latitude, 100, return_unmatched = true, return_lookup_key = true)

Realização

location_name longitude latitude road_name estrada
Edifício Empire State -73.9856733789857 40.7484262997738 5ª Avenida NY {"type":"LineString","coordenadas":[[-73.97291864770574,40.76428551254824],[-73.99708638113894,40.73145135821781]]}
Palácio de Kensington -0.188527250123286 51.5049061596723 Palácio Ave {"type":"LineString","coordenadas":[[-0.18756982045002247,51.50245944666557],[-0.18908519740253383,51.50544952706903]]}
Estátua da Liberdade -74.04462223203123 40.689195627512674
Grand Central Terminal -73.97713140725149 40.752730320824895

O exemplo a seguir retorna linhas correspondentes e não correspondentes, com raio definido como 350m.

let roads = datatable(road_name:string, road:dynamic)
[
    "5th Avenue NY", dynamic({"type":"LineString","coordinates":[[-73.97291864770574,40.76428551254824],[-73.99708638113894,40.73145135821781]]}),
    "Palace Ave", dynamic({"type":"LineString","coordinates":[[-0.18756982045002246,51.50245944666557],[-0.18908519740253382,51.50544952706903]]}),
];
let locations = datatable(location_name:string, longitude:real, latitude:real)
[
    "Empire State Building", -73.98567337898565, 40.74842629977377,
    "Grand Central Terminal", -73.97713140725149, 40.752730320824895,
    "Statue of Liberty",  -74.04462223203123, 40.689195627512674,
    "Kensington Palace", -0.1885272501232862,  51.504906159672316
];
locations
| evaluate geo_line_lookup(roads, road, longitude, latitude, 350, return_unmatched = true, return_lookup_key = true)
location_name longitude latitude road_name estrada
Edifício Empire State -73.9856733789857 40.7484262997738 5ª Avenida NY {"type":"LineString","coordenadas":[[-73.97291864770574,40.76428551254824],[-73.99708638113894,40.73145135821781]]}
Palácio de Kensington -0.188527250123286 51.5049061596723 Palácio Ave {"type":"LineString","coordenadas":[[-0.18756982045002247,51.50245944666557],[-0.18908519740253383,51.50544952706903]]}
Grand Central Terminal -73.97713140725149 40.752730320824895 5ª Avenida NY {"type":"LineString","coordenadas":[[-73.97291864770574,40.76428551254824],[-73.99708638113894,40.73145135821781]]}
Estátua da Liberdade -74.04462223203123 40.689195627512674

O exemplo a seguir conta locais por proximidade à estrada.

let roads = datatable(road_name:string, road:dynamic)
[
    "5th Avenue NY", dynamic({"type":"LineString","coordinates":[[-73.97291864770574,40.76428551254824],[-73.99708638113894,40.73145135821781]]}),
    "Palace Ave", dynamic({"type":"LineString","coordinates":[[-0.18756982045002246,51.50245944666557],[-0.18908519740253382,51.50544952706903]]}),
];
let locations = datatable(location_name:string, longitude:real, latitude:real)
[
    "Empire State Building", -73.98567337898565, 40.74842629977377,
    "Grand Central Terminal", -73.97713140725149, 40.752730320824895,
    "Statue of Liberty",  -74.04462223203123, 40.689195627512674,
    "Kensington Palace", -0.1885272501232862,  51.504906159672316
];
locations
| evaluate geo_line_lookup(roads, road, longitude, latitude, 350)
| summarize count() by road_name 

Realização

road_name contagem_
5ª Avenida NY 2
Palácio Ave 1