[postgis-users] only insert valid/closed ring geometries

Paragon lr at pcorp.us
Thu Apr 10 09:24:01 PDT 2008


For this kind of situation I usually use a Try Catch block and then in the
Catch either discard the error and move on or log it.
 
I haven't used perl much, but from this, it looks like it supports Try Catch
http://snippets.dzone.com/posts/show/928
 
Hope that helps,
Leo


  _____  

From: postgis-users-bounces at postgis.refractions.net
[mailto:postgis-users-bounces at postgis.refractions.net] On Behalf Of Shad
Keene
Sent: Thursday, April 10, 2008 9:36 AM
To: postgis-users at postgis.refractions.net
Subject: [postgis-users] only insert valid/closed ring geometries





          I started using postgis recently because of the spatial
capabilities, but I'm stuck now.


I have a list of user-entered geometries that I'm inserting into a table via
perl.  I'm using the following code to insert the geometries into the table:
(ISOL basically refers to a point geometry.)


 

if ($cwa_entries[4] eq "AREA") {

$sth = $dbh->prepare("INSERT into cwa
values(GeomFromText('POLYGON(($cwa_entries[3]))', 4326), '$cwa_entries[6]',
'$cwa_entries[5]', nextval('cwa_id_seq'), '$cwa_entries[0]',
'$cwa_entries[1]', '$cwa_entries[4]')") or die "could not execute:
$DBI::errstr";

}

elsif ($cwa_entries[4] eq "LINE") {

$sth = $dbh->prepare("INSERT into cwa
values(GeomFromText('LINESTRING($cwa_entries[3])', 4326), '$cwa_entries[6]',
'$cwa_entries[5]', nextval('cwa_id_seq'), '$cwa_entries[0]',
'$cwa_entries[1]', '$cwa_entries[4]')") or die "could not execute:
$DBI::errstr";

}

elsif ($cwa_entries[4] eq "ISOL") {

$sth = $dbh->prepare("INSERT into cwa
values(GeomFromText('POINT($cwa_entries[3])', 4326), '$cwa_entries[6]',
'$cwa_entries[5]', nextval('cwa_id_seq'), '$cwa_entries[0]',
'$cwa_entries[1]', '$cwa_entries[4]')") or die "could not execute:
$DBI::errstr";

}

 

$sth->execute() or die "Could not execute: $DBI::errstr";

 

Sometimes there are values that are entered that do not represent valid
geometries.  For instance, I might get a set of coordinates that is
designated a polygon, but the last coordinates don't equal the first
coordinates(i.e. non-closed ring).  I don't have any control over the data
that reaches me(i.e. it's already designated as AREA or LINE or ISOLD(for
point).  So how can I skip the non-closed-ring geometries and only enter the
valid geometries so that my script doesn't quit on me and produce an error
before it enters all the data.  Right now, I get an error on the execute
statement, and it pretty much prevents the rest of the data from being
inserted into the database.  This may be a more perl-centered question, but
I thought there might be a postgresql command that has the effect of "insert
only if GeomFromText()...is valid", else move on to the next insert.  I did
see the ST_IsClosed(geometry) and the ST_IsValid(geometry) statements, but I
don't know how to implement them prior to the insert.  Thanks for any help.

Shad






  _____  

Get in touch in an instant. Get Windows Live Messenger now.
<http://www.windowslive.com/messenger/overview.html?ocid=TXT_TAGLM_WL_Refres
h_getintouch_042008>  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20080410/afead33b/attachment.html>


More information about the postgis-users mailing list