Using PostGIS
creating template_postgis
http://geospatial.nomad-labs.com/2006/12/24/postgis-template-database/
sliver problems - part 1
This idiom can help filter out slivers based on size.
This query selects the features that intersect,
it also creates an intersection of those features,
and returns the resultset.
This can be used to detect and filter out slivers.
select
zd.zoning_sim as zone,
st_area(st_intersection(cl.the_geom, zd.the_geom)) as area
from
v_citylots cl,
planning.zoning_districts zd
where cl.blklot = '3514003'
and st_intersects(cl.the_geom, zd.the_geom)
order by st_area(st_intersection(cl.the_geom, zd.the_geom)) desc
sliver problems - part 2
If a simple area threshhold fails to allow sliver filtering
we might try a metric from ecology, the area to perimeter ratio.
Here is a query:
select
zd.zoning_sim as zone,
st_area(st_intersection(cl.the_geom, zd.the_geom)) as area,
st_length(st_boundary(st_intersection(cl.the_geom, zd.the_geom))) as length,
st_area(st_intersection(cl.the_geom, zd.the_geom)) / st_length(st_boundary(st_intersection(cl.the_geom, zd.the_geom))) as ap_ratio,
st_length(st_boundary(st_intersection(cl.the_geom, zd.the_geom))) / st_area(st_intersection(cl.the_geom, zd.the_geom)) as pa_ratio
from
v_citylots cl,
planning.zoning_districts zd
where cl.blklot = '3514003'
and st_intersects(cl.the_geom, zd.the_geom)
order by st_area(st_intersection(cl.the_geom, zd.the_geom)) desc
And here are the results:
zone | area | length | a2p | p2a |
|---|---|---|---|---|
C-3-G | 1756.165 | 172.792 | 10.163 | 0.098 |
NCT-3 | 0.618 | 66.608 | 0.009 | 107.696 |
The first row is a fairly normal city lot.
The second row is the sliver.
As you can see, the difference is an order of magnitude which is what we would want for a threshhold.
convert multi geometry to single geometry
These statements create a single geometry table from a multi geometry table.
The analogous arcmap operation is called explode (I think).
This is useful to help improve the rendering performance in WMS.
-- Create the single geometry is from the multi geometry.
create table my_single_geom as
select gid, objectid, distance, area, length, label, (ST_Dump(the_geom)).geom as the_geom
from my_multi_geom
-- Insert a row into geometry_columns.
-- Without this, its not a postgis layer.
-- A single geometry polygon is of type is POLYGON.
-- A multiple geometry polygon is of type is MULTIPOLYGON.
INSERT INTO geometry_columns (
f_table_catalog,
f_table_schema,
f_table_name character,
f_geometry_column,
coord_dimension,
srid,
type)
VALUES (
'',
'',
'my_single_geom'
'the_geom',
2,
900913,
'POLYGON'
)