Opened 14 years ago
Closed 14 years ago
#670 closed defect (fixed)
ST_SharedPaths
Reported by: | strk | Owned by: | strk |
---|---|---|---|
Priority: | high | Milestone: | PostGIS 2.0.0 |
Component: | postgis | Version: | master |
Keywords: | Cc: |
Description
A function to find and report paths shared between two linear geometries togheter with their direction (same or opposite).
The functionality is available in GEOS development version and exposed by C-API.
PostGIS side this should be a set-returning function returning records with the structure: (same boolean, geom geometry)
Change History (13)
comment:1 by , 14 years ago
comment:2 by , 14 years ago
Type: | defect → enhancement |
---|---|
Version: | 1.5.X → trunk |
As of r6236 this is ready, and tested. Needs to be documented in the manual. Uses the GEOMETRYCOLLECTION return.
comment:3 by , 14 years ago
Sandro,
I put in some documentation for ST_SharedPaths and then passed it thru the grinder and managed to crash it. It broke on this query on my Windows 7 PostgreSQL 9.0 32 bit. Can you check and see if the below works on yours.
SELECT ST_SharedPaths(foo1.the_geom, foo2.the_geom) As result, ST_AsText(foo1.the_geom) As ref1_geom, ST_AsText(foo2.the_geom) As ref2_geom FROM ((SELECT ST_SetSRID(ST_Point(i,j),4326) As the_geom FROM (SELECT a*1.11111111 FROM generate_series(-10,50,10) As a) As i(i) CROSS JOIN generate_series(40,70, 15) j ORDER BY i,j )) As foo1 CROSS JOIN ((SELECT ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j*0.05) As the_geom FROM (SELECT a*1.11111111 FROM generate_series(-10,50,10) As a) As i(i) CROSS JOIN generate_series(40,70, 20) As j ORDER BY i, i*j, j)) As foo2 LIMIT 2;
comment:4 by , 14 years ago
Priority: | medium → high |
---|---|
Type: | enhancement → defect |
Yay, it crashes 8.4.3 on GNU/Linux 64 bit too. Good work !
comment:5 by , 14 years ago
Kind of crazy, I created a table with the result of the subquery, getting 2 records with g1/g2 and could reproduce the crash using ST_SharedPaths against g1,g2 of first record.
Those geometries I've put in the regression test and can't reproduce the issue. I wonder if it's a corruption somewhere else.
Look at this:
strk=# select st_sharedpaths(g1::text::geometry,g2::text::geometry) from bug670 where id = 1; ERROR: GEOSIntersection: IllegalArgumentException: Geometry is not lineal strk=# select st_sharedpaths(g1,g2) from bug670 where id = 1; server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request. The connection to the server was lost. Attempting reset: Failed. !>
Note that ::text givesn HEXEWKT, so there should be nothing lost. I suspect there's some corruption in internal structures _before_ SharedPaths is invoked.
comment:6 by , 14 years ago
Note the table was created with this query:
strk=# create table bug670 as SELECT foo1.the_geom as g1, foo2.the_geom As g2 FROM ((SELECT ST_SetSRID(ST_Point(i,j),4326) As the_geom FROM (SELECT a*1.11111111 FROM generate_series(-10,50,10) As a) As i(i) CROSS JOIN generate_series(40,70, 15) j ORDER BY i,j )) As foo1 CROSS JOIN ((SELECT ST_Buffer(ST_SetSRID(ST_Point(i,j),4326), j*0.05) As the_geom FROM (SELECT a*1.11111111 FROM generate_series(-10,50,10) As a) As i(i) CROSS JOIN generate_series(40,70, 20) As j ORDER BY i, i*j, j)) As foo2 LIMIT 2;
comment:7 by , 14 years ago
This succeeds too:
select st_sharedpaths(g1,g2::text) from bug670 where id = 1;
And this:
select st_sharedpaths(g2,g1) from bug670 where id = 1;
But this fails:
select st_sharedpaths(g1::text,g2) from bug670 where id = 1; -- crash !
comment:8 by , 14 years ago
Even this succeeds:
select st_sharedpaths(g1,g1) from bug670 where id = 1;
comment:9 by , 14 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
Oops. found and fixed in r6270. Sorry for the big noise.
comment:10 by , 14 years ago
Resolution: | fixed |
---|---|
Status: | closed → reopened |
Strk,
This is better, but it's still crashing for me sometimes. In the battery of tests it always crashes, but if I run standalone it doesn't always.
If I run this test 1-3 times it usually crashes by the 2nd time.
SELECT ST_SharedPaths(g1,g2), ST_SharedPaths(g2,g1), ST_SharedPaths(g1,g1) FROM bug670;
comment:11 by , 14 years ago
hrmf.. it runs valgrind clean for me now. You sure you rebuilt it ? With correct code in ?
while :; do psql -c "SELECT ST_SharedPaths(g1,g2), ST_SharedPaths(g2,g1), ST_SharedPaths(g1,g1) FROM bug670;"; done
has been gone for some time w/out a failure here
comment:12 by , 14 years ago
I think so. Unless Paul's shp2pgsql changes are impacting my build in a negative way thought he dll says it gets built and I did delete my whole folder and redownloaded.
I'll try on another machine later. If it isn't rebuilding for some reason, that could explain the ST_Snap problem.
comment:13 by , 14 years ago
Resolution: | → fixed |
---|---|
Status: | reopened → closed |
Strk,
I'm going to assume you are right and close this out for now. All my problems are pointing squarely at Paul :) Its like my install script is just installing the .sql files and not the .dlls (its hard to tell since my script builds for 3 versions of postgresql so I'll have to walk thru it). I haven't confirmed yet (the dates look new but). The tell-tale signs of new script old dlls behavior seem to match up too nicely. That would explain the ST_Snap issue as well.
But could also return a GEOMETRYCOLLECTION with first element being the "same" and the second element being the "opposite" dir shared MULTILINESTRINGS (which is what GEOS returns).
This second interface is simpler to implement/maintain and faster (as GEOS output is in the GEOMETRYCOLLECTION form already). Also, doesn't prevent you to obtain the previous proposed output by use of ST_Dump.