[postgis-users] Need a method for "noding" a street network

Martin Davis mtnclimb at telus.net
Thu May 9 17:52:59 PDT 2013


Working on it...

I ran the provided sample dataset through the streaming overlay 
algorithm - took about 2 sec to node it.  For comparison, the regular 
"UnionUnary" method took about the same amount of time.  But it won't 
scale to huge datasets, whereas the streaming algorithm will.

On 5/9/2013 6:17 AM, Stephen Mather wrote:
> A couple quick thoughts on approach 2:
>
> 1) The union need only apply to intersecting geometries, rather than 
> the whole dataset.  This helps considerably with memory footprint, but 
> in some edge cases could still be a real problem.
>
> 2) We need Mr. Davis to hurry up and demonstrate streaming geometry 
> processing so we can port it to c and put it in postgis... .  :)
>
> And so, with some kibitzing , this morning I contribute no code to the 
> conversation... .  Apologies-- I've got a deadline elsewhere... .
>
> Best,
> Steve
>
>
>
>
>
>
>
> On Wed, May 8, 2013 at 10:27 AM, Stephen Woodbridge 
> <woodbri at swoodbridge.com <mailto:woodbri at swoodbridge.com>> wrote:
>
>     Hi all,
>
>     This question comes up reasonably often on the pgRouting list and
>     has been posted he on occasion under titles like "How to break
>     streets at intersections?"
>
>     It seems to me that this would be a good function to create in
>     either postgis or pgrouting.
>
>     THE PROBLEM:
>
>     I have a table of 10's of thousands of street segments to 10's of
>     millions of street segments. These street segments are LINSTRING
>     or MULTILINESTRING geometries with some arbitrary number of
>     attribute columns. The geometries may cross one another and are
>     not noded correctly for use with pgRouting.
>
>     THE RESULTS:
>
>     We want to process the table and create a new table with the same
>     structure (see comment about primary key below), and in the new
>     table all the geometries are broken at intersections and all the
>     new pieces of the original segment that have been broken have the
>     original attributes propagated to them. So if the original segment
>     has column foo='abc' and was split into 3 new segments, each of
>     the three new segments would also have foo='abc'. The exception to
>     this might be that the new table needs a new primary column as the
>     old primary key will now be duplicated for the multiple parts.
>
>     POTENTIAL SOLUTIONS:
>
>     1. I think one way to do this would be to create a topology and
>     load the table into it, then extra a new table from the topology.
>     Although I'm not sure of the specifics for doing this or the
>     efficency of doing it this way.
>
>     2. Another way seems to be using a query like:
>
>     select (st_dump(bar.the_geom)).* from (
>         select st_union(foo.the_geom) as the_geom from mytable foo
>     ) as bar;
>
>     And then taking each of the dump.geom objects and using
>     st_contains to find which original segment it belonged to so we
>     can move the attributes to the new segment. This method also loose
>     any association to the original record and forces the use of
>     st_contains to re-associate the new segments to the original segments.
>
>     My concern with this is that the st_union has to load the whole
>     table which may be 10's of millions of street segments and this
>     will likely be a memory problem. Also running the st_contains()
>     does not seems to me to be optimal.
>
>     3. Is there a good recipe for doing this somewhere that I have not
>     found? or other better approaches to this problem?
>
>     What would be the best way to add tolerance to the problem? using
>     snap to grid?
>
>     Thoughts on how to do this efficiently?
>
>     Since I'm working on the pgRouting 2.0 release I thought this
>     might be a nice function to add to that if we can come up with a
>     generic way to do this.
>
>     Thanks,
>       -Steve
>
>
>     -- Example to demonstrate st_union above
>     select st_astext((st_dump(bar.the_geom)).geom) from (
>         select st_union(foo.the_geom) as the_geom from (
>             select 'MULTILINESTRING((0 1,2 1))'::geometry as the_geom
>             union all
>             select 'MULTILINESTRING((1 0,1 2))'::geometry as the_geom
>             union all
>             select 'LINESTRING(1 1.5,2 2)'::geometry as the_geom
>             ) as foo
>         ) as bar;
>
>     "LINESTRING(1 1.5,2 2)"
>     "LINESTRING(1 0,1 1)"
>     "LINESTRING(1 1,1 1.5)"
>     "LINESTRING(1 1.5,1 2)"
>     "LINESTRING(0 1,1 1)"
>     "LINESTRING(1 1,2 1)"
>     _______________________________________________
>     postgis-users mailing list
>     postgis-users at lists.osgeo.org <mailto:postgis-users at lists.osgeo.org>
>     http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users
>
>
>
>
> _______________________________________________
> postgis-users mailing list
> postgis-users at lists.osgeo.org
> http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20130509/e7a65fac/attachment.html>


More information about the postgis-users mailing list