2017-05-09 3 views
0

J'ai une table roadfollowing, contenant la colonneConvertir multiligne à LINESTRING en résultat de la requête

COLUMN geom geometry(LineString,4326); 

J'ai aussi une table sub_polygon, contenant une colonne

COLUMN geom geometry(MultiPolygon,4326); 

Je veux soustraire les polygones stocké dans sub_polygon à partir de lignes stockées dans la table roadfollowing et mettre à jour la table avec ces nouvelles données.

J'ai essayé d'effectuer la requête suivante:

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; 

mais j'obtiens l'erreur suivante:

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

J'ai modifié la requête afin de vérifier les résultats sous forme de chaîne:

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; 

et je peux voir qu'il y a quelques MULTILINESTRING dans les résultats, cela ne peut pas REPRODUCTION INTERDITE dans roadnetwork.geom colonne, parce que les données ne sont pas compatibles:

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

Comment puis-je mettre à jour ma requête afin de convertir MULTILINESTRING à LINESTRING donc je peux mettre à jour avec succès ma table?

Répondre

1

Vous pouvez utiliser st_dump pour développer MultiLineStrings à LineStrings.

Quelque chose comme ça

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;