Ho un caso che si basa sulla proiezione di un punto su una linea e quindi separare questa linea su di esso. Il mio caso d'uso è un po 'più complicato, ma il mio problema può essere riprodotto con il seguente codice:Come gestire gli errori di arrotondamento in Shapely
from shapely import *
line1 = LineString([(1,1.2), (2,2), (3, 2.), (4,1.2)])
pt = Point(2.5, 1.2)
pr = line1.interpolate(line1.project(pt))
Per costruzione, "pr" dovrebbe essere accesa linea 1 e la loro intersezione troppo:
line1.contains(pr)
line1.intersects(LineString([pt, pr]))
stampe due volte "Vere". Ma cambiare l'ingresso coordina un po 'i freni del flusso di lavoro:
from shapely import *
line1 = LineString([(1,1.2), (2,2), (3, 2.3), (4,1.2)])
pt = Point(2.5, 1.2)
pr = line1.interpolate(line1.project(pt))
line1.contains(pr)
line1.intersects(LineString([pt, pr]))
stampe "False".
Capisco il problema di precisione flottante, ma ciò significa che non riesco a eseguire il test per i punti sulle linee? Quando costruisco una linea basata su un elenco di punti, posso essere sicuro che almeno tutti i punti "di costruzione" saranno sulla linea?
Sei in grado di scegliere un'unità più granulare, diciamo, millimetri invece di metri? –
@PauloScardine: grazie. Sì, posso facilmente dare una certa precisione se ottengo stabilità. Moltiplicare i miei valori di 10 rende il trucco. Funzionerà in ** tutti ** i casi? Shapely continua a lavorare con i galleggianti internamente. – Fabzi