[FOSSGIS-Talk] Polygon so negativ puffern, dass ein bestimmter prozentualer Anteil der Polygonfläche übrig bleibt

Jürgen E. Fischer jef at norbit.de
Sa Jan 19 20:28:40 CET 2013


Moin Marco,

On Fri, 18. Jan 2013 at 09:48:29 +0100, Marco Lechner - FOSSGIS e.V. wrote:
> Interessante Fragestellung 

Find' ich auch.

> kennt jemand eine vektorbasierte Lösung?

Ausprobieren (lassen)?  Also: Gewünschte Pufferflächegröße durch Umringlänge
teilen, um einen Startwert für die Pufferbreite zu bekommen und dann
schrittweise vergrößern oder verkleinern bis das Ergebnis genau genug ist.

In PostGIS z.B.:

CREATE FUNCTION st_scalepolygon(geom GEOMETRY, factor float8) RETURNS GEOMETRY AS $$
DECLARE
        buffer float8;
        a0 float8;
        a1 float8;
        b float8;
        g GEOMETRY;
        i INTEGER;
BEGIN
        IF factor IS NULL OR factor<=0 THEN
                RAISE EXCEPTION 'invalid factor %', factor;
        END IF;

        a0 := st_area( geom );
        b  := a0 * (1-factor) / st_perimeter( geom );  -- Startbuffer
        a0 := a0 * factor; -- Zielgröße

        -- Max. 100 Iterationen
        FOR i IN 1..100 LOOP
                g := st_buffer( geom, -b );
                a1 := st_area( g );
                IF a1 = 0 THEN
                        RAISE NOTICE 'area 0 after buffer %: %', -b, st_astext(g);
                        RETURN NULL;
                END IF;

                IF a1/a0 BETWEEN 0.9999 AND 1.0001 THEN
                        RETURN g;
                END IF;

                IF b>0 THEN
                        b := b * pow(a1 / a0, 2);
                ELSE
                        b := b * pow(a0 / a1, 2);
                END IF;
        END LOOP;

        RAISE NOTICE 'nicht genau genug gesucht=%: gefunden:% wkt:%', a0, a1, st_astext( g );
        RETURN NULL;
END;
$$ LANGUAGE plpgsql;



Jürgen

-- 
Jürgen E. Fischer         norBIT GmbH               Tel. +49-4931-918175-31
Dipl.-Inf. (FH)           Rheinstraße 13            Fax. +49-4931-918175-50
Software Engineer         D-26506 Norden               http://www.norbit.de
committ(ed|ing) to Quantum GIS                         IRC: jef on FreeNode                         

-- 
norBIT Gesellschaft fuer Unternehmensberatung und Informationssysteme mbH
Rheinstrasse 13, 26506 Norden
GF: Jelto Buurman, HR: Amtsgericht Emden, HRB 5502