Saya sudah mulai bermain dengan SpatiaLite hari ini dan sudah menemukan masalah.
Untuk setiap lokasi titik disimpan dalam tableOne Saya ingin memilih satu, titik terdekat (jarak linear) dari tableTwo.
Sejauh ini saya datang dengan solusi canggung yang memanfaatkan LIHAT:
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;
Lalu:
SELECT * FROM testview
WHERE distance = (SELECT MIN(distance) FROM testview AS t WHERE t.id = testview.id)
tampaknya melakukan pekerjaan itu.
Dua pertanyaan:
Apakah ada cara untuk melakukan permintaan seperti itu tanpa membuat VIEW?
Apakah ada cara lain untuk mengoptimalkan kueri ini untuk kinerja yang lebih baik? Dalam tabel skenario dunia nyata, One akan memiliki ratusan ribu pasangan catatan, dan tableTwo - 1,3 juta.
sql
spatialite
nearest-neighbor
Radek
sumber
sumber
Jawaban:
Saya baru saja menguji SQL ini dan berhasil:
Seperti yang Anda baca di sini, "Cara naif untuk melakukan kueri tetangga terdekat adalah dengan memesan tabel kandidat berdasarkan jarak dari geometri kueri, dan kemudian mengambil catatan dengan jarak terkecil".
Salam Hormat,
Andrea
sumber
Jika Anda tidak ingin menghitung jarak antara semua kombinasi titik, Anda bisa menggunakan indeks spasial di salah satu tabel:
sumber
f_table_name = 'A'
, apakah saya harus mengganti 'A' dengan nama tabel sebenarnya (tabel satu)? Saya sudah mencoba kedua cara dan masih tidak mengembalikan apa pun, mengapa ini mungkinf_table_name = 'A'
seharusnyaf_table_name = 'tableOne'
. Perhatikan bahwa permintaan ini mengasumsikan spatialite> 4.x (SpatialIndex
tabel virtual digunakan). Apakah Anda mencoba menyesuaikansearch_frame
untuk kasus penggunaan Anda? Dalam contoh di atas, titik diasumsikan berada pada jarak maksimum 10.000 meter.Karena versi 4.4.0 SpatiaLite mendukung indeks tabel virtual KNN untuk masalah tetangga terdekat. Berikut adalah kueri yang menemukan baris terdekat di tabel linestring ke setiap titik dalam tabel titik.
sumber
Anda dapat menyederhanakan kueri Anda seperti ini.
Untuk solusi yang lebih umum, mungkin ada baiknya mencoba mengubah fungsi PostGIS Nearest Neighbor ini: http://blog.mackerron.com/2011/03/postgis-nearest-neighbour/
sumber
SQL error: "misuse of aggregate: MIN()"