Re: [postgis-users] st_intersects and st_disjoint inconsistent results

2022-02-15 Thread Emily Gouge

Lucky me! Thanks for the confirmation.  Emily

On 2022-02-11 2:19 p.m., Paul Ramsey wrote:

This issue has been confirmed on both GEOS and JTS. You have magic geometry 
that breaks the consistency between prepared and standard results.

https://github.com/libgeos/geos/pull/566

P.


On Feb 10, 2022, at 6:43 PM, Emily Gouge  wrote:

Here you go.  Thanks!


SELECT ST_AsHEXEWKB (geometry) FROM test.eflowpath WHERE id = 
'889105be-5782-43f1-b50c-5a5825c83875'

01022009120700642F25DC75A24CC0E4DE5740FCB34840A7CEFE9B72A24CC09DA85B2CFBB34840B5519D0E64A24CC091FAA188FBB34840FA449E245DA24CC054C2137AFDB34840F4ACFFCE51A24CC09FEB562A03B448405328C1D144A24CC09A3DD00A0CB44840404C10C03CA24CC0EA07FE6910B44840

SELECT ST_AsHEXEWKB (geometry) FROM test.eflowpath WHERE id = 
'e5703673-a995-472e-b4b4-0280143eba0c'

01022009120E0004BE47A23CA24CC098A1F14410B448409871AEBC3FA24CC078341F2114B448400858AB764DA24CC09D0546031DB448406BFD3E2D50A24CC0BEDDEDD522B4484004824AA654A24CC02DC9A60128B44840EE377FB850A24CC0FA18BD642DB44840CCAF8B474EA24CC02CCCE78134B44840D7158E7B4EA24CC01D7C17A53AB44840ACFA01B452A24CC02688BA0F40B44840DB508C8752A24CC006CDF80846B44840A1F31ABB44A24CC0C891730756B44840009AF7EE45A24CC06B7649415CB448408C2ECAC749A24CC0CE57248161B44840A74302A150A24CC07DD00E1368B44840

On 2022-02-10 5:57 p.m., Paul Ramsey wrote:

On Feb 10, 2022, at 4:55 PM, Emily Gouge  wrote:

I have a linear dataset on which I was building a query to find edges that are 
“very close” but don’t touch. While working on this query I found some 
unexpected results with the st_intersects and st_disjoint functions. As 
outlined below, the query returned true for both st_instersects and st_disjoint 
for a few geometries comparisons, but ONLY when a where clause was used to 
filter the geometries spatially. When unique identifiers were used to filter 
geometries only st_disjoint returns true.

Versions:
Except where noted otherwise the results below reference testing on these 
versions:
POSTGIS="3.2.0 3.2.0" [EXTENSION] PGSQL="140" GEOS="3.10.1-CAPI-1.16.0" PROJ="7.2.1" LIBXML="2.9.9" 
LIBJSON="0.12" LIBPROTOBUF="1.2.1" WAGYU="0.5.0 (Internal)"
PostgreSQL 14.1, compiled by Visual C++ build 1914, 64-bit

When I run this query:
select a.id, b.id,
st_intersects(a.geometry, b.geometry),
st_intersects(b.geometry, a.geometry),
st_disjoint(a.geometry, b.geometry),
st_disjoint(b.geometry, a.geometry)
from test.eflowpath a, test.eflowpath b
where a.id != b.id
and st_dwithin(a.geometry, b.geometry, 0.1)
and st_disjoint(a.geometry, b.geometry);

PostGIS 3.2: 50 rows were returned, but there are three rows that return true 
for both st_disjoint and st_intersects. Given the query this in itself is a bit 
odd as you'd expect reciprocal results for the pairs of the geometry (so at 
least 4 rows).
---
889105be-5782-43f1-b50c-5a5825c83875
e5703673-a995-472e-b4b4-0280143eba0c
true
true
true
true
---
0d05aabb-9ff3-4d8f-b6c7-b2b44b0868c8
3a09b2af-5932-4e36-9e3e-d8109e5463fa
true
true
true
true
---
3a09b2af-5932-4e36-9e3e-d8109e5463fa
0d05aabb-9ff3-4d8f-b6c7-b2b44b0868c8
true
true
true
true
---
...

