La distance d'une collection vide doit être +inf.
La distance d'une collection vide renvoie zéro.
Exécutez le script suivant :
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 64 bits
Python 3.6
Shapely 1.6b4 installé à partir de PyPI à l'aide de pip
Ce comportement est hérité de GEOS. Si l'une des géométries est vide, la méthode de distance renvoie 0. Je pense que c'est la ligne de code pertinente :
Intéressant. Étant donné qu'ils ont explicitement couvert ce cas, cela fonctionne-t-il comme prévu ? Pourquoi cela devrait-il être le cas ?
Semblable à GEOS, JTS renvoie 0.0, donc peut-être que ce comportement a été rédigé il y a longtemps.
PostGIS renvoie null
pour ce scénario, car il n'y a pas de géométries entre lesquelles mesurer. Je suggérerais à Shapely de retourner de la même manière None
si l'une des entrées est vide.
@mwtoews J'aimerais voir une exception levée au lieu d'en obtenir None : l'intention est plus claire.
Merci d'avoir soulevé cette question, @jebob !
Les types spatiaux SQL Server renvoient NULL, comme PostGIS. ArcPy d'Esri génère une erreur. Il semble que nous ayons 0, NULL ou une erreur selon la personne à qui vous demandez. Je peux voir un certain mérite derrière les arguments pour l'un d'entre eux, donc une documentation claire est probablement la partie la plus importante pour résoudre ce problème. Après tout, sans consensus parmi les produits géospatiaux, c'est une question d'attentes et non de justesse.
J'ai changé d'avis et je suis enclin à le laisser à zéro. Voici une analogie en Python :
>>> "" in "foo"
True
La chaîne vide se trouve dans chaque chaîne non vide. Seriez-vous prêt à accepter que la géométrie vide soit dans chaque géométrie non vide et donc à la distance 0 ?
Je n'accepterais pas que la géométrie vide soit dans chaque géométrie non vide, car l'opération n'est pas analogue.
Deux chaînes identiques sont l'une dans l'autre, mais deux formes identiques peuvent avoir des décalages différents et ne sont donc pas "in" l'une dans l'autre.
Les géométries vides ne doivent pas être présumées occuper chaque espace, car alors l'intersection d'une géométrie vide et d'une géométrie X renvoie X.
Les géométries vides doivent être plus éloignées que n'importe quelle forme. dist(foo, X) <= dist(foo, union(X+Y)) par définition. Si X est l'ensemble vide, alors dist(foo, X) doit retourner l'infini pour que l'identité soit valide pour tout foo, Y.
@jebob merci d'avoir été patient avec moi. Je vois la logique dans +inf maintenant.
Néanmoins, je pense que je préférerais le traiter comme non défini et lever une exception (dans une version de fonctionnalité) pour des raisons de convivialité.
Lever une exception semble un bon candidat de compromis car il s'agit d'un résultat sans ambiguïté, évitant ainsi la confusion de ceux qui comptent sur GEOS/JTS renvoyant zéro.
Commentaire le plus utile
Semblable à GEOS, JTS renvoie 0.0, donc peut-être que ce comportement a été rédigé il y a longtemps.
PostGIS renvoie
null
pour ce scénario, car il n'y a pas de géométries entre lesquelles mesurer. Je suggérerais à Shapely de retourner de la même manièreNone
si l'une des entrées est vide.