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

Paul Ramsey pramsey at cleverelephant.ca
Thu Apr 10 07:52:55 PDT 2008


Just check that the first and last points are the same before
inserting, that's all PostGIS is doing. See below:

On Thu, Apr 10, 2008 at 6:36 AM, Shad Keene <shadkeene at hotmail.com> wrote:
>
>
>
>
>           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") {

@pts = split(/,/,$cwa_entries[3]);
if( $pts[0] != $pts[@pts - 1] ) {
   print STDERR "Bad area: $cws_entries[3]\n";
   continue;
}

> $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.
> _______________________________________________
>  postgis-users mailing list
>  postgis-users at postgis.refractions.net
>  http://postgis.refractions.net/mailman/listinfo/postgis-users
>
>



More information about the postgis-users mailing list