Hi mindspit,
without having taken a deep look into your code, how about something
like this?
%<-----
using System;
using System.Collections.Generic;
using GeoAPI.Geometries;
using GisSharpBlog.NetTopologySuite.Geometries;
using
GisSharpBlog.NetTopologySuite.IO;
namespace GisSharpBlog.NetTopologySuite.Samples.Technique
{
/// <summary>
/// Shows a techinque for retrieving the location of
/// intersection Points between two geometries
/// </summary>
public class IntersectionPoints
{
public static void TestTwoLinestrings()
{
var rdr = new WKTReader();
var ls1 = (ILineString) rdr.Read("LINESTRING( 0 0, 5 5, 10
0 )");
var ls2 = (ILineString) rdr.Read("LINESTRING( 0 5, 5 0, 10
5 )");
Console.WriteLine(string.Format("Intersection points of
\n'{0}' and\n'{1}':", ls1, ls2));
IGeometry pts = GetIntersectionPoints(ls1, ls2);
Console.WriteLine(pts.ToString());
}
public static void TestLinestringWithPolygon()
{
var rdr = new WKTReader();
var ls = (ILineString)rdr.Read("LINESTRING( -5 10, 25
10 )");
var pl = (IPolygon)rdr.Read("POLYGON(( 0 0, 0 20, 20 20,
20 0, 0 0 ),( 5 5, 15 5, 15 15, 5 15, 5 5 ))");
Console.WriteLine(string.Format("Intersection points of
\n'{0}' and\n'{1}':", ls, pl));
IGeometry pts = GetIntersectionPoints(ls, pl);
Console.WriteLine(pts.ToString());
}
/// <summary>
/// Gets the intersection points between two LineStrings
/// </summary>
/// <param name="ls1">1st LineString</param>
/// <param name="ls2">2nd LineString</param>
/// <returns></returns>
public static IGeometry GetIntersectionPoints(ILineString ls1,
ILineString ls2)
{
IGeometry uls = ls1.Union(ls2);
IGeometry lep1 = GetEndPoints(ls1);
IGeometry lep2 = GetEndPoints(ls2);
IGeometry lep = lep1.Union(lep2);
IGeometry nuls = uls.Union(lep);
IGeometry nlep = GetEndPoints(nuls);
return nlep.Difference(lep);
}
/// <summary>
/// Gets the intersection points between a Linestring and the
ExteriorRing and InteriorRings of a Polygon
/// </summary>
/// <param name="ls">LineString geometry</param>
/// <param name="pl">Polygon geometry</param>
/// <returns></returns>
public static IGeometry GetIntersectionPoints(ILineString ls,
IPolygon pl)
{
IGeometry pts = GetIntersectionPoints(ls,
pl.ExteriorRing);
foreach (ILineString s in pl.InteriorRings)
{
pts = pts.Union(GetIntersectionPoints(ls, s));
}
return pts;
}
/// <summary>
/// Gets endpoints of LineString and MultiLineString
Geometries
/// Original code from
GisSharpBlog.NetTopologySuite.Samples.Technique.LineStringSelfIntersections.cs
/// </summary>
/// <param name="g">Linear geometry</param>
/// <returns>Multipoint geometry</returns>
private static IGeometry GetEndPoints(IGeometry g)
{
var endPtList = new List<ICoordinate>();
if (g is ILineString)
{
var line = (ILineString) g;
endPtList.Add(line.GetCoordinateN(0));
endPtList.Add(line.GetCoordinateN(line.NumPoints -
1));
}
else if (g is IMultiLineString)
{
var mls = (IMultiLineString) g;
for (int i = 0; i < mls.NumGeometries; i++)
{
var line = (ILineString) mls.GetGeometryN(i);
endPtList.Add(line.GetCoordinateN(0));
endPtList.Add(line.GetCoordinateN(line.NumPoints -
1));
}
}
ICoordinate[] endPts = endPtList.ToArray();
return GeometryFactory.Default.CreateMultiPoint(endPts);
}
}
}
----->%
hth
FObermaier