Note: In PostGIS 3.1.2 50 rows were returned by only two rows returned true for 
both disjoint and intersects.

HOWEVER,
When I compare one pair of those edges specifically using the ids they are only 
disjoint (which is the result I would expect to see)

select a.id, b.id,
st_intersects(a.geometry, b.geometry),
st_intersects(b.geometry, a.geometry),
st_disjoint(a.geometry, b.geometry),
st_disjoint(b.geometry, a.geometry)
from test.eflowpath a, test.eflowpath b
where b.id = '889105be-5782-43f1-b50c-5a5825c83875' and a.id = 
'e5703673-a995-472e-b4b4-0280143eba0c'

Results:
---
e5703673-a995-472e-b4b4-0280143eba0c
889105be-5782-43f1-b50c-5a5825c83875
false
false
true
true
---

I thought perhaps this had something to do with the indexes so I removed all 
geometry indexes from the table and re-ran the initial query. In postgis 3.2 
this returned the same results as the indexed query.
Note: In PostGIS 3.1.2 this also returned three rows with intersects and 
disjoint true. As noted above with indexes in 3.1.2 only 2 rows were returned 
where intersects and disjoint were true.

Similar results occurred if st_dwithin from the where statement was increased 
to 0.01.

Test Data: When I made a table with only the edges in question all queries 
returned expected results: st_intersects is false and st_disjoint is true. As a 
result providing a small test case for this issue doesn’t seem possible. But I 
am happy to provide all the data - there are 27,444 rows.

While this isn’t a problem for me, I find it unexpected that the results from 
st_intersects and st_disjoint of two geometries would be different based on the 
where clause in the query (and the data in the table).

Thoughts?

The fact that a single test case returns one result, but results in a larger 
set returns another says to me that likely the issue in different code lines 
because of 

Re: [postgis-users] st_intersects and st_disjoint inconsistent results

2022-02-11 Thread Martin Davis
It seems to be predicate robustness failure week!  The geometries in this
recent post show the same problem (in JTS, and probably GEOS too).

https://lists.osgeo.org/pipermail/postgis-users/2022-February/045255.html

A: LINESTRING (-29796.696826656284 138522.76848210802, -29804.3911369969
138519.3504205817)
B: LINESTRING (-29802.795222153436 138520.05937757515, -29802.23305474065
138518.7938969792)

A.disjoint(B) = TRUE
A.preparedIntersects(B) = TRUE

(Note: the post issue is slightly different - it just happens that the data
shows this problem)

On Fri, Feb 11, 2022 at 2:19 PM Paul Ramsey 
wrote:

