/usr/share/doc/postgresql-9.5-pgrouting-doc/html/en/doc/src/tutorial/analytics.html is in postgresql-9.5-pgrouting-doc 2.1.0-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Graph Analytics — pgRouting Manual (2.1.0)</title>
<link rel="stylesheet" href="../../../_static/haiku.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../../../',
VERSION: '2.1.0 (b38118a master)',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../_static/mathjax/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="shortcut icon" href="../../../_static/favicon.ico"/>
<link rel="top" title="pgRouting Manual (2.1.0)" href="../../index.html" />
<link rel="up" title="Tutorial" href="index.html" />
<link rel="next" title="Dictionary of columns & Custom Query" href="custom_query.html" />
<link rel="prev" title="Routing Topology" href="topology.html" />
</head>
<body role="document">
<div class="header" role="banner"><img class="rightlogo" src="../../../_static/pgrouting.png" alt="Logo"/><h1 class="heading"><a href="../../../index.html">
<span>pgRouting Manual (2.1.0)</span></a></h1>
<h2 class="heading"><span>Graph Analytics</span></h2>
</div>
<div class="topnav" role="navigation" aria-label="top navigation">
<p>
«  <a href="topology.html">Routing Topology</a>
  ::  
<a class="uplink" href="../../index.html">Contents</a>
  ::  
