Opened 15 years ago

Closed 15 years ago

#258 closed defect (fixed)

ST_HausdorffDistance crashes server

Reported by: robe Owned by: pramsey
Priority: medium Milestone: PostGIS 1.5.0
Component: postgis Version: master
Keywords: Cc:

Description

This might be a GEOS problem so not really sure. I'm running the latest trunk GEOS with PostgreSQL 8.4 on windows and latest PostGIS 1.5 trunk.

This crashes server. If I leave out hausdorff works fine so must be something in the ST_HausdorffDistance that is doing it.

SELECT ST_HausdorffDistance(foo1.the_geom, foo2.the_geom), ST_AsEWKT(foo1.the_geom) As ref1_geom, ST_AsEWKT(foo2.the_geom) As ref2_geom

FROM ((SELECT ST_SetSRID(ST_Point(i,j),4326) As the_geom

FROM generate_series(-10,50,15) As 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 generate_series(-10,50,10) As i

CROSS JOIN generate_series(40,70, 20) As j ORDER BY i, i*j, j)) As foo2 LIMIT 2;

Change History (9)

comment:1 by strk, 15 years ago

if you get to the actual geoms I can take a look at the GEOS side (which lacks automated tests for HausdorffDistance btw)

comment:2 by robe, 15 years ago

Strk,

I think this may actually be a PostGIS bug or a more sinister problem you see if you run more than one at a time. I just tried and the thing is is that if I exercise each one individually, it doesn't break, but if I run the query it does.

So run individually:

