Saya ingin menggunakan ST_DWithin pada data yang disimpan dalam geometri SRID 4326 dan menggunakan meter sebagai parameter jarak. Apakah lebih efisien untuk melakukan pemeran (misalnya data.geom :: geografi) atau transformasi ke SRID dengan satuan meter (mis. ST_Transform (geom, 3857)? Atau tidak?
postgis
coordinate-system
st-dwithin
kingzing1
sumber
sumber
Jawaban:
Seperti yang dijelaskan, jawabannya adalah "tidak", karena alasan berikut:
ST_DWithin(geom::geography, %anothergeom, %radius)
. Karena geografi terlibat, sistem akan mencari indeks geografi (yang dibangun di atas bola, bukan di pesawat) dan tidak akan menemukannya. Karena tidak memiliki indeks, ia akan melakukan penggabungan menggunakan pemindaian penuh tabel. Itu akan lambat.ST_DWithin(ST_Transform(geom, 2163), %anothergeom, %radius)
. Tes Anda tidak bertentangan dengan kolom yang diindeks (geom), tetapi terhadap fungsi yang diterapkan pada kolom (ST_Transform(geom,2163)
) dan sekali lagi, indeks spasial Anda tidak akan digunakan. Itu akan lambat.Anda perlu agar kueri dan indeks Anda selaras. Jika Anda tidak ingin mengubah proyeksi data Anda, Anda harus menggunakan indeks fungsional, misalnya, jika Anda membuat indeks geografi fungsi, Anda bisa menggunakan kueri berbasis geografi:
Atau, dalam kasus transformasi:
Performa tercepat mutlak adalah jika Anda mengonversi data dalam tabel Anda ke proyeksi planar (seperti EPSG: 2163 ), buat indeks spasial, dan kemudian gunakan
ST_DWithin()
pada hasilnya.sumber