Shapely: La distance de la collection vide est de zéro

Créé le 3 juil. 2017  ·  9Commentaires  ·  Source: Toblerity/Shapely

Comportement attendu et comportement réel.

Comportement attendu :

La distance d'une collection vide doit être +inf.

Comportement réel :

La distance d'une collection vide renvoie zéro.

Étapes pour reproduire le problème.

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

Système opérateur

Windows 10 64 bits

Version galbée et provenance

Python 3.6
Shapely 1.6b4 installé à partir de PyPI à l'aide de pip

geos

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ère None si l'une des entrées est vide.

Tous les 9 commentaires

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 :

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

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.

  1. 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.

  2. 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.

  3. 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.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

akadouri picture akadouri  ·  4Commentaires

jrobichaud picture jrobichaud  ·  3Commentaires

LostFan123 picture LostFan123  ·  5Commentaires

FuriousRococo picture FuriousRococo  ·  5Commentaires

sgillies picture sgillies  ·  5Commentaires