SELECT ST_HausdorffDistance(ST_GeomFromText('POINT(-10 40)'), ST_GeomFromText('POLYGON((-7 60,-7.05764415879031 59.4147290339516,-7.22836140246614 58.8519497029047,-7.50559116309236 58.3332893009412,-7.87867965644036 57.8786796564404,-8.33328930094119 57.5055911630924,-8.85194970290473 57.2283614024661,-9.41472903395161 57.0576441587903,-9.99999999999999 57,-10.5852709660484 57.0576441587903,-11.1480502970953 57.2283614024661,-11.6667106990588 57.5055911630924,-12.1213203435596 57.8786796564404,-12.4944088369076 58.3332893009412,-12.7716385975339 58.8519497029047,-12.9423558412097 59.4147290339516,-13 60,-12.9423558412097 60.5852709660484,-12.7716385975339 61.1480502970953,-12.4944088369076 61.6667106990588,-12.1213203435597 62.1213203435596,-11.6667106990588 62.4944088369076,-11.1480502970953 62.7716385975339,-10.5852709660484 62.9423558412097,-10 63,-9.41472903395163 62.9423558412097,-8.85194970290474 62.7716385975339,-8.3332893009412 62.4944088369076,-7.87867965644036 62.1213203435596,-7.50559116309237 61.6667106990588,-7.22836140246614 61.1480502970953,-7.05764415879031 60.5852709660484,-7 60))') );
SELECT ST_HausdorffDistance(ST_GeomFromText('POINT(-10 40)'), ST_GeomFromText('POLYGON((-7 60,-7.05764415879031 59.4147290339516,-7.22836140246614 58.8519497029047,-7.50559116309236 58.3332893009412,-7.87867965644036 57.8786796564404,-8.33328930094119 57.5055911630924,-8.85194970290473 57.2283614024661,-9.41472903395161 57.0576441587903,-9.99999999999999 57,-10.5852709660484 57.0576441587903,-11.1480502970953 57.2283614024661,-11.6667106990588 57.5055911630924,-12.1213203435596 57.8786796564404,-12.4944088369076 58.3332893009412,-12.7716385975339 58.8519497029047,-12.9423558412097 59.4147290339516,-13 60,-12.9423558412097 60.5852709660484,-12.7716385975339 61.1480502970953,-12.4944088369076 61.6667106990588,-12.1213203435597 62.1213203435596,-11.6667106990588 62.4944088369076,-11.1480502970953 62.7716385975339,-10.5852709660484 62.9423558412097,-10 63,-9.41472903395163 62.9423558412097,-8.85194970290474 62.7716385975339,-8.3332893009412 62.4944088369076,-7.87867965644036 62.1213203435596,-7.50559116309237 61.6667106990588,-7.22836140246614 61.1480502970953,-7.05764415879031 60.5852709660484,-7 60))') );
SELECT ST_HausdorffDistance(ST_GeomFromText('POINT(-10 55)'), ST_GeomFromText('POLYGON((-7 60,-7.05764415879031 59.4147290339516,-7.22836140246614 58.8519497029047,-7.50559116309236 58.3332893009412,-7.87867965644036 57.8786796564404,-8.33328930094119 57.5055911630924,-8.85194970290473 57.2283614024661,-9.41472903395161 57.0576441587903,-9.99999999999999 57,-10.5852709660484 57.0576441587903,-11.1480502970953 57.2283614024661,-11.6667106990588 57.5055911630924,-12.1213203435596 57.8786796564404,-12.4944088369076 58.3332893009412,-12.7716385975339 58.8519497029047,-12.9423558412097 59.4147290339516,-13 60,-12.9423558412097 60.5852709660484,-12.7716385975339 61.1480502970953,-12.4944088369076 61.6667106990588,-12.1213203435597 62.1213203435596,-11.6667106990588 62.4944088369076,-11.1480502970953 62.7716385975339,-10.5852709660484 62.9423558412097,-10 63,-9.41472903395163 62.9423558412097,-8.85194970290474 62.7716385975339,-8.3332893009412 62.4944088369076,-7.87867965644036 62.1213203435596,-7.50559116309237 61.6667106990588,-7.22836140246614 61.1480502970953,-7.05764415879031 60.5852709660484,-7 60))') );
SELECT ST_HausdorffDistance(ST_GeomFromText('POINT(-10 55)'), ST_GeomFromText('POLYGON((-7 60,-7.05764415879031 59.4147290339516,-7.22836140246614 58.8519497029047,-7.50559116309236 58.3332893009412,-7.87867965644036 57.8786796564404,-8.33328930094119 57.5055911630924,-8.85194970290473 57.2283614024661,-9.41472903395161 57.0576441587903,-9.99999999999999 57,-10.5852709660484 57.0576441587903,-11.1480502970953 57.2283614024661,-11.6667106990588 57.5055911630924,-12.1213203435596 57.8786796564404,-12.4944088369076 58.3332893009412,-12.7716385975339 58.8519497029047,-12.9423558412097 59.4147290339516,-13 60,-12.9423558412097 60.5852709660484,-12.7716385975339 61.1480502970953,-12.4944088369076 61.6667106990588,-12.1213203435597 62.1213203435596,-11.6667106990588 62.4944088369076,-11.1480502970953 62.7716385975339,-10.5852709660484 62.9423558412097,-10 63,-9.41472903395163 62.9423558412097,-8.85194970290474 62.7716385975339,-8.3332893009412 62.4944088369076,-7.87867965644036 62.1213203435596,-7.50559116309237 61.6667106990588,-7.22836140246614 61.1480502970953,-7.05764415879031 60.5852709660484,-7 60))') );

Works fine — well I don't know if the numbers are right but doesn't break (returns 8 or 23);

But run together - crash of death so bad that I have to manually restart the PostgreSQL service:

