Voici du code Shapely qui crée trois polygones carrés, p1, p2 et p3. p2 est positionné immédiatement à droite de p1 et p3 est positionné immédiatement en dessous.

Le problème est que Shapely me dit que p1 et p2 ne se touchent pas, alors que p1 et p3 le font. Je ne vois pas ce qui ne va pas ici.

from shapely.geometry import Polygon

DELTA = 0.2

def polygonFromPoint(p):
    return Polygon([(p[0]-DELTA*0.5, p[1]-DELTA*0.5),
                    (p[0]-DELTA*0.5, p[1]+DELTA*0.5),
                    (p[0]+DELTA*0.5, p[1]+DELTA*0.5),
                    (p[0]+DELTA*0.5, p[1]-DELTA*0.5)])

p1 = polygonFromPoint([-118.8,35.0])
p2 = polygonFromPoint([-118.6,35.0])
p3 = polygonFromPoint([-118.8,34.8])

print(p1)
print(p2)
print(p3)

print(p1.overlaps(p2), p1.intersects(p2), p1.crosses(p2), p1.contains(p2),
      p1.disjoint(p2), p1.touches(p2))
print(p1.overlaps(p3), p1.intersects(p3), p1.crosses(p3), p1.contains(p3),
      p1.disjoint(p3), p1.touches(p3))

L'exécution de ceci produit la sortie suivante:

POLYGON ((-118.9 34.9, -118.9 35.1, -118.7 35.1, -118.7 34.9, -118.9 34.9))
POLYGON ((-118.7 34.9, -118.7 35.1, -118.5 35.1, -118.5 34.9, -118.7 34.9))
POLYGON ((-118.9 34.7, -118.9 34.9, -118.7 34.9, -118.7 34.7, -118.9 34.7))
False False False False True False
False True False False False True

Ce qui montre que Shapely pense que p1 et p2 ne se croisent ou ne se touchent pas, alors que p1 et p3 se croisent et se touchent.

EDIT : Comme Gilles-Philippe Paillé et d'autres l'ont fait remarquer, il s'agit d'un problème de précision avec les coordonnées du polygone. L'utilisation de l'ajustement suivant résout le problème dans ce cas :

def polygonFromPoint(p):
    return Polygon( [(round(p[0]-DELTA*0.5,1), round(p[1]-DELTA*0.5,1)),
                        (round(p[0]-DELTA*0.5,1), round(p[1]+DELTA*0.5,1)),
                        (round(p[0]+DELTA*0.5,1), round(p[1]+DELTA*0.5,1)),
                        (round(p[0]+DELTA*0.5,1), round(p[1]-DELTA*0.5,1))] ) 
2
Julian 27 janv. 2020 à 21:27

1 réponse

Meilleure réponse

Même si la représentation sous forme de chaîne du polygone montre que les coordonnées sont les mêmes, la représentation en virgule flottante sous-jacente n'est pas exactement ce qui est imprimé et peut inclure une certaine imprécision. En utilisant vos coordonnées et le même calcul, j'obtiens :

DELTA = 0.5

a = -118.6 - 0.2 * DELTA
b = -118.8 + 0.2 * DELTA
print(a)
print(b)
print(a <= b)

a = 35.0 - 0.2 * DELTA
b = 34.8 + 0.2 * DELTA
print(a)
print(b)
print(a <= b)

Ce qui donne la sortie suivante:

-118.69999999999999
-118.7
False
34.9
34.9
True
2
Gilles-Philippe Paillé 27 janv. 2020 à 19:01