[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