SELECT ST_HausdorffDistance(foo1.the_geom, foo2.the_geom )
FROM (VALUES (ST_GeomFromText('POINT(-10 40)') ),
	( ST_GeomFromText('POINT(-10 55)') )
	) As foo1(the_geom)
	CROSS JOIN 
		 ( VALUES ( ST_GeomFromText('POLYGON((-7 60,-7.05764415879031 59.4147290339516,-7.22836140246614 58.8519497029047,-7.50559116309236 58.3332893009412,-7.87867965644036 57.8786796564404,-8.33328930094119 57.5055911630924,-8.85194970290473 57.2283614024661,-9.41472903395161 57.0576441587903,-9.99999999999999 57,-10.5852709660484 57.0576441587903,-11.1480502970953 57.2283614024661,-11.6667106990588 57.5055911630924,-12.1213203435596 57.8786796564404,-12.4944088369076 58.3332893009412,-12.7716385975339 58.8519497029047,-12.9423558412097 59.4147290339516,-13 60,-12.9423558412097 60.5852709660484,-12.7716385975339 61.1480502970953,-12.4944088369076 61.6667106990588,-12.1213203435597 62.1213203435596,-11.6667106990588 62.4944088369076,-11.1480502970953 62.7716385975339,-10.5852709660484 62.9423558412097,-10 63,-9.41472903395163 62.9423558412097,-8.85194970290474 62.7716385975339,-8.3332893009412 62.4944088369076,-7.87867965644036 62.1213203435596,-7.50559116309237 61.6667106990588,-7.22836140246614 61.1480502970953,-7.05764415879031 60.5852709660484,-7 60))' ) ),
	( ST_GeomFromText('POLYGON((-7 60,-7.05764415879031 59.4147290339516,-7.22836140246614 58.8519497029047,-7.50559116309236 58.3332893009412,-7.87867965644036 57.8786796564404,-8.33328930094119 57.5055911630924,-8.85194970290473 57.2283614024661,-9.41472903395161 57.0576441587903,-9.99999999999999 57,-10.5852709660484 57.0576441587903,-11.1480502970953 57.2283614024661,-11.6667106990588 57.5055911630924,-12.1213203435596 57.8786796564404,-12.4944088369076 58.3332893009412,-12.7716385975339 58.8519497029047,-12.9423558412097 59.4147290339516,-13 60,-12.9423558412097 60.5852709660484,-12.7716385975339 61.1480502970953,-12.4944088369076 61.6667106990588,-12.1213203435597 62.1213203435596,-11.6667106990588 62.4944088369076,-11.1480502970953 62.7716385975339,-10.5852709660484 62.9423558412097,-10 63,-9.41472903395163 62.9423558412097,-8.85194970290474 62.7716385975339,-8.3332893009412 62.4944088369076,-7.87867965644036 62.1213203435596,-7.50559116309237 61.6667106990588,-7.22836140246614 61.1480502970953,-7.05764415879031 60.5852709660484,-7 60))' )  )
	)  As foo2(the_geom);

comment:3 by nicklas, 15 years ago

Can this have a connection to what's happening in #241. I found a similar behavior there. It crashes when feeded with more than one row. In the commment in #241 I tried to narrow the error a little.

/Nicklas

comment:4 by robe, 15 years ago

That's kind of what I was thinking too that there is something more fundamentally wrong with functions that take two geometry argument. I was going to take out hausdorf from my tests and see if others crash. I had an error in my logic in my xsl (which I forget when I accidentally introduced), so I may have not been testing the 2 arg functions consistently unless they returned a geometry.

comment:5 by mcayland, 15 years ago

Hmmmm - works fine for me (Debian Lenny, 64-bit) with latest GEOS trunk and PostGIS trunk. If you're versions of everything are also up to date, it could possibly be a platform/word-size specific issue…

ATB,

Mark.

comment:6 by robe, 15 years ago

yap my stuff is up to date as of yesterday. I'll try to test on my OpenSUSE.

What about hte LineCrossingDirection issue in #241, does that crash for you too or work fine?

comment:7 by mcayland, 15 years ago

Hmmm it chucks a "ERROR: Operation on mixed SRID geometries" message at me. That tends to indicate some kind of memory clobber on the geometry somewhere…

ATB,

Mark.

comment:8 by mcayland, 15 years ago

Okay - that was easy as it was the same error as #241 which I've fixed in both st_hausdorffdistance() and st_hausdorffdistancedensify() as r4610. Please can you "svn up" and re-test?

ATB,

Mark.

comment:9 by robe, 15 years ago

Resolution: fixed
Status: newclosed

works now

Note: See TracTickets for help on using tickets.