> This issue has been confirmed on both GEOS and JTS. You have magic
> geometry that breaks the consistency between prepared and standard results.
>
> https://github.com/libgeos/geos/pull/566
>
> P.
>
> > On Feb 10, 2022, at 6:43 PM, Emily Gouge  wrote:
> >
> > Here you go.  Thanks!
> >
> >
> > SELECT ST_AsHEXEWKB (geometry) FROM test.eflowpath WHERE id =
> '889105be-5782-43f1-b50c-5a5825c83875'
> >
> >
> 01022009120700642F25DC75A24CC0E4DE5740FCB34840A7CEFE9B72A24CC09DA85B2CFBB34840B5519D0E64A24CC091FAA188FBB34840FA449E245DA24CC054C2137AFDB34840F4ACFFCE51A24CC09FEB562A03B448405328C1D144A24CC09A3DD00A0CB44840404C10C03CA24CC0EA07FE6910B44840
> >
> > SELECT ST_AsHEXEWKB (geometry) FROM test.eflowpath WHERE id =
> 'e5703673-a995-472e-b4b4-0280143eba0c'
> >
> >
> 01022009120E0004BE47A23CA24CC098A1F14410B448409871AEBC3FA24CC078341F2114B448400858AB764DA24CC09D0546031DB448406BFD3E2D50A24CC0BEDDEDD522B4484004824AA654A24CC02DC9A60128B44840EE377FB850A24CC0FA18BD642DB44840CCAF8B474EA24CC02CCCE78134B44840D7158E7B4EA24CC01D7C17A53AB44840ACFA01B452A24CC02688BA0F40B44840DB508C8752A24CC006CDF80846B44840A1F31ABB44A24CC0C891730756B44840009AF7EE45A24CC06B7649415CB448408C2ECAC749A24CC0CE57248161B44840A74302A150A24CC07DD00E1368B44840
> >
> > On 2022-02-10 5:57 p.m., Paul Ramsey wrote:
> >>> On Feb 10, 2022, at 4:55 PM, Emily Gouge 
> wrote:
> >>>
> >>> I have a linear dataset on which I was building a query to find edges
> that are “very close” but don’t touch. While working on this query I found
> some unexpected results with the st_intersects and st_disjoint functions.
> As outlined below, the query returned true for both st_instersects and
> st_disjoint for a few geometries comparisons, but ONLY when a where clause
> was used to filter the geometries spatially. When unique identifiers were
> used to filter geometries only st_disjoint returns true.
> >>>
> >>> Versions:
> >>> Except where noted otherwise the results below reference testing on
> these versions:
> >>> POSTGIS="3.2.0 3.2.0" [EXTENSION] PGSQL="140"
> GEOS="3.10.1-CAPI-1.16.0" PROJ="7.2.1" LIBXML="2.9.9" LIBJSON="0.12"
> LIBPROTOBUF="1.2.1" WAGYU="0.5.0 (Internal)"
> >>> PostgreSQL 14.1, compiled by Visual C++ build 1914, 64-bit
> >>>
> >>> When I run this query:
> >>> select a.id, b.id,
> >>> st_intersects(a.geometry, b.geometry),
> >>> st_intersects(b.geometry, a.geometry),
> >>> st_disjoint(a.geometry, b.geometry),
> >>> st_disjoint(b.geometry, a.geometry)
> >>> from test.eflowpath a, test.eflowpath b
> >>> where a.id != b.id
> >>> and st_dwithin(a.geometry, b.geometry, 0.1)
> >>> and st_disjoint(a.geometry, b.geometry);
> >>>
> >>> PostGIS 3.2: 50 rows were returned, but there are three rows that
> return true for both st_disjoint and st_intersects. Given the query this in
> itself is a bit odd as you'd expect reciprocal results for the pairs of the
> geometry (so at least 4 rows).
> >>> ---
> >>> 889105be-5782-43f1-b50c-5a5825c83875
> >>> e5703673-a995-472e-b4b4-0280143eba0c
> >>> true
> >>> true
> >>> true
> >>> true
> >>> ---
> >>> 0d05aabb-9ff3-4d8f-b6c7-b2b44b0868c8
> >>> 3a09b2af-5932-4e36-9e3e-d8109e5463fa
> >>> true
> >>> true
> >>> true
> >>> true
> >>> ---
> >>> 3a09b2af-5932-4e36-9e3e-d8109e5463fa
> >>> 0d05aabb-9ff3-4d8f-b6c7-b2b44b0868c8
> >>> true
> >>> true
> >>> true
> >>> true
> >>> ---
> >>> ...
> >>>
> >>> Note: In PostGIS 3.1.2 50 rows were returned by only two rows returned
> true for both disjoint and intersects.
> >>>
> >>> HOWEVER,
> >>> When I compare one pair of those edges specifically using the ids they
> are only disjoint (which is the result I would expect to see)
> >>>
> >>> select a.id, b.id,
> >>> st_intersects(a.geometry, b.geometry),
> >>> st_intersects(b.geometry, a.geometry),
> >>> st_disjoint(a.geometry, b.geometry),
> >>> st_disjoint(b.geometry, a.geometry)
> >>> from test.eflowpath a, test.eflowpath b
> >>> where b.id = '889105be-5782-43f1-b50c-5a5825c83875' and a.id =
> 'e5703673-a995-472e-b4b4-0280143eba0c'
> >>>
> >>> Results:
> >>> ---
> >>> e5703673-a995-472e-b4b4-0280143eba0c
> >>> 889105be-5782-43f1-b50c-5a5825c83875
> >>> false
> >>> false
> >>> true
> >>> true
> >>> ---
> >>>
> >>> I thought perhaps this had something to do with the indexes so I
> removed all geometry indexes from the table and re-ran the initial query.
> In postgis 3.2 this returned the same 

Re: [postgis-users] st_intersects and st_disjoint inconsistent results

2022-02-11 Thread Paul Ramsey
This issue has been confirmed on both GEOS and JTS. You have magic geometry 
that breaks the consistency between prepared and standard results.

