[postgis-users] Determining if a point is within a polygon (odd failures)

Gregory S. Williamson gsw at globexplorer.com
Thu Sep 15 14:03:52 PDT 2005


Dear peoples,

This is postgres 8.0.3, running on a linux box with 2 CPUs and 2 gigs of RAM. The postGIS version says:
 POSTGIS="1.0.1" GEOS="2.1.1" PROJ="Rel. 4.4.9, 29 Oct 2004" USE_STATS DBPROC="0.3.0" RELPROC="0.3.0"

I've got a new assignment to process data on centerpoints of requests for images on our website. I've got a procedure that can process a day's logs down to the queries of interest (say ~350000 per day) into a table:
cmnd_reqs=# \d cmnd_reqs
    Table "public.cmnd_reqs"
  Column  |   Type   | Modifiers
----------+----------+-----------
 y        | numeric  | not null
 x        | numeric  | not null
 z        | numeric  | not null
 req_pnts | geometry |
 req_date | date     |
Indexes:
    "req_pnts_x_ndx" btree (y)
    "req_pnts_y_ndx" btree (x)
Check constraints:
    "enforce_srid_req_pnts" CHECK (srid(req_pnts) = 4326)
    "enforce_dims_req_pnts" CHECK (ndims(req_pnts) = 3)
    "enforce_geotype_req_pnts" CHECK (geometrytype(req_pnts) = 'POINT'::text OR req_pnts IS NULL)

I create the req_points geometry out of the x,y and z numbers and then the fun begins. I want to createe two output tables, one for points outside of the US and one for points in the US.

Trying a bulk statement such as "CREATE TABLE us_pnts AS SELECT * FROM cmnd_reqs WHERE within(req_pnts, <big ugly geometry for the US>);" ran for a few hours and then died, telling me that postgres had been restarted.

Rats. Ok. So I made simple function to teest a point and return the result, and a perl script that iteerates through all of the points one at a time and calls the function, and then writes out the data to the relevant destinations, doing a commit every 1000 rows.

This ran for several hours and was almost done. There were 365010 rows in the cmnd_reqs table and I processed 306946 points from the US and 15054 others before this blew:

.........................................commit 1000
NOTICE:  AssertionFailedException: found single null side
Can't execute sql to test point! ERROR:  GEOS within() threw an error!
SQL is <SELECT * FROM check_a_point('01010000A0E61000004A3BED5A477752C0533F73BECE974440600BB85D2769D33F'::geometry);> at ./req_proc.pl line 53.

Curious, I tried examining the point in question:
cmnd_reqs=# select asEWKT('01010000A0E61000004A3BED5A477752C0533F73BECE974440600BB85D2769D33F'::geometry);
                               asewkt
---------------------------------------------------------------------
 SRID=4326;POINT(-73.863730174705 41.185996824525 0.303293077013384)
(1 row)

cmnd_reqs=# SELECT * FROM check_a_point('01010000A0E61000004A3BED5A477752C0533F73BECE974440600BB85D2769D33F'::geometry);
 check_a_point
---------------
 t
(1 row)

So it works from psql but not from perl ? Or perhaps I've run into some memory issue or ? What, I wonder ?

Any advice would be most welcome as I am marooned in a land of frutration and angst!

Thanks

Greg Williamson
DBA
GlobeXplorer LLC

ps -- this is my function:
BEGIN;
CREATE OR REPLACE FUNCTION check_a_point(GEOMETRY)
        RETURNS BOOLEAN AS '
DECLARE pnt_2_test ALIAS FOR $1;
        us_geom GEOMETRY;
        pnt_is_us BOOLEAN;
BEGIN
        us_geom := (SELECT the_geom FROM us_shape WHERE fips_cntry = ''US'');
        pnt_is_us := within(pnt_2_test, us_geom);
        RETURN(pnt_is_us);
END;
' LANGUAGE 'plpgsql';
COMMIT;

(yes, I know if would be best to not retrieve the US shape every time but the description of the US outline is so long I haven't been able to make it into a constant!)





More information about the postgis-users mailing list