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

Markus Metz markus.metz.geo at gmail.com
Sa Jan 19 21:55:48 CET 2013


2013/1/19 Jürgen E. <jef at norbit.de>:
> 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,

Du meinst doch sicher das Quadrat der Umringlänge. Eine Fäche durch
die Umringlänge zu teilen macht nämlich keinen Sinn. Und was ist denn
mit den Inringlängen?

Markus

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
>
> ...............................................
> FOSSGIS 2013, Die Konferenz für Open Source GIS mit
> OpenData und OpenStreetMap erstmals in der Schweiz!
> 12.-14. Juni, HSR, Rapperswil
> http://www.fossgis.de/konferenz/2013/
>
> _______________________________________________
> FOSSGIS-Talk-Liste mailing list
> FOSSGIS-Talk-Liste at fossgis.de
> https://lists.fossgis.de/mailman/listinfo/fossgis-talk-liste