https://github.com/libgeos/geos/pull/566

P.

> On Feb 10, 2022, at 6:43 PM, Emily Gouge  wrote:
> 
> Here you go.  Thanks!
> 
> 
> SELECT ST_AsHEXEWKB (geometry) FROM test.eflowpath WHERE id = 
> '889105be-5782-43f1-b50c-5a5825c83875'
> 
> 01022009120700642F25DC75A24CC0E4DE5740FCB34840A7CEFE9B72A24CC09DA85B2CFBB34840B5519D0E64A24CC091FAA188FBB34840FA449E245DA24CC054C2137AFDB34840F4ACFFCE51A24CC09FEB562A03B448405328C1D144A24CC09A3DD00A0CB44840404C10C03CA24CC0EA07FE6910B44840
> 
> SELECT ST_AsHEXEWKB (geometry) FROM test.eflowpath WHERE id = 
> 'e5703673-a995-472e-b4b4-0280143eba0c'
> 
> 01022009120E0004BE47A23CA24CC098A1F14410B448409871AEBC3FA24CC078341F2114B448400858AB764DA24CC09D0546031DB448406BFD3E2D50A24CC0BEDDEDD522B4484004824AA654A24CC02DC9A60128B44840EE377FB850A24CC0FA18BD642DB44840CCAF8B474EA24CC02CCCE78134B44840D7158E7B4EA24CC01D7C17A53AB44840ACFA01B452A24CC02688BA0F40B44840DB508C8752A24CC006CDF80846B44840A1F31ABB44A24CC0C891730756B44840009AF7EE45A24CC06B7649415CB448408C2ECAC749A24CC0CE57248161B44840A74302A150A24CC07DD00E1368B44840
> 
> On 2022-02-10 5:57 p.m., Paul Ramsey wrote:
>>> On Feb 10, 2022, at 4:55 PM, Emily Gouge  wrote:
>>> 
>>> I have a linear dataset on which I was building a query to find edges that 
>>> are “very close” but don’t touch. While working on this query I found some 
>>> unexpected results with the st_intersects and st_disjoint functions. As 
>>> outlined below, the query returned true for both st_instersects and 
>>> st_disjoint for a few geometries comparisons, but ONLY when a where clause 
>>> was used to filter the geometries spatially. When unique identifiers were 
>>> used to filter geometries only st_disjoint returns true.
>>> 
>>> Versions:
>>> Except where noted otherwise the results below reference testing on these 
>>> versions:
>>> POSTGIS="3.2.0 3.2.0" [EXTENSION] PGSQL="140" GEOS="3.10.1-CAPI-1.16.0" 
>>> PROJ="7.2.1" LIBXML="2.9.9" LIBJSON="0.12" LIBPROTOBUF="1.2.1" WAGYU="0.5.0 
>>> (Internal)"
>>> PostgreSQL 14.1, compiled by Visual C++ build 1914, 64-bit
>>> 
>>> When I run this query:
>>> select a.id, b.id,
>>> st_intersects(a.geometry, b.geometry),
>>> st_intersects(b.geometry, a.geometry),
>>> st_disjoint(a.geometry, b.geometry),
>>> st_disjoint(b.geometry, a.geometry)
>>> from test.eflowpath a, test.eflowpath b
>>> where a.id != b.id
>>> and st_dwithin(a.geometry, b.geometry, 0.1)
>>> and st_disjoint(a.geometry, b.geometry);
>>> 
>>> PostGIS 3.2: 50 rows were returned, but there are three rows that return 
>>> true for both st_disjoint and st_intersects. Given the query this in itself 
>>> is a bit odd as you'd expect reciprocal results for the pairs of the 
>>> geometry (so at least 4 rows).
>>> ---
>>> 889105be-5782-43f1-b50c-5a5825c83875
>>> e5703673-a995-472e-b4b4-0280143eba0c
>>> true
>>> true
>>> true
>>> true
>>> ---
>>> 0d05aabb-9ff3-4d8f-b6c7-b2b44b0868c8
>>> 3a09b2af-5932-4e36-9e3e-d8109e5463fa
>>> true
>>> true
>>> true
>>> true
>>> ---
>>> 3a09b2af-5932-4e36-9e3e-d8109e5463fa
>>> 0d05aabb-9ff3-4d8f-b6c7-b2b44b0868c8
>>> true
>>> true
>>> true
>>> true
>>> ---
>>> ...
>>> 
>>> Note: In PostGIS 3.1.2 50 rows were returned by only two rows returned true 
>>> for both disjoint and intersects.
>>> 
>>> HOWEVER,
>>> When I compare one pair of those edges specifically using the ids they are 
>>> only disjoint (which is the result I would expect to see)
>>> 
>>> select a.id, b.id,
>>> st_intersects(a.geometry, b.geometry),
>>> st_intersects(b.geometry, a.geometry),
>>> st_disjoint(a.geometry, b.geometry),
>>> st_disjoint(b.geometry, a.geometry)
>>> from test.eflowpath a, test.eflowpath b
>>> where b.id = '889105be-5782-43f1-b50c-5a5825c83875' and a.id = 
>>> 'e5703673-a995-472e-b4b4-0280143eba0c'
>>> 
>>> Results:
>>> ---
>>> e5703673-a995-472e-b4b4-0280143eba0c
>>> 889105be-5782-43f1-b50c-5a5825c83875
>>> false
>>> false
>>> true
>>> true
>>> ---
>>> 
>>> I thought perhaps this had something to do with the indexes so I removed 
>>> all geometry indexes from the table and re-ran the initial query. In 
>>> postgis 3.2 this returned the same results as the indexed query.
>>> Note: In PostGIS 3.1.2 this also returned three rows with intersects and 
>>> disjoint true. As noted above with indexes in 3.1.2 only 2 rows were 
>>> returned where intersects and disjoint were true.
>>> 
>>> Similar results occurred if st_dwithin from the where statement was 
>>> increased to 0.01.
>>> 
>>> Test Data: When I made a table with only the edges in question all queries 
>>> returned expected results: st_intersects is false and st_disjoint is true. 
>>> As a result providing a small test case for this issue doesn’t seem 
>>> possible. But I am happy to provide all the data - there are 27,444 rows.
>>> 
>>> While this isn’t a problem for me, I find it unexpected that 

