Beispiel #1
0
        /// <summary>
        /// Computes the distance from the point to the segment. The return
        /// value is in units of sqrt(lat^2 + long^2) in WGS84 coordinates.
        /// </summary>
        /// <returns>The distance to the point in units of sqrt(lat^2 + long^2).</returns>
        /// <param name="point">Point on Earth.</param>
        public double DistanceToPoint(GeoCoordinates point)
        {
            Vector2 p1 = Endpoint1.ToVector2();
            Vector2 p2 = Endpoint2.ToVector2();

            if (CrossesMeridianRightOfP1)
            {
                p2 += new Vector2(360, 0);

                Vector2 pointRepr1 = point.ToVector2();
                Vector2 pointRepr2 = pointRepr1 + new Vector2(360, 0);

                double dist1 = Geometry2d.PointToSegmentDistance(p1, p2, pointRepr1);
                double dist2 = Geometry2d.PointToSegmentDistance(p1, p2, pointRepr2);

                return(Math.Min(dist1, dist2));
            }
            else if (CrossesMeridianLeftOfP1)
            {
                p2 -= new Vector2(360, 0);

                Vector2 pointRepr1 = point.ToVector2();
                Vector2 pointRepr2 = pointRepr1 - new Vector2(360, 0);

                double dist1 = Geometry2d.PointToSegmentDistance(p1, p2, pointRepr1);
                double dist2 = Geometry2d.PointToSegmentDistance(p1, p2, pointRepr2);

                return(Math.Min(dist1, dist2));
            }
            else
            {
                return(Geometry2d.PointToSegmentDistance(p1, p2, point.ToVector2()));
            }
        }
Beispiel #2
0
        public void DistanceToPointForSmallSegmentNotCrossingPrimeMeridian()
        {
            Vector2 point = new Vector2(1, 1);
            Vector2 segA  = new Vector2(-1, 0);
            Vector2 segB  = new Vector2(1, 0);

            GeoCoordinates geoPoint   = new GeoCoordinates(point.y, point.x);
            GeoSegment     geoSegment = new GeoSegment(
                new GeoCoordinates(segA.y, segA.x),
                new GeoCoordinates(segB.y, segB.x));

            Assert.Equal(
                Geometry2d.PointToSegmentDistance(segA, segB, point),
                geoSegment.DistanceToPoint(geoPoint),
                6);
        }