2 votos

pgr_alphashape devuelve un polígono que se interseca a sí mismo

Después de utilizar la función pgr_drivingdistance() estoy intentando hacer un polígono con pgr_alphashape. Siguiendo el ejemplo que se encuentra en la documentación debo hacer lo siguiente: https://docs.pgrouting.org/2.4/en/pgr_alphaShape.html#pgr-alphashape

--Create a table with 1 Polygon where the agg_cost is lower then 5
DROP TABLE IF EXISTS temp.polygon; 
CREATE TABLE schema.polygon as  
SELECT ST_MakePolygon(ST_AddPoint(foo.openline, 
    ST_StartPoint(foo.openline)))
    FROM (
SELECT ST_MakeLine(points ORDER BY id) AS openline
FROM (
    SELECT ST_MakePoint(x, y) AS points, row_number() over() AS id
    FROM pgr_alphaShape('
        SELECT 
            source::integer as id, 
            ST_X(the_geom)::float as x, 
            ST_Y(the_geom)::float as y,
            agg_cost as cost
        from 
            temp.exampleresult as kar
        INNER JOIN schema.table_vertices as vert
        ON kar.source = vert.id
        where agg_cost < 5;')   
    ) AS a
) AS foo;   

Funciona y genera un polígono. Sin embargo, el polígono se auto-interseca y tiene una forma extraña. ¿Dónde debería buscar para depurar?

Así que el objetivo es crear después de una red bien llena con pgr_drivingdistance() un polígono que se basa en el agg_cost.

Esto es lo que pretendo: https://anitagraser.com/2011/02/12/drive-time-isochrones/

Supongo que la secuencia de mis puntos no es correcta.

Ok, así que sin mi unión de la agg_cost funciona perfectamente para todos los vértices. Pero con la unión no lo hace:

DROP TABLE IF EXISTS temp.polygon; 
CREATE TABLE schema.polygon as  
SELECT ST_MakePolygon(ST_AddPoint(foo.openline, 
    ST_StartPoint(foo.openline)))
    FROM (
SELECT ST_MakeLine(points ORDER BY id) AS openline
FROM (
    SELECT ST_MakePoint(x, y) AS points, row_number() over() AS id
    FROM pgr_alphaShape('
        SELECT 
            source::integer as id, 
            ST_X(the_geom)::float as x, 
            ST_Y(the_geom)::float as y,
            agg_cost as cost
        from 
            schema.table_vertices') 
    ) AS a
) AS foo;

1voto

knups Puntos 43

En mi memoria, hay un caso en el que el resultado de la forma alfa incluye múltiples polígonos con separador (coordenada x = null y y = null).

Así que, ¿podría comprobar el separador o simplemente intentar utilizar la función pgr_pointsAsPolygon que soporta este caso de polígonos múltiples?

[pgr_pointsAsPolygon - pgRouting Manual (2.4)] https://docs.pgrouting.org/2.4/en/pgr_pointsAsPolygon.html#pgr-points-as-polygon

Puedes ver la lógica de pgr_pointsAsPolygon en aquí. https://github.com/pgRouting/pgrouting/blob/v2.4.2/src/alpha_shape/sql/alpha_shape.sql#L59-L93

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X