[pgrouting-users] Splitting a network to create intersections

Greg Allensworth gregor at greeninfo.org
Thu May 9 19:24:08 PDT 2013


On 5/7/2013 8:57 AM, Stephen Woodbridge wrote:
> If you could encapsulate this process into a stored procedure like:
> select pgr_node_network(table_in text, table_out text, ...);
> That would be a nice addition to pgrouting.

https://github.com/gregallensworth/PostGIS/blob/master/PGRouting_create_intersections.txt

The technique given by dkastl was causing multiple splits of the same 
line: if a line is crossed by two separate other lines, then there may 
be multiple overlapping cut-ups.

But ST_Node() on the ST_Union() seems to work just perfectly. And it 
accommodates linear intersections, while ST_Split() bails in those cases.



> I think the tricky part will be transfering the attribute columns from
> table_in records to the potentially multiple records that these get
> chopped into in table_out. I saw somewhere, that someone was using
> st_contains to find the original segment, but I suspect that there is a
> better way to do this.

Eventually I gave up on this, and am writing an external program to do 
it instead. What I have so far, FYI:

- ST_INTERSECTS() isn't suitable as it would find any original line 
segments which intersect, and by nature there should be multiple such 
matches (at least 2, at endpoints).

- ST_CONTAINS() only works for very simple cases, it seems due to 
rounding errors. While linestring (0 0, 10 10) does contain (2 2, 3 3), 
the linestrings cut up from (0 6, 2 0) don't necessarily map back to the 
original one precisely.

- What I have come up with is inefficient but seems effective:
ORDER BY 
ST_INTERSECTION(ST_BUFFER(original.geom,0.01),ST_BUFFER(splits.geom,0.01))
DESC LIMIT 1;
It's crude, but seems logical: the line which has the most overlap with 
this one, accounting for the fact that they may in fact only intersect 
at one point and diverge very slightly, is most likely to be the original.

- But actually applying this to fetch and update the fields, is so far a 
boondoggle. The "record" datatype in Pl/PgSQL won't allow access to 
fields named in a variable, the "row" datatype assumes a fixed table 
name in the declaration, etc. This question seems to be asked a lot, the 
answers other than "you can't" assume significant foreknowledge of the 
target table.

-- 
Greg Allensworth, Web GIS Developer
BS  A+  Network+  Security+  Linux+  Server+
GreenInfo Network - Information and Mapping in the Public Interest
564 Market Street, Suite 510  San Francisco CA 94104
PH: 415-979-0343 x302  FX: 415-979-0371    email: gregor at greeninfo.org
Web: www.GreenInfo.org     www.MapsPortal.org

Subscribe to MapLines, our e-newsletter, at www.GreenInfo.org


More information about the Pgrouting-users mailing list