Flows (Verbindungen + Werte) zwischen Polygonen übertragen


14

In QGIS gibt es zwei Shapefiles, die die sich bewegenden Daten zwischen Zellen und einer zusätzlichen Ebene darstellen (siehe Abbildung unten)

Beispiel_von_Shapefiles


Verschieben von Daten definiert durch:

  • Polygon "LayerA"(transparente Quadrate mit roter Kontur). Daneben bezieht es sich auch auf Kreise, die die Bewegungen innerhalb von Zellen darstellen, visualisiert an der Position von"LayerA" Geocentroiden .

    LayerA_AT

  • Polylinien-Layer "Flows"(gelbe / graue Pfeile) vermitteln Werte über Verbindungen zwischen Geozentralen von "LayerA"Features

    Flows_AT


Zielschicht:

  • Polygon "LayerB"(helllila Merkmale mit dunkelgrauem Umriss).

    LayerB_AT

Außerdem habe ich bereits "FLUX"Werte innerhalb von Zellen von "LayerA"in "LayerB"Polygone übertragen und verschoben, siehe meine vorherige Frage: Geerbte Werte zwischen Polygonen in QGIS? . Es wurde mit der %von $areaBerechnung gemacht.


Es könnte eine sinnvolle Lösung / Ansatz der Übertragung / Übertragung / Transformation fließen werden Verbindungen die durch "Flows"und ihre Werte von Relationen von "LayerA"in Relationen von dargestellt werden "LayerB".

Wie kann ich diese Verbindungen als Polylinien erreichen?

Darüber hinaus erben neue Nachrichtenflüsse einen ähnlichen Stil wie "Flows" .

Auf Anfrage kann ich ein Muster der Daten zur Verfügung stellen.

Flüsse existieren nicht zwischen Features von "LayerA", sondern zwischen Features von "LayerB" . Das Hauptziel ist es, das Attribut "FLUX"(dh von / bis) für Verbindungen zwischen "LayerB"möglichen als Tabelle / Ursprung-Ziel-Matrix zu erreichen.


Es gibt einige Anforderungen / Kriterien , die eingehalten werden sollten:

1. Es gibt keine Flussverbindungen zwischen den Teilen der Features (gelb markiert) in derselben Zelle

Bedingung_1

2. Es gibt keine Verbindungen zwischen demselben Feature, auch wenn sich seine Teile in verschiedenen Zellen befinden

Bedingung_2

3. Verbindungen bestehen zwischen Teilen von Features "LayerB"(basierend auf der "Union"Ausgabe), wenn sie sich vollständig innerhalb zweier unterschiedlicher "LayerA"Zell-Features befinden

Bedingung_3

4. Neu"FLUX" Wert, der übermittelt wird, wird wie in der Abbildung unten gezeigt berechnet.

Beispielsweise besteht eine Verbindung zwischen zwei Zellen Iund II, wo "FLUX"ist 100. Unter der Annahme , andere Werte, die "NEW_FLUX"zwischen A'und B''wird rund 1.5625. 100ist nur ein einziges Beispiel.

bedingung_4


Verweise:


1
Vielen Dank für die Bearbeitung, ich beginne zu verstehen, aber nicht sehr sicher. Können Sie Ihren ursprünglichen Beitrag noch einmal bearbeiten, um das erwartete Ergebnis hinzuzufügen? (Beispiel: Linienebene zwischen polygon_b-Zentroiden mit folgenden Feldern: - "Feld1": Erklärung, Datenversuch usw.)
J. Monticolo

1
Können wir zur Verdeutlichung in diesem GSE-Chat-Raum freier diskutieren: chat.stackexchange.com/rooms/92038/… ?
J. Monticolo

1
Aus technischer Sicht ist alles machbar, aber was wollen Sie eigentlich erreichen? Mir scheint, dass Sie versuchen, Daten aus einem Verallgemeinerungsgitter in eine feinkörnigere Geografie zu interpolieren. Wenn ich Sie nicht falsch verstanden habe, kann dies zu sehr irreführenden Ergebnissen führen. Wenn Sie keine Daten zu Flüssen auf der Ebene B haben, können diese durch keine mathematischen Tricks wiederhergestellt werden. Dies entspricht dem Zoomen unter Pixelebene und einer 3D-Drehung mit einem Bild mit niedriger Auflösung in einem ungenauen Cops-Film.
MarHoff

