Get intersection point with sharpmap

Topics: SharpMap v0.9 / v1.x
Sep 27, 2011 at 7:41 AM

I want to get the intersection point on a line from a outer point. I use mapinfo tables. if it is posibble how can I do ?

Sep 27, 2011 at 9:02 AM

Hello,

you can try this

myLineGeometry.Intersects(myPointGeometry)

Be carefull, it's generaly impossible to retreive the intersection between a point and a line (whatever the GIS you use: MapInfo, ArcView,..) because the point should be exactly on the line.

Eric

Coordinator
Sep 27, 2011 at 12:10 PM

Please note:

SharpMap.Geometries only check for bounding boxes. If you need true intersection testing use NTS  or you can use SharpMap.SqlServerSpatialObjects project.

Hth FObermaier

Sep 27, 2011 at 2:16 PM
Edited Sep 27, 2011 at 2:18 PM

 

private void FindIntersectPoint(SharpMap.Geometries.Point foundPoint,SharpMap.Geometries.LineString foundLine)
        {
            double growRate = 2;
             SharpMap.Geometries.LinearRing circle =  GeometryHelper.createEllipse(foundPoint, growRate, 12);
            Boolean intersection = foundLine.GetBoundingBox().Intersects(circle.GetBoundingBox());
           while (intersection!=true)
           {
               growRate += 1;
               
                SharpMap.Geometries.Geometry circGeo= SharpMap.Converters.NTS.GeometryConverter.ToSharpMapGeometry(circle.GetBoundingBox());
               if (foundLine.GetBoundingBox().Intersects(circGeo)== true)
               {
                   SharpMap.Geometries.Geometry intersectPoints = foundLine.Intersection(circGeo); // I want to get intersection point
                   intersection = true;
               }                  
           }
        }
it doesn't work
Coordinator
Sep 27, 2011 at 2:34 PM
ms08 wrote:

it doesn't work

This is not sufficient. Please provide a testcase that proves your point. What are the initial arguments of foundPoint and foundLine?

Thanks FObermaier

Sep 28, 2011 at 6:57 AM

SharpMap.Geometries.Point foundPoint = pnt1;// this point is out of the found line. It set from map click. utm coordinate.

SharpMap.Geometries.Geometry foundroad= vectorLayer.DataSource.GetGeometryByID(id);
SharpMap.Geometries.LineString line1 = foundRoadGeo as SharpMap.Geometries.LineString;
System.Collections.ObjectModel.Collection<double[]> pointsOfLine = new System.Collections.ObjectModel.Collection<double[]>();

pointsOfLine.Add(CoordinateHelper.ConvertWgsToUtm(line1.StartPoint.ToDoubleArray()));
pointsOfLine.Add(CoordinateHelper.ConvertWgsToUtm(line1.EndPoint.ToDoubleArray()));
SharpMap.Geometries.LineString line2= new SharpMap.Geometries.LineString(pointsOfLine);
FindIntersectPoint(foundPoint , line2);
/*************************************/
private void FindIntersectPoint(SharpMap.Geometries.Point foundPoint,SharpMap.Geometries.LineString foundLine)
        {
            double growRate = 2;
             SharpMap.Geometries.LinearRing circle =  GeometryHelper.createEllipse(foundPoint, growRate, 12);// draw
            Boolean intersection = foundLine.GetBoundingBox().Intersects(circle.GetBoundingBox());
           while (intersection!=true)
           {
               growRate += 1;
               
               circle = GeometryHelper.createEllipse(foundPoint,growRate,12);// create ellipse for find intersection from line
               if (foundLine.GetBoundingBox().Intersects(circGeo)== true)
               {
                   SharpMap.Geometries.Geometry intersectPoints = foundLine.Intersection(circGeo); // I want to get intersection point
                   intersection = true;
               }                  
           }
        }
****/ I want to  find a nearest point on a line from a  point that is out of the line. 

Sep 28, 2011 at 8:25 AM
Edited Sep 28, 2011 at 9:09 AM

I added a png file this link. Maybe understand easily.

http://sharpmap.codeplex.com/workitem/31518

Coordinator
Sep 28, 2011 at 9:40 PM

Again, you need to use NetTopologySuite do do that.

 

//1. convert sharpmap geometries to GeoAPI/NTS geometries.
var ntsPoint = ...
var ntsGeometry = ..

//2. create new DistanceOp
var nearestPoints = NetTopologySuite.Operation.Distance.DistanceOp.NearestPoints(ntsPoint, ntsGeometry);

//3. You will get an array of two ICoordinate instances, one representing ntsPoint
return nearestPoint[1];