Shapely: La distancia desde la colección vacía es cero

Creado en 3 jul. 2017  ·  9Comentarios  ·  Fuente: Toblerity/Shapely

Comportamiento esperado y comportamiento real.

Comportamiento esperado:

La distancia desde una colección vacía debe ser + inf.

Comportamiento real:

La distancia desde una colección vacía devuelve cero.

Pasos para reproducir el problema.

Ejecute el siguiente script:

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

Sistema operativo

Windows 10 de 64 bits

Procedencia y versión bien formada

Python 3.6
Shapely 1.6b4 instalado desde PyPI usando pip

geos

Comentario más útil

Al igual que GEOS, JTS devuelve 0.0, por lo que quizás este comportamiento se redactó hace mucho tiempo.

PostGIS devuelve null para este escenario, ya que no hay geometrías entre las que medir. Sugeriría que Shapely devuelva de manera similar None si alguna de las entradas está vacía.

Todos 9 comentarios

Este comportamiento se hereda de GEOS. Si alguna de las geometrías está vacía, el método de distancia devuelve 0. Creo que esta es la línea de código relevante:

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

Interesante. Dado que cubrieron explícitamente este caso, ¿está funcionando según lo previsto? ¿Porqué debería ser este el caso?

Al igual que GEOS, JTS devuelve 0.0, por lo que quizás este comportamiento se redactó hace mucho tiempo.

PostGIS devuelve null para este escenario, ya que no hay geometrías entre las que medir. Sugeriría que Shapely devuelva de manera similar None si alguna de las entradas está vacía.

@mwtoews Me gustaría ver una excepción en lugar de obtener Ninguno: la intención es más clara.

¡Gracias por mencionar este tema, @jebob!

Los tipos espaciales de SQL Server devuelven NULL, similar a PostGIS. ArcPy de Esri genera un error. Parece que tenemos 0, NULL o error según a quién preguntes. Puedo ver algún mérito detrás de los argumentos para cualquiera de ellos, por lo que la documentación clara es probablemente la parte más importante para abordar este problema. Después de todo, sin un consenso entre los productos geoespaciales, es una cuestión de expectativas y no de corrección.

He cambiado de opinión y me inclino a dejarlo como cero. Aquí hay una analogía en Python:

>>> "" in "foo"
True

La cadena vacía está en todas las cadenas no vacías. ¿Estaría dispuesto a aceptar que la geometría vacía está en cada geometría no vacía y, por lo tanto, a una distancia 0?

No aceptaría que la geometría vacía esté en cada geometría no vacía, ya que la operación no es análoga.

  1. Dos cadenas idénticas están entre sí, pero dos formas idénticas pueden tener diferentes desplazamientos y, por lo tanto, no están "en" la otra.

  2. No se debe suponer que las geometrías vacías ocupan todos los espacios, porque entonces la intersección de una geometría vacía y una geometría X devuelve X.

  3. Las geometrías vacías deben estar más lejos que cualquier forma. dist (foo, X) <= dist (foo, union (X + Y)) por definición. Si X es el conjunto vacío, entonces dist (foo, X) debe devolver infinito para que la identidad sea válida para todos foo, Y.

@jebob gracias por ser paciente conmigo. Veo la lógica en + inf ahora.

Aún así, creo que preferiría tratarlo como indefinido y plantear una excepción (en un lanzamiento de funciones) por razones de usabilidad.

Plantear una excepción parece un buen candidato a compromiso, ya que es un resultado inequívoco, por lo que evita la confusión de quienes confían en que GEOS / JTS devuelva cero.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

mromanie picture mromanie  ·  3Comentarios

MarkWieczorek picture MarkWieczorek  ·  4Comentarios

chivasblue picture chivasblue  ·  3Comentarios

kannes picture kannes  ·  4Comentarios

benediktbrandt picture benediktbrandt  ·  3Comentarios