Antworten:


4

Theoretisch ist dies mit den virtuellen Ebenen möglich (bei Shapefiles ist der Prozess besonders lang, aber wenn sich die Ebenen in einer räumlichen Datenbank befinden, ist dies meiner Meinung nach viel schneller).

Hier der Code:

WITH inter_ab AS ( 
--create intersection between LayerA and LayerB 
SELECT LayerA.id || '_' || LayerB.FLAECHEID AS id, 
LayerA.id AS id_a, 
ST_AREA(LayerA.geometry) AS area_a, 
LayerB.FLAECHEID AS id_b, 
ST_INTERSECTION(LayerB.geometry, LayerA.geometry) AS geom 
FROM LayerA, LayerB 
WHERE ST_INTERSECTION(layerB.geometry, layerA.geometry) IS NOT NULL 
),

--calculation of the new flux value 
new_flux AS (SELECT t1.id_b AS origine, 
t2.id_b AS dest, 
SUM(Flows.flux * ST_AREA(t1.geom) / t1.area_a * ST_AREA(t2.geom) / t2.area_a) AS value  
FROM inter_ab t1, inter_ab t2, flows 
-- no connection between the same feature 
WHERE t1.id <> t2.id 
-- rule 1 
AND t1.id_a <> t2.id_a 
-- rule 2 
AND t1.id_b <> t2.id_b 
-- get flow data 
AND flows.origine = t1.id_a 
AND flows.dest = t2.id_a 
GROUP BY t1.id_b, t2.id_b
)

--create flows between original layerB features
SELECT new_flux.origine,
new_flux.dest,
new_flux.value AS flux,
make_line(ST_CENTROID(t3.geometry), ST_CENTROID(t4.geometry)) AS geom --ST_MakeLine under postGIS
FROM LayerB t3,
LayerB t4,
new_flux
WHERE t3.FLAECHEID = new_flux.origine
AND t4.FLAECHEID = new_flux.dest

Die grafische Ausgabe wird so aussehen

Ausgabe

Das Ergebnis wurde manuell getestet. Der "FLUX"Wertunterschied ist vernachlässigbar.

Die endgültige Ausgabe übernimmt Stile von "Flow"und sieht so aus

Output_Final

Ich empfehle, es mit wenigen Daten zu testen. Wenn es für große Datenmengen zu lange dauert, führen Sie die Abfragen schrittweise aus ( "inter_ab", "new_flux"), speichern Sie das Ergebnis und führen Sie die nächste Abfrage aus.


1
Entschuldigung, ich bin Französin und verwende eine offene französische Township-Datenbank als Polygon_bLayer. Das Schlüsselfeld ist id_geofla. Ich habe die Korrektur gemacht.
J. Monticolo

1
Ich habe Erklärungen hinzugefügt, hoffe das hilft.
J. Monticolo

1
Ja, es ist richtig, Polygone zu haben. Ich habe Korrekturen vorgenommen, um die gesamten polygon_b- Ebenen und polygon_a . ** Wert ** zu haben, wenn ein Flow eine Verbindung herstellt. Für mich ist das Ergebnis keine Linienebene , sondern direkt eine polygon_b- Ebene mit dem von der Flow- Ebene importierten polygon_a- Wert .
J. Monticolo

4

Sie können eine Verknüpfung zwischen den drei Ebenen erstellen und dann nach aggregieren layerB. Es können wahrscheinlich virtuelle Schichten verwendet werden. Ich bin nicht sicher, ob die wichtigen Daten in layerAoder in der flowSchicht sind. Hier ist eine (ungetestete) Möglichkeit:

SELECT b.id, b.geometry, sum(a.myVar)
FROM layerB b
LEFT JOIN flow f
   ON ST_Intersects(ST_EndPoint(f.geometry),b.geometry)
 JOIN layerA a
   ON ST_Intersects(ST_StartPoint(f.geometry),a.geometry)
GROUP BY b.id

Ich habe diese Lösung ausprobiert, es funktioniert. Die wichtigen Daten sind in "Flows".
Taras

@Taras Großartig! Sie können auch Aggregate wie sum(f.flow_var)oder sogarsum(fl.flow_var * a.poly_var)
JGH
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.