2016-06-02 8 views
0

Ich habe 200 Punkte (= indigene Gemeinden), ich habe 3 Pufferbereiche (= Flächenbedarf für Ökosystemdienstleistungen) in jedem Feld zentriert. Was ich wirklich brauchen, ist 2. und 3. Puffer nicht aus der Mitte des Umfangs starten, aber von wo aus sie den vorherigen Puffer endet, wie ein Ring anstelle eines Umfangs:Löschfunktion nach ID für überlagerte Pufferbereiche

BUFFER 1 = 0 bis 8 km

BUFFER 2 = 8 bis 14 km (nicht 0-14)

BUFFER 3 = 14 bis 18 km (nicht 0-18)

die Puffer supperimposed sind, so dass, wenn I verwenden, um die Funktion "löschen" Ich bekomme kein gutes Ergebnis: Zwischen ihnen sind Ringe geschnitten, wie in der Abbildung gezeigt ... This is the bad result!!

Ich habe versucht, dies in QGIS zu tun, und in POSTGRESQL, mit dem folgenden Code, ohne Erfolg:

CREATE TABLE maria.buffer_km14_erase AS 
SELECT gid, buff_dist, id_comu, ST_DIFFERENCE (the_geom, 
    (SELECT ST_UNION (the_geom) FROM maria.buffer_km08)) AS the_geom 
FROM maria.buffer_km14; 

Ich glaube, ich brauche eine Klausel hinzufügen, dass „individualisieren“ jede Löschfunktion von ID, aber Ich weiß nicht, wie es geht! Irgendein Vorschlag?

Vielen Dank !!!!

+0

Bitte erläutern Sie weiter "Ich denke, ich muss eine Klausel hinzufügen, die" jede Löschfunktion nach ID individualisieren, aber ich weiß nicht, wie es geht! Irgendwelche Vorschläge? ". Wenn Sie können, geben Sie ein vereinfachtes Beispiel für die Antwort, die Sie suchen. – Alex

+0

Wenn ich "individualisieren" sage, bedeutet dies, dass jeder Puffer durch den kleineren Puffer mit der gleichen ID "gelöscht" werden sollte, d. H. Eine Operation durch ID (anstatt den gesamten 8km_Puffer aufzulösen, um die Operation auszuführen, wie jetzt). Ich habe überlegt, eine Schleife zu machen, die jedes Mal eine andere ID auswählt. Das Ergebnis sollte ein Multipolygon mit den vollständigen Ringen sein. Die schlechte Sache ist, dass ich nicht mit Schleifen in Postgresql verwendet werde! – Maria

Antwort

1

@ Alex

Ich habe es mit einer Schleife ... Hier ist der Code:

Zuerst habe ich eine leere Tabelle erstellt:

CREATE TABLE maria.buffer_km14_erase (id_comu int, the_geom geometry(Polygon,96842)) -- col names & type 

Zweitens, ich die Schleife angelegt!

DO 
$do$ 
BEGIN 
FOR i IN 1..202 LOOP -- 202 is the maximum n 
    INSERT INTO maria.buffer_km14_erase (id_comu, the_geom) -- empty table and col names 
    (SELECT id_comu, ST_DIFFERENCE (the_geom, 
    (SELECT the_geom FROM maria.buffer_km08 WHERE id_comu=i)) AS the_geom 
    FROM maria.buffer_km14 
    WHERE id_comu=i); 
END LOOP; 
END; 
$do$; 

This is the correct result

Dank !!!