Análisis de gráficas¶
Author: | Stephen Woodbridge <woodbri@swoodbridge.com> |
---|---|
Copyright: | Stephen Woodbridge. El código fuente está liberado bajo la licencia MIT-X. |
Resumen¶
Es común encontrar problemas con los gráficos que no se han construido completamente ligados con nodos o con gráficos con niveles z en intersecciónes que se han introducido incorrectamente. Otro problema es que las calles han sido introducidas en la dirección equivocada. No podemos detectar errores con respecto a la verdad respecto a la “tierra”, pero podemos buscar inconsistencias y algunas anomalías en un gráfico y les reportarlas para inspecciones adicionales.
Nosotros no tenemos herramientas de visualización para estos problemas, pero se ha utilizado MapServer para reproducir la gráfica y poner en relieve las áreas con problemas potenciales. Alguien familiarizado con graphviz podría contribuir con herramientas para generar imágenes para este propósito.
Analizar un gráfico¶
Con pgr_analyzeGraph el gráfico puede comprobarse errores. Por ejemplo para la tabla “mytab” que tiene “mytab_vertices_pgr” como la tabla de vértices:
SELECT pgr_analyzeGraph('mytab', 0.000002);
NOTICE: Performing checks, pelase wait...
NOTICE: Analyzing for dead ends. Please wait...
NOTICE: Analyzing for gaps. Please wait...
NOTICE: Analyzing for isolated edges. Please wait...
NOTICE: Analyzing for ring geometries. Please wait...
NOTICE: Analyzing for intersections. Please wait...
NOTICE: ANALYSIS RESULTS FOR SELECTED EDGES:
NOTICE: Isolated segments: 158
NOTICE: Dead ends: 20028
NOTICE: Potential gaps found near dead ends: 527
NOTICE: Intersections detected: 2560
NOTICE: Ring geometries: 0
pgr_analyzeGraph
----------
OK
(1 row)
En la tabla de vértices “mytab_vertices_pgr”:
- Incorrectos son identificados por cnt=1
- Se identifican problemas potenciales brecha con``chk=1``.
SELECT count(*) as deadends FROM mytab_vertices_pgr WHERE cnt = 1;
deadends
----------
20028
(1 row)
SELECT count(*) as gaps FROM mytab_vertices_pgr WHERE chk = 1;
gaps
-----
527
(1 row)
Si se tienen segmentos aislados de caminos, por ejemplo, un segmento en el cual los dos extremos son callejones sin salida, se pueden encontrar con la siguiente consulta:
SELECT *
FROM mytab a, mytab_vertices_pgr b, mytab_vertices_pgr c
WHERE a.source=b.id AND b.cnt=1 AND a.target=c.id AND c.cnt=1;
Si quieren visualizar en una imagen gráfica, entonces usted puede utilizar algo como MapServer para representar los bordes y los vértices y el estilizar en base a cnt o si están aislados, etc. También se puede hacer esto con una herramienta como graphviz o geoserver u otras herramientas similares.
Analizar las calles unidireccionales¶
pgr_analyzeOneway analiza calles de sentido único en un grafo e identifica segmentos invertidos. Básicamente, si se cuentan los bordes entrada en un nodo y los bordes de salida de un nodo el número tiene que ser mayor que uno.
Esta consulta agrega dos columnas a la tabla vertices_tmp ein int y eout int (ein = borde de entrada, eout=borde de salida) y las rellena con los conteos correspondientes. Después de su ejecución, en un grafo se pueden identificar los nodos con problemas potenciales utilizando la siguiente consulta.
Las reglas se definen como un conjunto de cadenas de texto que si coinciden con el valor de col se considera como válido para el origen o destino dentro o fuera de la condición.
Ejemplo¶
Supongamos que tenemos una tabla “st” de bordes y una columna “one_way” que podría tener valores como:
- ‘FT’ - dirección unidireccional de la fuente para el nodo de destino.
- ‘TF’ - dirección unidireccional desde el nodo destino hasta el nodo fuente.
- ‘B’ - calle de doble sentido.
- ‘’- campo vacío, suponer doble sentido.
- <NULL> - Campo NULL, usar bandera de two_way_if_null, es decir, doble sentido cuando nulo.
Entonces se puede formar la siguiente consulta para analizar las calles unidireccionales para errores.
SELECT pgr_analyzeOneway('mytab',
ARRAY['', 'B', 'TF'],
ARRAY['', 'B', 'FT'],
ARRAY['', 'B', 'FT'],
ARRAY['', 'B', 'TF'],
);
-- now we can see the problem nodes
SELECT * FROM mytab_vertices_pgr WHERE ein=0 OR eout=0;
-- and the problem edges connected to those nodes
SELECT gid FROM mytab a, mytab_vertices_pgr b WHERE a.source=b.id AND ein=0 OR eout=0
UNION
SELECT gid FROM mytab a, mytab_vertices_pgr b WHERE a.target=b.id AND ein=0 OR eout=0;
Normalmente estos problemas son generados por una rotura en la red, la dirección un camino equivocado, quizás un error relacionado con niveles z o una red que no esté debidamente indicada con nodos.
Las herramientas anteriores no detectan todos los problemas de la red, pero identifican algunos problemas comunes. Hay otros problemas que son difíciles de detectar porque son más globales en su naturaleza como múltiples redes desconectadas. Piense usted en una isla con una red de carreteras que no está conectada a la red del continente porque faltan las rutas del puente o del ferry.