I tried to use another Vector as you advised. This way, the size the the
lines Vector is not changing while iterating on it. I'm joining the new code
to this mail.

It is taking quite some time (2-3 minutes) but this time I got an exception:
java.lang.ClassCastException: com.vividsolutions.jts.geom.LineString cannot
be cast to com.vividsolutions.jts.geom.Point

at this line:
Point p = (Point) gc.getGeometryN(0);

where gc is the intersection between the two lines. Apparently, the
intersection between two LineStrings can be a LineString. I guess this means
that the two lines are identical? How could this happen? Is my algorithm
still wrong? or maybe I should just ignore when this case happens?

Regards,
Chris.

On Jan 11, 2008 7:28 PM, Justin Deoliveira <[EMAIL PROTECTED]> wrote:

> Hi Chris,
>
> I would have to mock up some data and test it but I dont think the
> problem is the method but in the management of the data structure. The
> code is modifying the same list it is iterating over... which is
> generally not a great idea.
>
> I recommend restructuring the algorithm so that when two new lines are
> created they are added to a separate list. When the outer loop termines
> add the new lines to the original list and repeat the algorithm
> terminating when there are no more new lines.
>
> Hope that helps. I could be wrong as i said since i have not run the
> code. If you find you continue to have the same problem let us know .
>
> -Justin
>
> Chris wrote:
> > Hi,
> >
> > After loading a shapefile (ESRI), I created a graph using a
> > DirectedLineStringGraphGenerator. The creation went fine but when using
> > a DijkstraShortestPathFinder.getPath() on it, I noticed that there was a
> > problem because it returned null. Apparently, the linestring graph
> > generator does not take internal intersections of
> > lines into account when building the graph. Hence, I decided to code a
> > routine to split the LineStrings at their intersection as advised there:
> > http://www.nabble.com/Re%3A-LineString-Graph-Traversal-p1489791.html
> >
> > The problem is that My routine is taking "forever" to do the splitting.
> > Either, I'm doing it wrong or it is not optimized enough. After waiting
> > for 10 minutes, it is still not finished (although, the shapefile is not
> > that big). Could someone have a look at my function and see what the
> > problem is?
> >
> > Thanks in advance,
> >
> > Best regards,
> > Chris.
> > !DSPAM:4007,4787a0db264908992556831!
> >
> >
> > ------------------------------------------------------------------------
> >
> >
> -------------------------------------------------------------------------
> > Check out the new SourceForge.net Marketplace.
> > It's the best place to buy or sell services for
> > just about anything Open Source.
> >
> http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
> >
> > !DSPAM:4007,4787a0db264908992556831!
> >
> >
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > Geotools-gt2-users mailing list
> > [email protected]
> > https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users
> >
> >
> > !DSPAM:4007,4787a0db264908992556831!
>
>
> --
> Justin Deoliveira
> The Open Planning Project
> http://topp.openplans.org
>
    private Vector<LineString> splitLines(Vector<LineString> lines) {
        Vector<LineString> new_lines = new Vector<LineString>();
        boolean first = true;
        int imax = lines.size()-1;
        do {
            if(!first) {
                imax = new_lines.size()-1; // Optimization
                // Merge the two vectors
                lines.addAll(0, new_lines);
                new_lines.clear();
            }
            for (int i = 0; i < imax; ++i) {
                LineString l1 = (LineString) lines.get(i);
                int jmax = lines.size();
                for (int j = i + 1; j < jmax; ++j) {
                    LineString l2 = (LineString) lines.get(j);
                    Geometry gc = l1.intersection(l2);
                    if (gc.getNumGeometries() > 0) {
                        // Intersection
                        Point p = (Point) gc.getGeometryN(0);
                        if (l2.getStartPoint() != p && l2.getEndPoint() != p) {
                            // Remove old line from table
                            lines.remove(j);
                            // Split into two lines
                            Coordinate[] c = new 
Coordinate[]{(l2.getStartPoint()).getCoordinate(), p.getCoordinate()};
                            lines.add(j, new LineString(new 
CoordinateArraySequence(c), new GeometryFactory()));
                            c = new Coordinate[]{p.getCoordinate(), 
(l2.getEndPoint()).getCoordinate()};
                            new_lines.add(new LineString(new 
CoordinateArraySequence(c), new GeometryFactory()));
                        }
                        if (l1.getStartPoint() != p && l1.getEndPoint() != p) {
                            // Remove old line from table
                            lines.remove(i);
                            // Split into two lines
                            Coordinate[] c = new 
Coordinate[]{(l1.getStartPoint()).getCoordinate(), p.getCoordinate()};
                            LineString new_l = new LineString(new 
CoordinateArraySequence(c), new GeometryFactory());
                            lines.add(i, new_l);
                            c = new Coordinate[]{p.getCoordinate(), 
(l1.getEndPoint()).getCoordinate()};
                            new_lines.add(new LineString(new 
CoordinateArraySequence(c), new GeometryFactory()));
                            l1 = (LineString) new_l;
                        }
                    }
                }
            }
            first = false;
        } while (new_lines.size() != 0);
        return lines;
    }
-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
_______________________________________________
Geotools-gt2-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users

Reply via email to