Mendefinisikan operator spasial (Persamaan, Disjoint, Sentuhan, Dalam, Tumpang tindih, Persilangan, Persimpangan, Berisi, Berkaitan)?


9

Ok, saya harus akui, saya tidak benar-benar mempelajari semantik daftar operator spasial di bawah ini, saya lebih dari pengguna, saya menulis perangkat lunak untuk menggerakkan SQL sebagian besar waktu dan tidak benar-benar berpikir terlalu banyak tentang hal itu.

Namun, saya memiliki situasi di mana operasi spasial yang saya lakukan akan berjalan lambat, di atas meja yang memiliki indeks hebat dan tidak pernah menyebabkan masalah sebelumnya.

Akibatnya, saya mencoba mencari tahu mana dari berikut ini yang merupakan taruhan terbaik saya untuk digunakan, yang akan memberi saya kinerja terbaik, namun, kadang-kadang saya menemukan pencarian saya tidak menghasilkan apa-apa ketika saya tahu mereka harus, dan kadang-kadang mengembalikan barang ketika mereka seharusnya tidak.

JADI, saya menjangkau, untuk bertanya apakah ada orang yang bisa memberi saya definisi yang sebenarnya, seperti kriteria yang cocok, sepenuhnya dalam melampirkan geometri, atau dalam lingkaran luar dll dari masing-masing operasi berikut:

Equals(Geom1, Geom2):int
Disjoint(Geom1, Geom2):int
Touches(Geom1, Geom2):int
Within(Geom1, Geom2):int
Overlaps(Geom1, Geom2):int
Crosses(Geom1, Geom2):int
Intersects(Geom1, Geom2):int
Contains(Geom1, Geom2):int
Relate(Geom1, Geom2):int

Jika Anda dapat memberikan contoh konkret tentang kapan mereka akan dan tidak akan cocok juga, itu akan bagus.

Sebagai referensi, saya mencari di meja Linestrings, menggunakan poligon persegi panjang, diputar untuk menunjuk ke arah perjalanan (Ini adalah bagian dari aplikasi manajemen lalu lintas)

Untuk referensi lebih lanjut, berikut adalah contoh dari SQL yang dihasilkan aplikasi untuk melakukan pencarian:

SELECT recordID,AsBinary(geometry) AS geometry,Distance(GeomFromText('POINT(-1.84101 54.85078)',4326), geometry) AS distanceFromGps FROM linegrid WHERE Intersects(GeomFromText('POLYGON ((-1.8413149820810311 54.850782468607292, -1.8409507853094111 54.850952257034713, -1.8408279009723911 54.850864894077496, -1.8411920982612455 54.850695105650068, -1.8413149820810311 54.850782468607292))'), geometry)

Anda dapat melihat dalam contoh ini saya menggunakan persimpangan mencoba yang lain seperti yang disebutkan tidak cukup memberikan hasil yang saya harapkan, karenanya mengapa saya mengajukan pertanyaan.

Harap dicatat, saya tidak terlalu peduli tentang yang sebenarnya lebih cepat / cara lain untuk melakukan ini saat ini, TAPI jika Anda menemukan cara yang lebih baik jangan ragu untuk berteriak :-)

Untuk saat ini yang paling saya coba pahami adalah perbedaan antara masing-masing operasi.

Sedangkan untuk melakukannya lebih cepat / lebih baik saya bermaksud membuka pertanyaan yang berbeda untuk itu di kemudian hari.

Untuk referensi lebih lanjut, mesin Spasial ini berfungsi melawan adalah Spatilite 2.3.0, dan saya tidak dapat memutakhirkannya karena perangkat itu berjalan pada tidak memiliki yang lebih up to date untuk membangunnya (Windows CE)


Saya akan memilih jawaban mintix di sini karena disediakan kisi yang sangat mudah dimengerti dan deskripsi dari semua operasi yang berbeda, yang menjawab pertanyaan saya.

Saya masih dihadapkan dengan peningkatan kinerja pada rutinitas, tetapi saya sekarang memiliki beberapa strategi untuk mencoba yang itu, saya mungkin masih mencari saran di sini dari kelompok mengenai hal itu.

@Vince layak mendapat pujian juga, karena kertas putih itu jelas merupakan jawaban yang pasti, tetapi juga cukup menantang untuk dibaca (saya harus membacanya beberapa kali), bagi siapa pun yang menginginkan yang sebenarnya saya dalam operasi ini. Kertas Clementini adalah cara untuk pergi, jika Anda membutuhkan gambaran umum yang mudah dimengerti saat mengembangkan solusi, tautan FME harus terbuka di tab browser lain.


Kemungkinan mempercepat - mungkin menguji persimpangan kotak pembatas dengan " MbrIntersects " sebelum menguji apakah geometri berpotongan?
user2856

Hai Luke. Awalnya saya mencoba menggunakan MBR, tetapi kemudian menyadari bahwa saya tidak dapat memutarnya. Sayangnya saya harus memutar kotak untuk menunjuk ke arah bantalan GPS sehingga harus menjadi poligon. Terima kasih untuk sarannya.
shawty

sarannya bukan hanya menggunakan tes MBRIntersects saja. Itu untuk menggunakan MbrIntersects untuk mengurangi jumlah geometri yang diuji fungsi Intersects. Mempersempit pencarian dengan cara ini adalah metode standar untuk mempercepat overlay.
user2856

Ah ya, sekarang saya baca lagi, saya mengerti maksud Anda.
shawty

Jika ada banyak baris di linegrid, dan Anda tidak akan mencapai sebagian besar dari mereka, indeks spasial mungkin membantu.
BradHards

Jawaban:


16

Anda sedang mencari "Dimensionally Extended 9 Intersection Matrix" atau DE-9IM singkatnya.

DE-9IM melalui FME

Tautan FME itu memiliki contoh hebat dari operator spasial yang Anda sebutkan di atas. Ini memecahnya menjadi 3x3 true / false matrix dengan contoh dan deskripsi masing-masing atribut predikat.


WOW!! Tautan ini sangat berguna, melakukan pemindaian cepat, akan membacanya secara lebih rinci nanti.
shawty

Tautan rusak.
alphabetasoup

9

Karya referensi yang saya gunakan untuk ekspektasi operator spasial adalah makalah Clementini ("Seperangkat Kecil Hubungan Topologis Formal yang Cocok untuk Interaksi Pengguna Akhir", Eliseo Clementini, Paolino Di Felice, dan Peter van Oosterom, 1993). Ini menjabarkan teori di balik operator sehubungan dengan interior, eksterior, dan dimensi, yang menghilangkan dugaan hubungan yang ditangkap oleh operator mana antara jenis yang.

Sayangnya, apakah semua implementasi menghormati semua aspek operator Clementini, merupakan masalah lain.


Ya, saya dengar ya di sana ... dunia IT penuh dengan standar yang tampaknya tidak ada yang menghormati, terima kasih atas info yang akan saya cari salinannya.
shawty
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.