ST_MakeLine devuelve geometrías no admitidas que no se representan en el visor de geometría

Aug 20 2020

Estoy tratando de ejecutar una consulta ST_MakeLine que devolverá la distancia más corta entre las coordenadas dadas El código es el siguiente:

SELECT ST_MakeLine(route.geom)  as test
FROM (SELECT *
      FROM pgr_fromAtoB('roads2_noded',73.1789,33.5183,73.1768,33.5191)
      ORDER BY seq
     ) As route

El resultado se ve así:

está claro que el resultado no muestra nulo. Pero cuando lo veo en el Visor de geometría, aparece el siguiente mensaje:

¿Alguien puede decirme qué significa este mensaje y cómo puedo encontrar una solución a este problema? El tipo de geometría de mi archivo de formas de carreteras es MULTILINESTRING.

St_AsText (route.geom) muestra el siguiente resultado:

SELECT ST_AsText( ST_MakeLine(route.geom)) FROM (SELECT *FROM pgr_fromAtoB('roads2_noded',73.1789,33.5183,73.1768,33.5191)
      ORDER BY seq
     ) As route

El uso de Select simple de pgr_fromAtoB da:

SELECT * FROM pgr_fromAtoB('roads2_noded',73.1789,33.5183,73.1768,33.5191) ORDER BY seq

Roads2_noded es el shapefile de carreteras en el que estoy trabajando que se muestra a continuación:

Respuestas

1 Mohid Aug 22 2020 at 07:28

Las funciones pg_Routing no se pueden utilizar para MultiLineStrings. Por lo tanto, primero cree una nueva tabla con todas las entradas de datos de la tabla roads2. Luego agregue las columnas de roads2 a la nueva tabla. Por ejemplo id, sub_id, name, distance, geom, etc. Luego, use la siguiente consulta para convertir la geometría MultiLineString de roads2 en LineString.

ALTER TABLE my_table
ALTER COLUMN geom TYPE geometry(linestring,4326) USING ST_GeometryN(geom, 1);

Después de eso, agregue la columna geom de roads2 a la nueva tabla. Después de eso, aplique las consultas de topología y red de carreteras, es decir, pgr_nodeNetwork y pgr_createTopology y cree la función pgr_fromAtoB Luego ejecute la consulta ST_MakeLine:

SELECT ST_MakeLine(route.geom)  as test
FROM (SELECT *
      FROM pgr_fromAtoB('my_table_noded',73.1789,33.5183,73.1768,33.5191)
      ORDER BY seq
     ) As route

El resultado mostrará la geometría: