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.
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
)
```