<a href="custom_query.html">Dictionary of columns & Custom Query</a>  »
</p>
</div>
<div class="content">
<div class="section" id="graph-analytics">
<span id="analytics"></span><h1>Graph Analytics<a class="headerlink" href="#graph-analytics" title="Permalink to this headline">¶</a></h1>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Author:</th><td class="field-body">Stephen Woodbridge <<a class="reference external" href="mailto:woodbri%40swoodbridge.com">woodbri<span>@</span>swoodbridge<span>.</span>com</a>></td>
</tr>
<tr class="field-even field"><th class="field-name">Copyright:</th><td class="field-body">Stephen Woodbridge. The source code is released under the MIT-X license.</td>
</tr>
</tbody>
</table>
<div class="section" id="overview">
<h2>Overview<a class="headerlink" href="#overview" title="Permalink to this headline">¶</a></h2>
<p>It is common to find problems with graphs that have not been constructed fully noded or in graphs with z-levels at intersection that have been entered incorrectly. An other problem is one way streets that have been entered in the wrong direction. We can not detect errors with respect to “ground” truth, but we can look for inconsistencies and some anomalies in a graph and report them for additional inspections.</p>
<p>We do not current have any visualization tools for these problems, but I have used mapserver to render the graph and highlight potential problem areas. Someone familiar with graphviz might contribute tools for generating images with that.</p>
</div>
<div class="section" id="analyze-a-graph">
<h2>Analyze a Graph<a class="headerlink" href="#analyze-a-graph" title="Permalink to this headline">¶</a></h2>
<p>With <a class="reference internal" href="../../../src/common/doc/functions/analyze_graph.html#pgr-analyze-graph"><span>pgr_analyzeGraph</span></a> the graph can be checked for errors. For example for table “mytab” that has “mytab_vertices_pgr” as the vertices table:</p>
<div class="highlight-sql"><div class="highlight"><pre><span class="k">SELECT</span> <span class="n">pgr_analyzeGraph</span><span class="p">(</span><span class="s1">'mytab'</span><span class="p">,</span> <span class="mi">0</span><span class="p">.</span><span class="mi">000002</span><span class="p">);</span>
<span class="n">NOTICE</span><span class="p">:</span> <span class="n">Performing</span> <span class="n">checks</span><span class="p">,</span> <span class="n">pelase</span> <span class="n">wait</span><span class="p">...</span>
<span class="n">NOTICE</span><span class="p">:</span> <span class="n">Analyzing</span> <span class="k">for</span> <span class="n">dead</span> <span class="n">ends</span><span class="p">.</span> <span class="n">Please</span> <span class="n">wait</span><span class="p">...</span>
<span class="n">NOTICE</span><span class="p">:</span> <span class="n">Analyzing</span> <span class="k">for</span> <span class="n">gaps</span><span class="p">.</span> <span class="n">Please</span> <span class="n">wait</span><span class="p">...</span>
<span class="n">NOTICE</span><span class="p">:</span> <span class="n">Analyzing</span> <span class="k">for</span> <span class="n">isolated</span> <span class="n">edges</span><span class="p">.</span> <span class="n">Please</span> <span class="n">wait</span><span class="p">...</span>
<span class="n">NOTICE</span><span class="p">:</span> <span class="n">Analyzing</span> <span class="k">for</span> <span class="n">ring</span> <span class="n">geometries</span><span class="p">.</span> <span class="n">Please</span> <span class="n">wait</span><span class="p">...</span>
<span class="n">NOTICE</span><span class="p">:</span> <span class="n">Analyzing</span> <span class="k">for</span> <span class="n">intersections</span><span class="p">.</span> <span class="n">Please</span> <span class="n">wait</span><span class="p">...</span>
<span class="n">NOTICE</span><span class="p">:</span> <span class="n">ANALYSIS</span> <span class="n">RESULTS</span> <span class="k">FOR</span> <span class="n">SELECTED</span> <span class="n">EDGES</span><span class="p">:</span>
<span class="n">NOTICE</span><span class="p">:</span> <span class="n">Isolated</span> <span class="n">segments</span><span class="p">:</span> <span class="mi">158</span>
<span class="n">NOTICE</span><span class="p">:</span> <span class="n">Dead</span> <span class="n">ends</span><span class="p">:</span> <span class="mi">20028</span>
<span class="n">NOTICE</span><span class="p">:</span> <span class="n">Potential</span> <span class="n">gaps</span> <span class="k">found</span> <span class="n">near</span> <span class="n">dead</span> <span class="n">ends</span><span class="p">:</span> <span class="mi">527</span>
<span class="n">NOTICE</span><span class="p">:</span> <span class="n">Intersections</span> <span class="n">detected</span><span class="p">:</span> <span class="mi">2560</span>
<span class="n">NOTICE</span><span class="p">:</span> <span class="n">Ring</span> <span class="n">geometries</span><span class="p">:</span> <span class="mi">0</span>
<span class="n">pgr_analyzeGraph</span>
<span class="c1">----------</span>
<span class="n">OK</span>
<span class="p">(</span><span class="mi">1</span> <span class="k">row</span><span class="p">)</span>
</pre></div>
</div>
<p>In the vertices table “mytab_vertices_pgr”:</p>
<blockquote>
<div><ul class="simple">
<li>Deadends are indentified by <code class="docutils literal"><span class="pre">cnt=1</span></code></li>
<li>Potencial gap problems are identified with <code class="docutils literal"><span class="pre">chk=1</span></code>.</li>
</ul>
</div></blockquote>
<div class="highlight-sql"><div class="highlight"><pre><span class="k">SELECT</span> <span class="k">count</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="k">as</span> <span class="n">deadends</span> <span class="k">FROM</span> <span class="n">mytab_vertices_pgr</span> <span class="k">WHERE</span> <span class="n">cnt</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="n">deadends</span>
<span class="c1">----------</span>
<span class="mi">20028</span>
<span class="p">(</span><span class="mi">1</span> <span class="k">row</span><span class="p">)</span>
<span class="k">SELECT</span> <span class="k">count</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="k">as</span> <span class="n">gaps</span> <span class="k">FROM</span> <span class="n">mytab_vertices_pgr</span> <span class="k">WHERE</span> <span class="n">chk</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="n">gaps</span>
<span class="c1">-----</span>
<span class="mi">527</span>
<span class="p">(</span><span class="mi">1</span> <span class="k">row</span><span class="p">)</span>
</pre></div>
</div>
<p>For isolated road segments, for example, a segment where both ends are deadends. you can find these with the following query:</p>
<div class="highlight-sql"><div class="highlight"><pre><span class="k">SELECT</span> <span class="o">*</span>
<span class="k">FROM</span> <span class="n">mytab</span> <span class="n">a</span><span class="p">,</span> <span class="n">mytab_vertices_pgr</span> <span class="n">b</span><span class="p">,</span> <span class="n">mytab_vertices_pgr</span> <span class="k">c</span>
<span class="k">WHERE</span> <span class="n">a</span><span class="p">.</span><span class="k">source</span><span class="o">=</span><span class="n">b</span><span class="p">.</span><span class="n">id</span> <span class="k">AND</span> <span class="n">b</span><span class="p">.</span><span class="n">cnt</span><span class="o">=</span><span class="mi">1</span> <span class="k">AND</span> <span class="n">a</span><span class="p">.</span><span class="n">target</span><span class="o">=</span><span class="k">c</span><span class="p">.</span><span class="n">id</span> <span class="k">AND</span> <span class="k">c</span><span class="p">.</span><span class="n">cnt</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
</pre></div>
</div>
<p>If you want to visualize these on a graphic image, then you can use something like mapserver to render the edges and the vertices and style based on <code class="docutils literal"><span class="pre">cnt</span></code> or if they are isolated, etc. You can also do this with a tool like graphviz, or geoserver or other similar tools.</p>
</div>
<div class="section" id="analyze-one-way-streets">
<h2>Analyze One Way Streets<a class="headerlink" href="#analyze-one-way-streets" title="Permalink to this headline">¶</a></h2>
<p><a class="reference internal" href="../../../src/common/doc/functions/analyze_oneway.html#pgr-analyze-oneway"><span>pgr_analyzeOneway</span></a> analyzes one way streets in a graph and identifies any flipped segments. Basically if you count the edges coming into a node and the edges exiting a node the number has to be greater than one.</p>
<p>This query will add two columns to the vertices_tmp table <code class="docutils literal"><span class="pre">ein</span> <span class="pre">int</span></code> and <code class="docutils literal"><span class="pre">eout</span> <span class="pre">int</span></code> and populate it with the appropriate counts. After running this on a graph you can identify nodes with potential problems with the following query.</p>
<p>The rules are defined as an array of text strings that if match the <code class="docutils literal"><span class="pre">col</span></code> value would be counted as true for the source or target in or out condition.</p>
</div>
<div class="section" id="example">
<h2>Example<a class="headerlink" href="#example" title="Permalink to this headline">¶</a></h2>
<p>Lets assume we have a table “st” of edges and a column “one_way” that might have values like:</p>
<blockquote>
<div><ul class="simple">
<li>‘FT’ - oneway from the source to the target node.</li>
<li>‘TF’ - oneway from the target to the source node.</li>
<li>‘B’ - two way street.</li>
<li>‘’ - empty field, assume twoway.</li>
<li><NULL> - NULL field, use two_way_if_null flag.</li>
</ul>
</div></blockquote>
<p>Then we could form the following query to analyze the oneway streets for errors.</p>
<div class="highlight-sql"><div class="highlight"><pre><span class="k">SELECT</span> <span class="n">pgr_analyzeOneway</span><span class="p">(</span><span class="s1">'mytab'</span><span class="p">,</span>
<span class="nb">ARRAY</span><span class="p">[</span><span class="s1">''</span><span class="p">,</span> <span class="s1">'B'</span><span class="p">,</span> <span class="s1">'TF'</span><span class="p">],</span>
<span class="nb">ARRAY</span><span class="p">[</span><span class="s1">''</span><span class="p">,</span> <span class="s1">'B'</span><span class="p">,</span> <span class="s1">'FT'</span><span class="p">],</span>
<span class="nb">ARRAY</span><span class="p">[</span><span class="s1">''</span><span class="p">,</span> <span class="s1">'B'</span><span class="p">,</span> <span class="s1">'FT'</span><span class="p">],</span>
<span class="nb">ARRAY</span><span class="p">[</span><span class="s1">''</span><span class="p">,</span> <span class="s1">'B'</span><span class="p">,</span> <span class="s1">'TF'</span><span class="p">],</span>
<span class="p">);</span>
<span class="c1">-- now we can see the problem nodes</span>
<span class="k">SELECT</span> <span class="o">*</span> <span class="k">FROM</span> <span class="n">mytab_vertices_pgr</span> <span class="k">WHERE</span> <span class="n">ein</span><span class="o">=</span><span class="mi">0</span> <span class="k">OR</span> <span class="n">eout</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="c1">-- and the problem edges connected to those nodes</span>
<span class="k">SELECT</span> <span class="n">gid</span> <span class="k">FROM</span> <span class="n">mytab</span> <span class="n">a</span><span class="p">,</span> <span class="n">mytab_vertices_pgr</span> <span class="n">b</span> <span class="k">WHERE</span> <span class="n">a</span><span class="p">.</span><span class="k">source</span><span class="o">=</span><span class="n">b</span><span class="p">.</span><span class="n">id</span> <span class="k">AND</span> <span class="n">ein</span><span class="o">=</span><span class="mi">0</span> <span class="k">OR</span> <span class="n">eout</span><span class="o">=</span><span class="mi">0</span>
<span class="k">UNION</span>
<span class="k">SELECT</span> <span class="n">gid</span> <span class="k">FROM</span> <span class="n">mytab</span> <span class="n">a</span><span class="p">,</span> <span class="n">mytab_vertices_pgr</span> <span class="n">b</span> <span class="k">WHERE</span> <span class="n">a</span><span class="p">.</span><span class="n">target</span><span class="o">=</span><span class="n">b</span><span class="p">.</span><span class="n">id</span> <span class="k">AND</span> <span class="n">ein</span><span class="o">=</span><span class="mi">0</span> <span class="k">OR</span> <span class="n">eout</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
</pre></div>
</div>
<p>Typically these problems are generated by a break in the network, the one way direction set wrong, maybe an error related to z-levels or a network that is not properly noded.</p>
<p>The above tools do not detect all network issues, but they will identify some common problems. There are other problems that are hard to detect because they are more global in nature like multiple disconnected networks. Think of an island with a road network that is not connected to the mainland network because the bridge or ferry routes are missing.</p>
</div>
<div class="section" id="see-also">
<h2>See Also<a class="headerlink" href="#see-also" title="Permalink to this headline">¶</a></h2>
<ul class="simple">
<li><a class="reference internal" href="../../../src/common/doc/functions/analyze_graph.html#pgr-analyze-graph"><span>pgr_analyzeGraph</span></a></li>
<li><a class="reference internal" href="../../../src/common/doc/functions/analyze_oneway.html#pgr-analyze-oneway"><span>pgr_analyzeOneway</span></a></li>
<li><a class="reference internal" href="../../../src/common/doc/functions/node_network.html#pgr-node-network"><span>pgr_nodeNetwork</span></a></li>
</ul>
</div>
</div>
</div>
<div class="bottomnav" role="navigation" aria-label="bottom navigation">
<p>
«  <a href="topology.html">Routing Topology</a>
  ::  
<a class="uplink" href="../../index.html">Contents</a>
  ::  
<a href="custom_query.html">Dictionary of columns & Custom Query</a>  »
</p>
</div>
<div class="footer" role="contentinfo">
© Copyright pgRouting Contributors - Version 2.1.0 (b38118a master).
Last updated on Feb 05, 2016.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.5.
</div>
</body>
</html>
|