[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