Re: [postgis-users] st_intersects and st_disjoint inconsistent results

2022-02-10 Thread Emily Gouge

Here you go.  Thanks!


SELECT ST_AsHEXEWKB (geometry) FROM test.eflowpath WHERE id = 
'889105be-5782-43f1-b50c-5a5825c83875'


01022009120700642F25DC75A24CC0E4DE5740FCB34840A7CEFE9B72A24CC09DA85B2CFBB34840B5519D0E64A24CC091FAA188FBB34840FA449E245DA24CC054C2137AFDB34840F4ACFFCE51A24CC09FEB562A03B448405328C1D144A24CC09A3DD00A0CB44840404C10C03CA24CC0EA07FE6910B44840

SELECT ST_AsHEXEWKB (geometry) FROM test.eflowpath WHERE id = 
'e5703673-a995-472e-b4b4-0280143eba0c'


01022009120E0004BE47A23CA24CC098A1F14410B448409871AEBC3FA24CC078341F2114B448400858AB764DA24CC09D0546031DB448406BFD3E2D50A24CC0BEDDEDD522B4484004824AA654A24CC02DC9A60128B44840EE377FB850A24CC0FA18BD642DB44840CCAF8B474EA24CC02CCCE78134B44840D7158E7B4EA24CC01D7C17A53AB44840ACFA01B452A24CC02688BA0F40B44840DB508C8752A24CC006CDF80846B44840A1F31ABB44A24CC0C891730756B44840009AF7EE45A24CC06B7649415CB448408C2ECAC749A24CC0CE57248161B44840A74302A150A24CC07DD00E1368B44840

On 2022-02-10 5:57 p.m., Paul Ramsey wrote:




On Feb 10, 2022, at 4:55 PM, Emily Gouge  wrote:

I have a linear dataset on which I was building a query to find edges that are 
“very close” but don’t touch. While working on this query I found some 
unexpected results with the st_intersects and st_disjoint functions. As 
outlined below, the query returned true for both st_instersects and st_disjoint 
for a few geometries comparisons, but ONLY when a where clause was used to 
filter the geometries spatially. When unique identifiers were used to filter 
geometries only st_disjoint returns true.

