Saya memiliki tabel PostGIS dengan beberapa poligon (disimpan menggunakan tipe data geografi). Mereka mewakili daerah di bumi bulat.
Untuk setiap pasangan simpul yang dipilih dari semua poligon, saya ingin menghitung apakah kedua simpul itu "terlihat" satu sama lain. (Ada n * ( n -1) / 2 pasangan demikian, di mana n adalah jumlah total simpul unik di semua poligon dalam tabel.) Dengan "terlihat satu sama lain," Maksud saya, jalur lingkaran besar antara dua simpul tidak memotong salah satu poligon di dalam tabel.
Apa cara tercepat untuk melakukan perhitungan itu, lebih disukai di PostgreSQL / PostGIS?
Saya punya sesuatu yang berfungsi, tetapi lambat. Saya secara naif mengulangi semua pasangan dan melihat apakah LineString di antara mereka memotong setiap poligon. (Tipe data geografi PostGIS menangani semua matematika sulit di bola untuk saya.) Jadi saya bertanya-tanya apakah ada struktur data yang pintar atau algoritma yang mungkin mempercepat segalanya.
Jawaban:
Putuskan apa yang tidak terlihat. Misalkan Anda berdiri di sebuah simpul di pantai, memandangi dua simpul terpencil dari sebuah poligon yang berdekatan. Maka Anda dapat mengasumsikan bahwa setiap simpul di seluruh sektor di belakang simpul ini tidak terlihat dari simpul ini.
sumber