Changes between Version 5 and Version 6 of UsersWikiSimplifyPreserveTopology


Ignore:
Timestamp:
Apr 8, 2012, 7:13:19 AM (12 years ago)
Author:
nicolasribotosgeo
Comment:

Legend:

Unmodified
Added
Removed
Modified
  • UsersWikiSimplifyPreserveTopology

    v5 v6  
    1515
    1616{{{
     17#!sh
    1718shp2pgsql -IiD -g geom -s 2154 DEPARTEMENT.SHP departement | psql
    1819}}}
     
    2829== Steps ==
    2930
    30 ''Steps are divided into individual queries for the sake of clarity. The process could be done in a PL/PGSQL function to generalize it'''
     31''Steps are divided into individual queries for the sake of clarity. One big query summarize them at the end of this page''
    3132
    32331. First extract the input multipolygons into polygons, keeping their departement code. This will allow us to associate attributes to each part of multipolygons at the end of the process.
    3334
    3435{{{
     36#!sql
    3537create table poly as (
    3638    select gid, code_dept, (st_dump(geom)).*
     
    4244
    4345{{{
     46#!sql
    4447create table rings as (
    4548    select st_exteriorRing((st_dumpRings(geom)).geom) as g
     
    5255
    5356{{{
     57#!sql
    5458create table simplerings as (
    5559    select st_simplifyPreserveTopology(st_linemerge(st_union(g)), 10000) as g
     
    6165
    6266{{{
     67#!sql
    6368create table simplelines as (
    6469    select (st_dump(g)).geom as g
     
    69745.rebuild the polygons, first by polygonizing the lines, with a distinct clause to eliminate overlaping segments that may prevent polygon to be created, then dump the collection of polygons into individual parts, in order to rebuild our layer.
    7075{{{
     76#!sql
    7177create table simplepolys as (
    7278    select (st_dump(st_polygonize(distinct g))).geom as g
     
    7884
    7985{{{
     86#!sql
    8087alter table simplepolys  add column gid serial primary key;
    8188create index simplepolys_geom_gist on simplepolys  using gist(g);
     
    8592
    8693{{{
     94#!sql
    8795create table simpledep as (
    8896    select code_dept, g
     
    981068. Second method is based on percentage of overlaping area comparison.
    99107{{{
     108#!sql
    100109create table simpledep as (
    101110        select distinct on (d.code_dept) d.code_dept, s.g as geom
     
    114123
    115124{{{
     125#!sql
    116126create table simple_departement as (
    117127        select code_dept, st_collect(geom) as geom
     
    131141[[Image(SPT_islands_removed.png)]]
    132142
     143== One big query ==
     144
     145{{{
     146#!sql
     147with poly as (
     148        select gid, code_dept, (st_dump(geom)).*
     149        from departement
     150) select distinct on (d.code_dept) d.code_dept, qux.geom
     151 from (
     152        select (st_dump(st_polygonize(distinct baz.geom))).geom as geom
     153        from (
     154                select (st_dump(geom)).geom as geom
     155                from (
     156                        select st_simplifyPreserveTopology(st_linemerge(st_union(geom)), 10000) as geom
     157                        from (
     158                                select st_exteriorRing((st_dumpRings(geom)).geom) as geom
     159                                from poly
     160                        ) as foo
     161                ) as bar
     162        ) as baz
     163) as qux,
     164poly d
     165where st_intersects(d.geom, qux.geom)
     166order by d.code_dept, st_area(st_intersection(qux.geom, d.geom))/st_area(qux.geom) desc;
     167}}}
     168
    133169Nicolas Ribot.