Versions:
Except where noted otherwise the results below reference testing on these 
versions:
POSTGIS="3.2.0 3.2.0" [EXTENSION] PGSQL="140" GEOS="3.10.1-CAPI-1.16.0" PROJ="7.2.1" LIBXML="2.9.9" 
LIBJSON="0.12" LIBPROTOBUF="1.2.1" WAGYU="0.5.0 (Internal)"
PostgreSQL 14.1, compiled by Visual C++ build 1914, 64-bit

When I run this query:
select a.id, b.id,
st_intersects(a.geometry, b.geometry),
st_intersects(b.geometry, a.geometry),
st_disjoint(a.geometry, b.geometry),
st_disjoint(b.geometry, a.geometry)
from test.eflowpath a, test.eflowpath b
where a.id != b.id
and st_dwithin(a.geometry, b.geometry, 0.1)
and st_disjoint(a.geometry, b.geometry);

PostGIS 3.2: 50 rows were returned, but there are three rows that return true 
for both st_disjoint and st_intersects. Given the query this in itself is a bit 
odd as you'd expect reciprocal results for the pairs of the geometry (so at 
least 4 rows).
---
889105be-5782-43f1-b50c-5a5825c83875
e5703673-a995-472e-b4b4-0280143eba0c
true
true
true
true
---
0d05aabb-9ff3-4d8f-b6c7-b2b44b0868c8
3a09b2af-5932-4e36-9e3e-d8109e5463fa
true
true
true
true
---
3a09b2af-5932-4e36-9e3e-d8109e5463fa
0d05aabb-9ff3-4d8f-b6c7-b2b44b0868c8
true
true
true
true
---
...

Note: In PostGIS 3.1.2 50 rows were returned by only two rows returned true for 
both disjoint and intersects.

HOWEVER,
When I compare one pair of those edges specifically using the ids they are only 
disjoint (which is the result I would expect to see)

select a.id, b.id,
st_intersects(a.geometry, b.geometry),
st_intersects(b.geometry, a.geometry),
st_disjoint(a.geometry, b.geometry),
st_disjoint(b.geometry, a.geometry)
from test.eflowpath a, test.eflowpath b
where b.id = '889105be-5782-43f1-b50c-5a5825c83875' and a.id = 
'e5703673-a995-472e-b4b4-0280143eba0c'

Results:
---
e5703673-a995-472e-b4b4-0280143eba0c
889105be-5782-43f1-b50c-5a5825c83875
false
false
true
true
---

I thought perhaps this had something to do with the indexes so I removed all 
geometry indexes from the table and re-ran the initial query. In postgis 3.2 
this returned the same results as the indexed query.
Note: In PostGIS 3.1.2 this also returned three rows with intersects and 
disjoint true. As noted above with indexes in 3.1.2 only 2 rows were returned 
where intersects and disjoint were true.

Similar results occurred if st_dwithin from the where statement was increased 
to 0.01.

Test Data: When I made a table with only the edges in question all queries 
returned expected results: st_intersects is false and st_disjoint is true. As a 
result providing a small test case for this issue doesn’t seem possible. But I 
am happy to provide all the data - there are 27,444 rows.

While this isn’t a problem for me, I find it unexpected that the results from 
st_intersects and st_disjoint of two geometries would be different based on the 
where clause in the query (and the data in the table).

Thoughts?


The fact that a single test case returns one result, but results in a larger 
set returns another says to me that likely the issue in different code lines 
because of different cache behaviour. When you do the single test case you get 
a brute force intersects. When you do several in a batch, you get prepared 
geometry (at least, for the cases that happen after caching).

