[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