Membuat lingkaran di PostGIS?

22

Saya menggunakan PostGIS 1.5.2, dengan geometri di SRID: 900913. Saya perlu membuat lingkaran menggunakan daftar titik sebagai pusat, dengan radius 600 kilometer. Saya menggunakan kueri ini:

INSERT INTO circles (geom) (
   SELECT ST_Buffer(point, 600000, 'quad_segs=8') 
   FROM points
);

Tetapi lingkaran yang dibuat tidak memiliki radius 600 kilometer (radiusnya dekat dengan panjang ini, tetapi tidak persis).

Apakah ada metode lain untuk membuat lingkaran di PostGIS?

CATATAN: Informasi yang diwakili berasal dari Spanyol. Proyeksi yang benar adalah 4326, tetapi klien menggunakan raster Google, jadi saya menyimpan data di 900913 untuk menghindari proyeksi ulang dan meningkatkan kinerja.

angelcervera
sumber
1
Bagaimana Anda mengukur jari-jari untuk mengetahui mereka tidak 600 km?
underdark
1
@underdark Saya tahu jarak antara dua kota dan lingkaran yang dihasilkan menggunakan sebagai pusat salah satu kota ini tidak meluas ke kota lain. Saya memverifikasi jarak antara dua kota menggunakan gmap-pedometer.com
angelcervera
3
Ini kedengarannya terkait dengan gis.stackexchange.com/questions/10148/…
underdark
@underdark Menggunakan SELECT ST_Distance( (select point from points where id = 7), (select point from points where id = 42));kembali lebih dari 100km perbedaan menghormati gmap-pedometer.com, tetapi jika saya menganggap panjang ini sebagai benar, jari-jari lingkaran sempurna. Tetapi orang menggunakan jarak pertama sebagai radius, tidak ada jarak yang dikembalikan oleh st_distance. Apakah mungkin mengubah jarak pertama ke yang kedua?
angelcervera

Jawaban:

15

Coba ini:

 SELECT ST_Transform(geometry( 
            ST_Buffer(geography( 
                ST_Transform( point, 4326 )), 
                600000)), 
            900913) FROM points`

Ini membalik ke dalam geografi kemudian menggunakan pemilihan SRID inbuilt untuk (ironisnya) membalik kembali ke geometri di mana buffer planar yang baik dijalankan kemudian membalik kembali. Masalah dengan pendekatan Anda di Mercator adalah Mercator tidak menjaga jarak. Menggunakan proyeksi lokal yang lebih tepat memberikan hasil yang lebih baik, dan itulah yang terjadi pada metode di atas.

Paul Ramsey
sumber
4

Anda dapat meningkatkan nilai quad_seg untuk mendapatkan lingkaran yang lebih akurat. Untuk mendapatkan lingkaran nyata Anda harus bekerja dengan tipe geometri melengkung, tetapi saya tidak tahu perangkat lunak apa yang bisa menunjukkan itu.

Akurasi srid 90013 juga sangat buruk karena merupakan proyeksi yang mencakup seluruh dunia.

Anda akan mendapatkan hasil yang lebih akurat dengan proyeksi lokal.

Nicklas Avén
sumber
@ nicklas-aven Apakah mungkin 100km perbedaan dalam jarak 600km karena saya menggunakan proyeksi 900913 dan bukan 4326?
angelcervera
1
ya itu mungkin. periksa Paul yang berkomentar ketika saya tidak bisa percaya bahwa ketidaktepatan gis.stackexchange.com/questions/3264/… . masalahnya adalah bahwa 4326 tidak diproyeksikan.
Nicklas Avén
3

Itu tergantung di mana lingkaran Anda sedang dibuat. Apakah mereka dekat garis khatulistiwa atau lebih dekat ke kutub?

Lihatlah peta ini . Apakah Anda pikir Antartica atau Greenland benar-benar sebesar itu? Itu adalah proyeksi yang Anda gunakan, kan?

Saya akan merekomendasikan Anda melakukan membaca cepat dokumen USGS ini tentang proyeksi , terutama tabel di bawah ini yang memberi Anda gambaran singkat tentang proyeksi yang baik untuk apa.

Dan setelah semua itu, saya pikir saya akhirnya harus menjawab pertanyaan Anda :)

Apa yang dikatakan Nicklas adalah nasihat yang bagus. Apakah ada proyeksi khusus untuk area lokal Anda yang akan bekerja lebih baik?

Kalau tidak, Anda mungkin ingin melihat tipe Geografi PostGIS yang baru . Namun demikian, jawaban yang paling tepat tergantung pada di mana data Anda berada.

PEMBARUAN: Karena sekarang kami tahu bahwa data Anda di Spanyol, apakah Anda melihat menyimpannya dalam proyeksi lokal seperti UTM Zone 31N , melakukan operasi Anda menggunakan itu, dan kemudian memproyeksikannya kembali ke Google Web Mercator?

Ragi Yaser Burhum
sumber
1
+1 untuk menggunakan tipe geografi untuk peta yang mencakup wilayah yang luas. masalahnya di sini adalah tidak ada fungsi buffer asli untuk tipe geografi di postgis. tetapi ada cast inbuilt ke "best srid", membangun buffer dan kemudian kembali ke 4326. Jadi mengetahui data Anda dan memilih srid secara manual memberikan kontrol yang lebih baik.
Nicklas Avén
Nicklas, Anda benar tentang casting dan saya setuju dengan Anda 100% tentang proyeksi lokal (yaitu mengetahui data Anda). Namun demikian, jika jawabannya adalah bahwa ia hanya ingin memiliki data "di seluruh dunia", IMHO, logika casting di dalam tipe Geografi akan melakukan pekerjaan yang jauh lebih baik dalam mencari tahu SR apa yang sesuai untuk operasi jarak tertentu daripada yang lainnya logika khusus yang rumit. Hal lain yang baik tentang tipe geografi adalah bahwa meskipun banyak operasi saat ini dilemparkan ke matematika kartesius, operasi terus diperbarui untuk menggunakan matematika bola.
Ragi Yaser Burhum
2

Anda dapat menggunakan SQL / MM Bagian 3 jenis geometri CIRCULARSTRING dan / atau CURVEPOLYGON.

Namun, berhati-hatilah bahwa dukungan untuk jenis ini terbatas, baik dengan fungsi internal maupun program eksternal. Anda dapat menggunakan ST_CurveToLine untuk membantu memvisualisasikannya.

Lebih jauh lagi, ini agak tidak menyenangkan (seperti pada PostGIS 2.0 svn) yang SELECT ST_Area('CURVEPOLYGON(CIRCULARSTRING(2 1, 1 2, 0 1, 1 0, 2 1))'::geometry)hanya merupakan perkiraan kasar π . (Bandingkan dari 3.14033115695475 hingga 3.14159265358979 dari pi()).

Mike T
sumber