If you can provide the HEXWKB of the two geometries that showed disagreement 
(where b.id = 

Re: [postgis-users] st_intersects and st_disjoint inconsistent results

2022-02-10 Thread Paul Ramsey


> On Feb 10, 2022, at 4:55 PM, Emily Gouge  wrote:
> 
> I have a linear dataset on which I was building a query to find edges that 
> are “very close” but don’t touch. While working on this query I found some 
> unexpected results with the st_intersects and st_disjoint functions. As 
> outlined below, the query returned true for both st_instersects and 
> st_disjoint for a few geometries comparisons, but ONLY when a where clause 
> was used to filter the geometries spatially. When unique identifiers were 
> used to filter geometries only st_disjoint returns true.
> 
> Versions:
> Except where noted otherwise the results below reference testing on these 
> versions:
> POSTGIS="3.2.0 3.2.0" [EXTENSION] PGSQL="140" GEOS="3.10.1-CAPI-1.16.0" 
> PROJ="7.2.1" LIBXML="2.9.9" LIBJSON="0.12" LIBPROTOBUF="1.2.1" WAGYU="0.5.0 
> (Internal)"
> PostgreSQL 14.1, compiled by Visual C++ build 1914, 64-bit
> 
> When I run this query:
> select a.id, b.id,
> st_intersects(a.geometry, b.geometry),
> st_intersects(b.geometry, a.geometry),
> st_disjoint(a.geometry, b.geometry),
> st_disjoint(b.geometry, a.geometry)
> from test.eflowpath a, test.eflowpath b
> where a.id != b.id
> and st_dwithin(a.geometry, b.geometry, 0.1)
> and st_disjoint(a.geometry, b.geometry);
> 
> PostGIS 3.2: 50 rows were returned, but there are three rows that return true 
> for both st_disjoint and st_intersects. Given the query this in itself is a 
> bit odd as you'd expect reciprocal results for the pairs of the geometry (so 
> at least 4 rows).
> ---
> 889105be-5782-43f1-b50c-5a5825c83875
> e5703673-a995-472e-b4b4-0280143eba0c
> true
> true
> true
> true
> ---
> 0d05aabb-9ff3-4d8f-b6c7-b2b44b0868c8
> 3a09b2af-5932-4e36-9e3e-d8109e5463fa
> true
> true
> true
> true
> ---
> 3a09b2af-5932-4e36-9e3e-d8109e5463fa
> 0d05aabb-9ff3-4d8f-b6c7-b2b44b0868c8
> true
> true
> true
> true
> ---
> ...
> 
> Note: In PostGIS 3.1.2 50 rows were returned by only two rows returned true 
> for both disjoint and intersects.
> 
> HOWEVER,
> When I compare one pair of those edges specifically using the ids they are 
> only disjoint (which is the result I would expect to see)
> 
> select a.id, b.id,
> st_intersects(a.geometry, b.geometry),
> st_intersects(b.geometry, a.geometry),
> st_disjoint(a.geometry, b.geometry),
> st_disjoint(b.geometry, a.geometry)
> from test.eflowpath a, test.eflowpath b
> where b.id = '889105be-5782-43f1-b50c-5a5825c83875' and a.id = 
> 'e5703673-a995-472e-b4b4-0280143eba0c'
> 
> Results:
> ---
> e5703673-a995-472e-b4b4-0280143eba0c
> 889105be-5782-43f1-b50c-5a5825c83875
> false
> false
> true
> true
> ---
> 
> I thought perhaps this had something to do with the indexes so I removed all 
> geometry indexes from the table and re-ran the initial query. In postgis 3.2 
> this returned the same results as the indexed query.
> Note: In PostGIS 3.1.2 this also returned three rows with intersects and 
> disjoint true. As noted above with indexes in 3.1.2 only 2 rows were returned 
> where intersects and disjoint were true.
> 
> Similar results occurred if st_dwithin from the where statement was increased 
> to 0.01.
> 
> Test Data: When I made a table with only the edges in question all queries 
> returned expected results: st_intersects is false and st_disjoint is true. As 
> a result providing a small test case for this issue doesn’t seem possible. 
> But I am happy to provide all the data - there are 27,444 rows.
> 
> While this isn’t a problem for me, I find it unexpected that the results from 
> st_intersects and st_disjoint of two geometries would be different based on 
> the where clause in the query (and the data in the table).
> 
> Thoughts?

The fact that a single test case returns one result, but results in a larger 
set returns another says to me that likely the issue in different code lines 
because of different cache behaviour. When you do the single test case you get 
a brute force intersects. When you do several in a batch, you get prepared 
geometry (at least, for the cases that happen after caching).

If you can provide the HEXWKB of the two geometries that showed disagreement 
(where b.id = '889105be-5782-43f1-b50c-5a5825c83875' and a.id = 
'e5703673-a995-472e-b4b4-0280143eba0c') we can set up a test case in GEOS that 
compares the normal and prepared geometry calls and see if that's the problem.

