Ketika mendefinisikan suatu Poin di PostGIS, kapan Anda memutuskan untuk menggunakan mana dari yang berikut ini?
ST_SetSRID(ST_MakePoint(lon,lat),4326)
ST_SetSRID(ST_Point(long,lat),4326)
ST_SetSRID(ST_GeomFromText('POINT(lon lat)',4326)
ST_GeomFromEWKT('SRID=4326;POINT(lon lat)')
Jika pada dasarnya perbedaan dalam kinerja, mana yang tercepat?
postgis
postgresql
coordinate-system
Nyxynyx
sumber
sumber
Jawaban:
Dugaan saya adalah itu
ST_MakePoint
tercepat, tetapi ini cukup mudah untuk dibandingkan dengan 100k poin acak.Dan berikut adalah beberapa hasil dengan PostGIS 2.1 (trunk) di PostgreSQL 9.1, x64 Debian. Saya melakukannya beberapa kali untuk mendapatkan perkiraan rata-rata. Berikut
<POINT CONSTRUCTOR METHOD>
urutan dari tercepat ke terlambat:ST_SetSRID(ST_MakePoint(random(), random()), 4326)
ST_GeomFromText('POINT(' || random()::text || ' ' || random()::text || ')', 4326)
ST_GeomFromEWKT('SRID=4326;POINT(' || random()::text || ' ' || random()::text || ')')
ST_GeomFromText
Terakhir, catatan kaki kecil tentang perbedaan antara konversi lossless / lossy dengan metode di atas. Hanya
ST_MakePoint
menyimpan data presisi titik mengambang biner, dan konversi teks akan memotong sebagian kecil data. Meskipun kedua poin tersebut mungkin memiliki perbedaan biner (terlihat di WKB), mereka harus selalu sama secara spasial. Perbedaan jarak pada dasarnya adalah epsilon mesin untuk presisi ganda .sumber
SQL
sintaks<POINT CONSTRUCTOR METHOD>
,. Apakah itu hanya kodesemu untuk merujuk pada empat pendekatan yang berbeda, atau apakah Anda membuat semacam fungsi?1e-14
... Ubah tabel f1FROM (SELECT random()::float8 as x, random()::float8 as y UNION SELECT 12.24343484842,34.58384538483434) AS f1
untuk melihatnya di psql Anda.ST_MakePoint dan ST_Point sama - keduanya memanggil LWGEOM_makepoint (Anda dapat melihat ini di file postgis / postgis.sql.in dalam kode sumber). Saya akan menggunakan ST_MakePoint. Rutin konversi teks menghasilkan hasil yang sama, tetapi lebih lambat karena jumlah parsing yang diperlukan.
sumber
SRID 4326 dan Geometri
Sebagai catatan untuk jawaban yang sangat baik, komprehensif, dan saat ini oleh MikeT . Banyak orang tampaknya mengajukan pertanyaan ini karena mereka ingin mengatur SRID pada kolom TITIK.
Tetapi ketika mereka melakukannya mereka mengalami masalah dengan apa yang tampaknya merupakan metode terbaik untuk menciptakan suatu poin, tetapi sayangnya mereka mengalami masalah.
Dari sana, mereka beralasan memiliki dua opsi
ST_SetSRID( ST_MakePoint(1,2) )
yang merupakan cara paling kanan tetapi kekar, atauST_GeomFromText
, ini lebih lambat secara logis dan tidak perlu benchmark: PostgreSQL harus menguraikan argumen konstruktor dari teks. Itu juga sangat jelek.Sayangnya, ada cara lain.
Jenis Geografi
SRID default untuk
geography
adalah 4326. Jika Anda baru, saya sarankan menggunakangeography
sebagai gantinyageometry
. Bahkan, umumnya jika Anda tidak tahu perbedaan yang mungkin Anda inginkangeography
. Anda dapat mengganti kolom dengan cukup mudah.Sekarang penyisipan lebih mudah karena jenisnya sudah dikaitkan dengan default dengan SRID 4326. Sekarang Anda dapat secara eksplisit dilemparkan ke
geography
, atau biarkan saja karya pemeran implisit bekerjaYang terlihat seperti ini, (mereka semua memasukkan hte hal yang sama)
Konversi ke teks dan kemudian memaksa PostgreSQL untuk mem-parsing teks dengan
ST_GeomFromText
atauST_GeogFromText
konyol dan lambat.sumber