Apa pro dan kontra tipe geografi dan geometri PostGIS?

86

Perusahaan saya menggunakan geometry( the_geom) tipe data untuk menyimpan data geospasial.

Saya baru-baru ini berkenalan dengan konsep tipe data geography( the_geog) yang, seperti yang saya pahami, menyimpan SRIDbeserta geometri.

Apa perbedaan antara geographydan geometry, dan apakah ada manfaat menggunakan salah satunya di basis data besar?

Adam Matan
sumber
Beberapa jawaban lagi untuk pertanyaan rangkap ini: gis.stackexchange.com/questions/26082/…
Arto Bendiken

Jawaban:

74

Fitur geografi selalu disimpan dalam WGS84 sebelum PostGIS 2.2; sejak saat itu sistem referensi spasial apa pun berbasis lat / lat dapat digunakan. Pengukuran berdasarkan fitur geografi akan dilakukan dalam meter, bukan unit CRS dan PostGIS akan menggunakan perhitungan geodetik alih-alih geometri planar.

Tidak semua fungsi mendukung geometri tetapi Anda dapat memilih antara geometri dan geografi. Untuk daftar fungsi saat ini, lihat: https://postgis.net/docs/PostGIS_Special_Functions_Index.html#PostGIS_GeographyFunctions

Saya tidak berpikir itu mungkin untuk merekomendasikan geografi atau geometri untuk basis data besar. Itu tergantung pada apa yang Anda lakukan dengan data Anda. Karena perhitungan pada bola lebih rumit, saya berharap analisis lebih lambat pada fitur geografi. Anda juga harus mengubah semua data Anda menjadi WGS84 untuk menggunakan geografi.

Jika Anda melakukan banyak pengukuran dan misalnya harus membandingkan ukuran poligon besar, masuk akal untuk menggunakan geografi daripada geometri.

Saya menemukan hal berikut yang bermanfaat: http://postgis.net/workshops/postgis-intro/geography.html

Topik ini juga tercakup dalam "PostGIS Beraksi" (ISBN: 9781935182269).

underdark
sumber
"Geografi didukung oleh ..." apakah ini terbaru?
Chris Anderson
@ChrisAnderson daftarnya lebih panjang sekarang: postgis.net/docs/…
underdark
41

Saya menggunakan "aturan praktis" intuitif saya ... Sangat berguna untuk keputusan cepat,

  • Tentang DATABASE Anda : jika fitur dan / atau analisis spasial berskala benua , dan membutuhkan ketelitian (aplikasi serius) gunakan geografi . Lain-lain gunakan geometri: ketika semua basis data hampir sama ( skala kota ), atau Anda tidak perlu presisi, dll. Anda hanya perlu geometri.
    Lihat aturan serupa di kuliah saran @underdark .

  • Tentang kebutuhan Anda dalam hal PERFORMANCE / PRECISION BALANCE: geometri lebih cepat; jika Anda membutuhkan kinerja dan berpikir untuk menggunakan geografi, lakukan tolok ukur Anda terlebih dahulu.


Konsep-kunci

Pada halaman ini, kita melihat beberapa kata kunci dan fokus pada beberapa konsep: presisi , kinerja , dan sesuatu seperti fleksibilitas / komoditas penggunaan .

Sebagaimana diingat oleh orang lain, perbedaannya, untuk penyimpanan dan perhitungan, adalah penggunaan bola dalam geografi dan bidang dalam geometri:

  • bola (geografi) lebih baik, lebih tepat. Lihat contoh Los Angeles / Paris .
  • evolusi geografi: seperti yang dikatakan @DavidF, "tipe geografi baru-baru ini ditambahkan, sehingga lebih sedikit fungsi yang didukung / diimplementasikan".

Mungkin pada tahun 2020 semua database GIS akan ditetapkan ke standar SRID / EPSG yang sama (setara dengan kode 4326 saat ini, untuk WGS84). Geografi hari ini bukanlah pilihan standar karena keterbatasan kinerja dan fungsional.

Diskusi

Menurut pendapat saya itu adalah pertanyaan tentang "praktik terbaik", bukan masalah teknis / teoretis yang mendalam.

Presisi

Setelah memperkirakan kesalahan pada data Anda, apakah tes Anda dan membandingkan hasil: perolehan presisi dengan geografi lebih tinggi dari kesalahan data? Fungsi ST_Distance (dengan MAX dan AVG agregator ) adalah referensi utama dalam jenis percobaan ini.

Performa

Contoh tolok ukur di daerah perkotaan ~ 100km2 (diameter ~ 11km), semua disimpan sebagai geometri, dalam sistem koordinat UTM planar. CATATAN: dimulai dengan konversi geometri / geografi yang sering digunakan - sering kali karena beberapa fungsi tidak ada dan beberapa lainnya, seperti ST_Buffer dan ST_Intersection, melakukan konversi secara internal.

Bench # 1: sebuah tabel dengan ~ 87000 poligon yang mewakili lot perkotaan, masing-masing dengan poli dengan (rata-rata) ~ 13 poin,

 BEGIN; EXPLAIN ANALYSE CREATE TABLE temp_geom AS 
        SELECT gid, the_geom FROM urbanlots; ROLLBACK;
 -- time 2080 ms   ~ 2.0 s
 BEGIN; EXPLAIN ANALYSE CREATE TABLE temp_geog AS 
        SELECT gid, Geography(ST_Transform(the_geom,4326)) AS geog 
        FROM urbanlots; ROLLBACK;
 -- time 12374 ms ~ 12.4 s  ~ 6 * geometry.

