Suite

Définir la tolérance dans Postgis

Définir la tolérance dans Postgis


existe-t-il de toute façon pour définir la tolérance dans Postgis, dans Arcgis, la tolérance est la distance minimale qui pourrait séparer deux points, si la distance entre eux est inférieure à la tolérance, de sorte que les points sont considérés comme superposés. je dois définir ce paramètre car j'obtiens des résultats étranges en utilisant des fonctions telles queST_Intersects, ST_equals, ST_difference. dans ces conditions, je vérifie les points d'intersection enST_Distance(p1 , p2) < tolérancemais j'aimerais obtenir une solution plus robuste et générale.

dans mon cas d'utilisation, je n'ai besoin que d'une précision de 1 cm à 1 mm, mais par exemple, parfois ST_Intersects ne donne pas les résultats attendus à cause de quelques microns (0.000001).

SELECT ST_Intersects('POINT(0.00000000000000001 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry);

La stratégie la plus robuste pour déterminer une intersection géométrique consiste à utiliser ST_DWithin(g1, g2, dist). Mais si vous utilisez des outils de superposition de géométrie tels que ST_Difference ou ST_Intersection, les nœuds doivent être "accrochés" les uns aux autres, alors essayez ST_Snap (entrée géométrique, référence géométrique, tolérance flottante). Voici un exemple de plusieurs techniques.

SELECT ST_Intersects(a, b) AS intersects_without_snap, ST_AsText(ST_Snap(a, b, tol)) AS a_snapped_on_b, ST_Intersects(ST_Snap(a, b, tol), b) AS intersects_with_a_snapped_on_b, ST_Asnapl_b, ) AS b_snapped_on_a, ST_Intersects(ST_Snap(b, a, tol), b) AS intersects_with_b_snapped_on_a, ST_DWithin(a, b, tol), ST_Distance(a, b) < tol AS distance_lt_tol FROM ( SELECT 'POINT 0)'0.000000:00000000001 0) :geometry AS a, 'LINESTRING ( 0 0, 0 2 )'::geometry AS b, 0,001 AS tol ) f; -[ ENREGISTREMENT 1 ]-----------------+------------------------- intersects_without_snap | f a_snapped_on_b | POINT(0 0) intersecte_with_a_snapped_on_b | t b_snapped_on_a | LINESTRING(1e-017 0,0 2) intersects_with_b_snapped_on_a | t st_dwithin | t distance_lt_tol | t

Encore une fois, le simpliste pour la question est ST_DWithin. (ST_Snap fait parfois des choses inattendues, d'après mon expérience)