Comecei a jogar com o SpatiaLite hoje e já me deparei com um problema.
Para cada local do ponto armazenado no tableOne, eu gostaria de selecionar um ponto mais próximo (distância linear) da tableTwo.
Até agora, eu vim com uma solução desajeitada que utiliza o VIEW:
CREATE VIEW testview AS
SELECT
A.id ,
B.myValue,
Distance(A.Geometry, B.Geometry) AS distance
FROM tableOne AS A, tableTwo AS B
WHERE distance < 10000
ORDER BY A.Id, distance;
E depois:
SELECT * FROM testview
WHERE distance = (SELECT MIN(distance) FROM testview AS t WHERE t.id = testview.id)
parece fazer o trabalho.
Duas questões:
Existe uma maneira de executar essa consulta sem criar uma VIEW?
Existe alguma outra maneira de otimizar essa consulta para obter melhor desempenho? Em um cenário do mundo real, o tableOne terá centenas de milhares de registros e o tableTwo - 1,3 milhão.
sql
spatialite
nearest-neighbor
radek
fonte
fonte
Respostas:
Acabei de testar este SQL e funciona:
Como você pode ler aqui "A maneira ingênua de realizar uma consulta vizinha mais próxima é ordenar a tabela candidata à distância da geometria da consulta e, em seguida, registrar o registro com a menor distância".
Cumprimentos,
Andrea
fonte
Se você não deseja calcular as distâncias entre todas as combinações de pontos, use um índice espacial em uma das tabelas:
fonte
f_table_name = 'A'
, preciso substituir 'A' pelo nome da tabela real (tabela um)? Eu tentei de qualquer maneira e ainda não retorna nada, por isso pode ser issof_table_name = 'A'
deveria estarf_table_name = 'tableOne'
. Observe que essa solicitação assume espacial> 4.x (SpatialIndex
a tabela virtual é usada). Você tentou ajustar osearch_frame
seu caso de uso? No exemplo acima, presume-se que os pontos estejam a uma distância máxima de 10.000 metros.Desde a versão 4.4.0, o SpatiaLite suporta um índice de tabela virtual KNN para problemas de vizinhos mais próximos. Aqui está uma consulta que localiza a linha mais próxima em uma tabela de cadeia de linhas para cada ponto em uma tabela de pontos.
fonte
Você pode simplificar sua consulta assim.
Para uma solução mais genérica, talvez valha a pena tentar converter essa função de vizinho mais próximo do PostGIS: http://blog.mackerron.com/2011/03/postgis-nearest-neighbour/
fonte
SQL error: "misuse of aggregate: MIN()"