jadi, geography_time = 6 * geometry_time.

Bench # 2: sebuah tabel dengan ~ 3500 poligon yang mewakili blok perkotaan, masing-masing dengan poli dengan (rata-rata) ~ 50 poin: 0,6s vs 2,7s, geography_time = 4,5 * geometry_time.

Bench # 3: ~ 10000 baris mewakili jalan-jalan kota, masing-masing dengan ~ 5 poin. ~ 0.87s vs ~ 0.36s, geography_time = 2.4 * geometry_time.

Kembali ke Bench # 2, membuat tabel dan melakukan kueri,

 EXPLAIN ANALYSE SELECT ST_Area(g.the_geom)+ST_Distance(g.the_geom,t.the_geom) 
         FROM temp_geom g, (SELECT the_geom FROM temp_geom WHERE gid=1) as t;
 -- time 182 ms   ~ 0.2 s
 EXPLAIN ANALYSE SELECT ST_Area(g.geog)+ST_Distance(g.geog,t.geog) 
         FROM temp_geog g, (SELECT geog FROM temp_geog WHERE gid=1) as t;
 -- time 58657 ms  ~ 59 s  ~  300*geometry
 -- curioselly for only distances, geography=4*geometry

Kesimpulan: untuk tugas-tugas kecil dan kerja keras yang baik, waktu menyatu dengan "waktu yang dapat diterima-sama", tetapi untuk tugas besar, ada peringkat kinerja yang perlu dipertimbangkan.

Fleksibilitas / Komoditas

Pada tolok ukur saya melakukan tugas sehari-hari, memeriksa jumlah poin (berdasarkan ST_NPoints) ... Ini adalah contoh operasi yang tidak ada untuk geografi, perlu dilemparkan. "Pemeran geografi / geometri" adalah tugas yang menjengkelkan bagi programmer, master, dll.

Saat menggunakan kembali pustaka fungsi SQL dan PL / pgSQL, geografi perlu adaptasi. Dan, jika Anda ingin mengoptimalkan kode, atau menghindari masalah presisi dengan banyak konversi perantara, tidak adanya seperangkat fungsi bawaan lengkap, dengan geografi, adalah masalah lain. Program untuk geografi, bukanlah tugas yang mudah.

Hanya proses, pertukaran data, dll.

Untuk permintaan yang tidak biasa, tanpa pengguna intensif seperti Mapserver, ketika satu-satunya pekerjaan Anda (PostGIS) adalah memproses input data dan mengembalikan setiap saat (seperti jam atau hari) data yang diproses, aturan praktisnya adalah "gunakan geografi jika Anda nyaman! " (lihat "Fleksibilitas / Komoditas" di atas). Jika tidak, periksa aturan yang biasa.
CATATAN: tentu saja, jika tugas Anda (tidak biasa) hanya menampilkan data dari PostGIS ke Mapserver, tanpa perlu proses, untuk mempertahankan data input Anda yang sama (geometri atau geografi), adalah keputusan yang lebih baik.

Saya percaya sentralisasi data adalah tugas lain di mana geografi lebih baik: dalam konteks di mana keragaman format input dan sistem referensi biasa, penggunaan standar, seperti yang ditegakkan oleh geografi, bermanfaat ... Konvensi alih konfigurasi adalah prinsip yang baik ketika sentralisasi dan pertukaran data adalah fokus bisnis (lihat Google Maps!).

Peter Krauss
sumber
@ Peter Sehubungan dengan standarisasi data, apakah Geometri akan menjadi cara yang disukai untuk menggabungkan data dari banyak sumber kadang-kadang dengan sistem referensi koordinat kustom (CRS) menjadi satu tipe data tunggal? Fungsi transformasi suka ST_GeomFrom*dan ST_As*tampak sangat berguna, terutama dikombinasikan dengan kemampuan untuk mendefinisikan CRS kustom, membiarkan PostGIS menangani transformasi selama permintaan dan ekspor dalam satu CRS tunggal?
David LeBauer
@ Peter Hei, saya bertanya-tanya, apakah ada tinta yang berisi semua fungsi geografi? Fungsi geometri di sini saya kira, tetapi di mana fungsi geografi? Terima kasih. Jawaban yang menakjubkan btw, pekerjaan yang sangat bagus
slevin
11

Saya percaya bahwa perbedaan yang paling signifikan adalah bahwa dengan tipe geografi, perhitungan dibuat pada bola yang mewakili bumi yang bertentangan dengan permukaan datar yang digunakan dalam perhitungan yang dibuat pada fitur tipe geometri.

Dokumennya cukup bagus: http://postgis.net/docs/manual-1.5/ch04.html#PostGIS_Geography

Jenis geografi baru-baru ini ditambahkan, sehingga lebih sedikit fungsi yang didukung / diimplementasikan.

DavidF
sumber
9

Mungkin Anda menemukan fitur ini - dan jawaban - tidak berguna, tetapi salah satu keuntungan bekerja dengan geometri adalah Anda dapat bekerja tanpa referensi spasial (yaitu, SRID diatur ke -1).

Saat ini saya sedang bekerja dalam sebuah aplikasi yang menyaring data LiDAR di udara, di antara sumber datanya adalah database PostGIS, yang menyediakan pengindeksan spasial kelas pertama ( RTree over GiST ) dan mengatasi volume data yang tinggi tanpa masalah. Karena aplikasi itu tidak memerlukan memanipulasi atau menganalisis fitur geografi, SRID tidak diperlukan, sehingga menghindari overhead yang dapat ditimbulkannya.

dariapra
sumber