Intersecciones bien formadas vs relaciones bien formadas – ¿inexactas?

Hola, me pregunto si estoy pensando de forma incorrecta o si esto es un error:

Tengo una cadena lineal y un polígono, creo los puntos de intersección de la línea y el límite del polígono

introduzca la descripción de la imagen aquí

Estos puntos de intersección deberían intersecar (al menos tocar) el límite del polígono, ¿verdad?

from shapely import geometry,wkt line = geometry.LineString([(13.51039642756912, 52.598912814414675), (13.525173800277184, 52.60620240344557)]) poly = geometry.Polygon ([(13.52072838433517, 52.61735554606274), (13.52233276805985, 52.59511541819082), (13.51312087418833, 52.59394589806786),( 13.51526963068252, 52.60338701649216),( 13.51836560008325 ,52.6009395669487), (13.52072838433517, 52.61735554606274)]) ips = line.intersection(poly.boundary) for i in ips: print i.touches(poly.boundary)# should touch but it doesnt!!!! >>>False 

No es un error, pero esta es una pregunta frecuente.

Sin un modelo de precisión, todos los cálculos de punto flotante están limitados por la máquina épsilon . Los puntos intersectados se interpolan desde cada geometría y rara vez son exactos (a menos que tenga angularjs rectos). Todos los predicados de DE-9IM como ‘toques’ actualmente requieren nodos exactos (a menos que tengamos un modelo de precisión, lo que podría suceder un día. ACTUALIZACIÓN: probando con JTS Topology Suite , los predicados de DE-9IM no usan el modelo de precisión, por lo tanto es poco probable que el clon GEOS funcione de manera diferente).

Una estrategia más robusta es probar la distancia entre los dos, que debería ser menor que el épsilon de la máquina si se intersecan. P.ej:

 EPS = 1e-15 for i in ips: print i.distance(poly) < EPS