P.


> 
> Thanks,
> Emily
> ___
> postgis-users mailing list
> postgis-users@lists.osgeo.org
> https://lists.osgeo.org/mailman/listinfo/postgis-users

___
postgis-users mailing list
postgis-users@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/postgis-users


[postgis-users] st_intersects and st_disjoint inconsistent results

2022-02-10 Thread Emily Gouge
I have a linear dataset on which I was building a query to find edges 
that are “very close” but don’t touch. While working on this query I 
found some unexpected results with the st_intersects and st_disjoint 
functions. As outlined below, the query returned true for both 
st_instersects and st_disjoint for a few geometries comparisons, but 
ONLY when a where clause was used to filter the geometries spatially. 
When unique identifiers were used to filter geometries only st_disjoint 
returns true.


Versions:
Except where noted otherwise the results below reference testing on 
these versions:
POSTGIS="3.2.0 3.2.0" [EXTENSION] PGSQL="140" GEOS="3.10.1-CAPI-1.16.0" 
PROJ="7.2.1" LIBXML="2.9.9" LIBJSON="0.12" LIBPROTOBUF="1.2.1" 
WAGYU="0.5.0 (Internal)"

PostgreSQL 14.1, compiled by Visual C++ build 1914, 64-bit

When I run this query:
select a.id, b.id,
st_intersects(a.geometry, b.geometry),
st_intersects(b.geometry, a.geometry),
st_disjoint(a.geometry, b.geometry),
st_disjoint(b.geometry, a.geometry)
from test.eflowpath a, test.eflowpath b
where a.id != b.id
and st_dwithin(a.geometry, b.geometry, 0.1)
and st_disjoint(a.geometry, b.geometry);

PostGIS 3.2: 50 rows were returned, but there are three rows that return 
true for both st_disjoint and st_intersects. Given the query this in 
itself is a bit odd as you'd expect reciprocal results for the pairs of 
the geometry (so at least 4 rows).

---
889105be-5782-43f1-b50c-5a5825c83875
e5703673-a995-472e-b4b4-0280143eba0c
true
true
true
true
---
0d05aabb-9ff3-4d8f-b6c7-b2b44b0868c8
3a09b2af-5932-4e36-9e3e-d8109e5463fa
true
true
true
true
---
3a09b2af-5932-4e36-9e3e-d8109e5463fa
0d05aabb-9ff3-4d8f-b6c7-b2b44b0868c8
true
true
true
true
---
...

Note: In PostGIS 3.1.2 50 rows were returned by only two rows returned 
true for both disjoint and intersects.


HOWEVER,
When I compare one pair of those edges specifically using the ids they 
are only disjoint (which is the result I would expect to see)


select a.id, b.id,
st_intersects(a.geometry, b.geometry),
st_intersects(b.geometry, a.geometry),
st_disjoint(a.geometry, b.geometry),
st_disjoint(b.geometry, a.geometry)
from test.eflowpath a, test.eflowpath b
where b.id = '889105be-5782-43f1-b50c-5a5825c83875' and a.id = 
'e5703673-a995-472e-b4b4-0280143eba0c'


Results:
---
e5703673-a995-472e-b4b4-0280143eba0c
889105be-5782-43f1-b50c-5a5825c83875
false
false
true
true
---

I thought perhaps this had something to do with the indexes so I removed 
all geometry indexes from the table and re-ran the initial query. In 
postgis 3.2 this returned the same results as the indexed query.
Note: In PostGIS 3.1.2 this also returned three rows with intersects and 
disjoint true. As noted above with indexes in 3.1.2 only 2 rows were 
returned where intersects and disjoint were true.


Similar results occurred if st_dwithin from the where statement was 
increased to 0.01.


Test Data: When I made a table with only the edges in question all 
queries returned expected results: st_intersects is false and 
st_disjoint is true. As a result providing a small test case for this 
issue doesn’t seem possible. But I am happy to provide all the data - 
there are 27,444 rows.


While this isn’t a problem for me, I find it unexpected that the results 
from st_intersects and st_disjoint of two geometries would be different 
based on the where clause in the query (and the data in the table).


Thoughts?

Thanks,
Emily
___
postgis-users mailing list
postgis-users@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/postgis-users