Postgis: Innenhöfe (Table 2) aus Gebäuden (Table 1) ausschneiden

Hi,

ich habe ein ziemlich blödes Problem an dem ich bereits ein paar Tage sitze:

Ich habe zwei Tables in meiner Datenbank, ein Table mit Häusern (Geometriespalte: geom) und einen Table mit Innenhöfen (Geometriespalte: geom). Jetzt will ich die Innenhöfe aus den Gebäuden herausschneiden, finde aber nicht die richtige funktion. Im Netz bin ich auf “ST_Difference” gestoßen, finde aber kein gutes Beispiel.

Außerdem sehe ich ein Problem mit Gebäuden, bei denen im Innenhof ein weiteres Gebäude steht, wie vllt auf folgendem Bild klar wird. Sind ca. 2 Millionen Gebäude in der Datenbank.

Vllt hat ja jemand ein gute Beispiel wie ich die Innenhöfe “ausstanzen” kann.

Grüße

Bei Intersect kommt es vielleicht auf die Reihenfolge der Parameter an, jenachdem erhälst Du dann gar nichts oder das was Du haben willst.

Evtl. hilft auch st_union, das gleich mehrere Objekte im Array schluckt und ein Gesamtergebnis liefert, inkl. Innenhöfe.

Du kannst die Funktionen ST_INTERIORRING verwenden. Dann könntest du aus dem Ergebnis noch mit ST_CONTAINS oder einer ähnlichen Selektion die Höfe von den Gebäuden separieren.
Gruß Uwe

Danke für eure Antworten. Ich hab ein Beispiel im Netz gefunden, bei dem jemand Wälder und Seen verschneidet. Hab alle Tablebezeichnungen durch meine ersetzt, aber nach ca. 30min und erfolgreicher Ausführung sehe ich den neuen Table nicht, den ich in Zeile 1 erstelle.

    -- Get all the building_core with building_courtyards, with the building_courtyards cut out
    CREATE TABLE vt_views.dtk50_gebaeude_mod AS WITH building_core AS (
        SELECT
            *
        FROM
            vt_views.building_core
    ),
    building_courtyard AS (
        SELECT
            *
        FROM
            vt_views.building_courtyard
    )
    SELECT
        DISTINCT building_core.id AS building_core_id,
        ST_Difference(
            building_core.geom,
            (
                SELECT
                    ST_Union(building_courtyard.geom) -- Correlated subquery to fetch only the building_courtyards intersected by the current building_core
                FROM
                    building_courtyard
                WHERE
                    ST_Intersects(
                        building_courtyard.geom,
                        building_core.geom
                    )
            )
        ) AS geom
    FROM
        building_core,
        building_courtyard
    WHERE
        ST_Intersects(
            building_courtyard.geom,
            building_core.geom
        );
     
     
    -- otherwise give blank geom columns for the no-hits
    -- Now add all the building_core that have no building_courtyards
    WITH building_core AS (
        SELECT
            *
        FROM
            vt_views.building_core
    ),
    building_courtyard AS (
        SELECT
            *
        FROM
            vt_views.building_courtyard
    ),
    all_building_courtyards AS (
        SELECT
            ST_Union(building_courtyard.geom) AS geom
        FROM
            building_courtyard
    )
    INSERT INTO
        vt_views.building_courtyard_cuts_into_building_core
    SELECT
        building_core.id AS building_core_id,
        building_core.geom as geom
    FROM
        building_core,
        all_building_courtyards
    WHERE
        NOT ST_Intersects(
            all_building_courtyards.geom,
            building_core.geom
        )
    ```

Ich habe hier noch etwas vergleichbares gefunden. Vielleicht hilft das?