2017-05-09 3 views
0

Ich habe eine roadfollowing Tabelle, enthält SpalteKonvertieren zu LINESTRING in Abfrageergebnis Mehrlinien

COLUMN geom geometry(LineString,4326); 

Ich habe auch eine sub_polygon Tabelle, enthält eine Spalte

COLUMN geom geometry(MultiPolygon,4326); 

ich die Polygone subtrahieren wollen gespeichert in sub_polygon von Liniensträngen gespeichert in roadfollowing Tabelle, und aktualisieren Sie die Tabelle mit diesen neuen Daten.

Ich habe folgende Abfrage auszuführen versucht:

WITH RESULTS as (
SELECT ST_Difference(public.roadnetwork.geom, public.sub_polygon.geom) 
FROM public.roadnetwork, public.sub_polygon 
), 

FILTERED_RESULTS as (
    SELECT RESULTS.st_difference FROM RESULTS where GeometryType(RESULTS.st_difference) <> 'GEOMETRYCOLLECTION' 
) 
UPDATE public.roadnetwork 
SET geom = FILTERED_RESULTS.st_difference 
FROM FILTERED_RESULTS; 

aber ich erhalte folgende Fehlermeldung:

ERROR: Geometry type (MultiLineString) does not match column type (LineString) 

ich die Abfrage, um geändert habe Ergebnisse im String-Format zu überprüfen:

WITH RESULTS as (
SELECT ST_Difference(public.roadnetwork.geom, public.sub_polygon.geom) 
FROM public.roadnetwork, public.sub_polygon 
), 

FILTERED_RESULTS as (
    SELECT ST_AsText(RESULTS.st_difference) FROM RESULTS where GeometryType(RESULTS.st_difference) <> 'GEOMETRYCOLLECTION' 
) 

SELECT * from FILTERED_RESULTS; 

und ich kann sehen, dass es einige in Ergebnissen gibt, die canno t in roadnetwork.geom Spalte kopiert werden, da die Daten nicht konsistent sind:

... 
MULTILINESTRING((51.5054201 25.3462475,51.505411 25.3462656,51.5052981 25.3464467,51.5051894 25.3466039,51.5049763 25.3469023,51.5048058 25.347141,51.5046538 25.347324,51.5044476 25.3475493,51.5041983 25.3478035,51.5038722 25.3481104,51.5035605 25.3483885,51.509695 25.3489269,51.5026179 25.3492445,51.5022888 25.349556),(51.5022888 25.349556,51.5022898 25.3495551),(51.5022888 25.349556,51.5017303 25.3500517)) 
LINESTRING(51.5017303 25.3500517,51.5014725 25.3502989,51.5013472 25.3504121) 
LINESTRING(51.5013472 25.3504121,51.501175 25.3505679) 
... 

Wie kann ich meine Abfrage aktualisieren, um zu konvertieren MULTILINESTRING zu LINESTRING so kann ich erfolgreich meine Tabelle aktualisieren?

Antwort

1

Sie könnten st_dump verwenden, um MultiLineStrings zu LineStrings zu erweitern.

So etwas wie dieses

WITH RESULTS as (
SELECT ST_Difference(public.roadnetwork.geom, public.sub_polygon.geom) 
FROM public.roadnetwork, public.sub_polygon 
), 

FILTERED_RESULTS as (
    SELECT RESULTS.st_difference FROM RESULTS where GeometryType(RESULTS.st_difference) <> 'GEOMETRYCOLLECTION' 
), 

expanded_results as (
    select (a.p_geom).geom 
    from (SELECT ST_Dump(FILTERED_RESULTS.st_difference)) 
), 

SELECT * from expanded_results; 
Verwandte Themen