Shapely: Jarak dari koleksi kosong adalah nol

Dibuat pada 3 Jul 2017  ·  9Komentar  ·  Sumber: Toblerity/Shapely

Perilaku yang diharapkan dan perilaku yang sebenarnya.

Perilaku yang diharapkan:

Jarak dari koleksi kosong harus +inf.

Perilaku sebenarnya:

Jarak dari koleksi kosong menghasilkan nol.

Langkah-langkah untuk mereproduksi masalah.

Jalankan skrip berikut:

from shapely.geometry import Point, LineString

empty_thing = LineString()
assert empty_thing.is_empty
print(empty_thing.distance(Point(1, 1)))  # Returns zero, should probably be +inf

Sistem operasi

Windows 10 64bit

Versi dan asalnya yang indah

Python 3.6
Shapely 1.6b4 diinstal dari PyPI menggunakan pip

geos

Komentar yang paling membantu

Mirip dengan GEOS, JTS mengembalikan 0,0, jadi mungkin perilaku ini sudah dirancang sejak lama.

PostGIS mengembalikan null untuk skenario ini, karena tidak ada geometri untuk diukur. Saya menyarankan Shapely juga mengembalikan None jika ada input yang kosong.

Semua 9 komentar

Perilaku ini diwarisi dari GEOS. Jika salah satu geometri kosong, metode jarak mengembalikan 0. Saya pikir ini adalah baris kode yang relevan:

https://github.com/OSGeo/geos/blob/5a730fc50dab2610a9e6c037b521accc66b7777b/src/operation/distance/DistanceOp.cpp#L146

Menarik. Mengingat bahwa mereka secara eksplisit membahas kasus ini, apakah ini berfungsi seperti yang direncanakan? Mengapa hal ini harus terjadi?

Mirip dengan GEOS, JTS mengembalikan 0,0, jadi mungkin perilaku ini sudah dirancang sejak lama.

PostGIS mengembalikan null untuk skenario ini, karena tidak ada geometri untuk diukur. Saya menyarankan Shapely juga mengembalikan None jika ada input yang kosong.

@mwtoews Saya ingin melihat pengecualian dimunculkan alih-alih mendapatkan None: maksudnya lebih jelas.

Terima kasih telah mengemukakan ini, @jebob!

Tipe spasial SQL Server mengembalikan NULL, mirip dengan PostGIS. ArcPy Esri menghasilkan kesalahan. Tampaknya kami memiliki 0, NULL, atau kesalahan tergantung pada siapa Anda bertanya. Saya dapat melihat beberapa manfaat di balik argumen untuk salah satu dari mereka, jadi dokumentasi yang jelas mungkin merupakan bagian terpenting dari mengatasi masalah ini. Lagi pula, tanpa konsensus di antara produk geospasial, ini adalah masalah harapan dan bukan kebenaran.

Saya telah berubah pikiran dan cenderung untuk membiarkannya sebagai nol. Berikut analogi dengan Python:

>>> "" in "foo"
True

String kosong ada di setiap string yang tidak kosong. Apakah Anda bersedia menerima bahwa geometri kosong ada di setiap geometri yang tidak kosong dan dengan demikian berada pada jarak 0?

Saya tidak akan menerima bahwa geometri kosong ada di setiap geometri yang tidak kosong, karena operasinya tidak analog.

  1. Dua string yang identik berada di satu sama lain, tetapi dua bentuk yang identik mungkin memiliki offset yang berbeda dan oleh karena itu tidak "dalam" satu sama lain.

  2. Geometri kosong tidak boleh dianggap menempati setiap ruang, karena persimpangan geometri kosong dan geometri X akan mengembalikan X.

  3. Geometri kosong harus lebih jauh dari bentuk apa pun. dist(foo, X) <= dist(foo, union(X+Y)) menurut definisi. Jika X adalah himpunan kosong, maka dist(foo, X) harus mengembalikan tak terhingga agar identitas valid untuk semua foo, Y.

@jebob terima kasih telah bersabar dengan saya. Saya melihat logika di +inf sekarang.

Namun, saya pikir saya lebih suka memperlakukannya sebagai tidak terdefinisi dan memunculkan pengecualian (dalam rilis fitur) karena alasan kegunaan.

Mengangkat pengecualian tampaknya merupakan kandidat kompromi yang baik karena merupakan hasil yang tidak ambigu, sehingga mencegah kebingungan dari mereka yang mengandalkan GEOS/JTS yang mengembalikan nol.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat