La distancia desde una colección vacía debe ser + inf.
La distancia desde una colección vacía devuelve cero.
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
Windows 10 de 64 bits
Python 3.6
Shapely 1.6b4 instalado desde PyPI usando pip
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:
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.
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.
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.
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.
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 similarNone
si alguna de las entradas está vacía.