Beispiel #1
0
        public void DistanceTest()
        {
            // expected distances takes from:
            //1. Lowrance HDS7 Gen3
            //2. http://edwilliams.org/gccalc.htm
            var basePoint = new CoordinatePoint(new Latitude(60, 07.328), new Longitude(32, 18.719));

            var two = new CoordinatePoint(new Latitude(60, 12.324), new Longitude(32, 15.530));

            //Lowrance HDS7 Gen3
            Assert.AreEqual(9710, CoordinatePoint.GetDistanceBetweenPointsWithHaversine(basePoint, two).GetMeters(), 5);
            Assert.AreEqual(9710, CoordinatePoint.GetDistanceBetweenPointsOnAnEllipsoid(basePoint, two).GetMeters(), 26);

            //edwilliams.org
            Assert.AreEqual(9735.229, CoordinatePoint.GetDistanceBetweenPointsWithHaversine(basePoint, two).GetMeters(), 25);
            Assert.AreEqual(9735.229, CoordinatePoint.GetDistanceBetweenPointsOnAnEllipsoid(basePoint, two).GetMeters(), 0.01d);             //great accuracy

            two = new CoordinatePoint(new Latitude(57, 36.631), new Longitude(29, 44.306));
            //Lowrance HDS7 Gen3
            Assert.AreEqual(315800, CoordinatePoint.GetDistanceBetweenPointsWithHaversine(basePoint, two).GetMeters(), 200);
            Assert.AreEqual(315800, CoordinatePoint.GetDistanceBetweenPointsOnAnEllipsoid(basePoint, two).GetMeters(), 1000);

            //edwilliams.org
            Assert.AreEqual(316682.824, CoordinatePoint.GetDistanceBetweenPointsWithHaversine(basePoint, two).GetMeters(), 700);
            Assert.AreEqual(316682.824, CoordinatePoint.GetDistanceBetweenPointsOnAnEllipsoid(basePoint, two).GetMeters(), 10);

            two = new CoordinatePoint(new Latitude(51, 11.377), new Longitude(44, 14.519));
            Assert.AreEqual(1239000, CoordinatePoint.GetDistanceBetweenPointsWithHaversine(basePoint, two).GetMeters(), 700);
            Assert.AreEqual(1239000, CoordinatePoint.GetDistanceBetweenPointsOnAnEllipsoid(basePoint, two).GetMeters(), 5000);

            two = new CoordinatePoint(new Latitude(60, 07.317), new Longitude(32, 18.822));
            //Lowrance HDS7 Gen3
            Assert.AreEqual(97.3d, CoordinatePoint.GetDistanceBetweenPointsWithHaversine(basePoint, two).GetMeters(), 0.1d);
            Assert.AreEqual(97.3d, CoordinatePoint.GetDistanceBetweenPointsOnAnEllipsoid(basePoint, two).GetMeters(), 0.4d);

            //edwilliams.org
            Assert.AreEqual(97.598, CoordinatePoint.GetDistanceBetweenPointsWithHaversine(basePoint, two).GetMeters(), 0.4d);
            Assert.AreEqual(97.598, CoordinatePoint.GetDistanceBetweenPointsOnAnEllipsoid(basePoint, two).GetMeters(), 0.01d);

            two = new CoordinatePoint(new Latitude(60, 07.330), new Longitude(32, 18.716));
            Assert.AreEqual(5.1d, CoordinatePoint.GetDistanceBetweenPointsWithHaversine(basePoint, two).GetMeters(), 0.5d);
            Assert.AreEqual(5.1d, CoordinatePoint.GetDistanceBetweenPointsOnAnEllipsoid(basePoint, two).GetMeters(), 0.5d);
            //too poor accuracy with flat method
            Assert.AreEqual(5.1d, CoordinatePoint.GetDistanceBetweenPointsOnTheFlat(basePoint, two).GetMeters(), 2);

            two = new CoordinatePoint(new Latitude(60, 07.374), new Longitude(32, 18.754));
            Assert.AreEqual(90.6d, CoordinatePoint.GetDistanceBetweenPointsWithHaversine(basePoint, two).GetMeters(), 1);
            Assert.AreEqual(90.6d, CoordinatePoint.GetDistanceBetweenPointsOnAnEllipsoid(basePoint, two).GetMeters(), 0.8d);

            two = new CoordinatePoint(new Latitude(60, 07.318), new Longitude(32, 18.734));
            Assert.AreEqual(23.2d, CoordinatePoint.GetDistanceBetweenPointsWithHaversine(basePoint, two).GetMeters(), 1);
            Assert.AreEqual(23.2d, CoordinatePoint.GetDistanceBetweenPointsOnAnEllipsoid(basePoint, two).GetMeters(), 0.01d);
        }
Beispiel #2
0
        /// <summary>
        /// Find nearest points at two sequence.
        /// </summary>
        /// <param name="firstSequence">First points sequence.</param>
        /// <param name="secondSequence">Second points sequence.</param>
        /// <returns><see cref="NearestPointsEventArgs"/>.</returns>
        private NearestPointsEventArgs FindNearestPoint(IEnumerable <IDepthPointSource> firstSequence, IEnumerable <IDepthPointSource> secondSequence)
        {
            var uniqueBasePoints       = firstSequence.GetUniqueDepthPoints();
            var uniqueAdjustablePoints = secondSequence.GetUniqueDepthPoints();

            var minDistance = double.MaxValue;
            NearestPointsEventArgs minDistncePointsInfo = null;

            Parallel.ForEach(uniqueBasePoints,
                             //create local Points info
                             () => new NearestPointsEventArgs()
            {
                Distance = double.MaxValue
            },

                             //each thread work
                             (uniqueBasePoint, loopState, singleThreadPointInfo) =>
            {
                //save first point
                singleThreadPointInfo.FirstPoint = uniqueBasePoint;

                foreach (var uniqueAdjustablePoint in uniqueAdjustablePoints)
                {
                    var dim = CoordinatePoint.GetDistanceBetweenPointsOnAnEllipsoid(uniqueBasePoint.Point, uniqueAdjustablePoint.Point).GetMeters();

                    if (dim < singleThreadPointInfo.Distance)
                    {
                        singleThreadPointInfo.SecondPoint = uniqueAdjustablePoint;
                        singleThreadPointInfo.Distance    = dim;
                    }

                    //if we found two points with distance less 0.1m between, then stop calc.
                    if (Math.Abs(singleThreadPointInfo.Distance) < 0.1d)
                    {
                        loopState.Stop();
                    }
                }

                return(singleThreadPointInfo);
            },
                             //composition
                             pointInfo =>
            {
                lock (_syncRoot)
                {
                    if (pointInfo.Distance < minDistance)
                    {
                        minDistance          = pointInfo.Distance;
                        minDistncePointsInfo = pointInfo;
                    }
                }
            }

                             );

            //foreach (var uniqueBasePoint in uniqueBasePoints)
            //{
            //	foreach (var uniqueAdjustablePoint in uniqueAdjustablePoints)
            //	{
            //		var dim = CoordinatePoint.DistanceBetweenPoints(uniqueBasePoint.Point, uniqueAdjustablePoint.Point);
            //		if (dim < distance)
            //		{
            //			distance = dim;
            //			points = new Tuple<IDepthPointSource, IDepthPointSource>(uniqueBasePoint, uniqueAdjustablePoint);
            //		}
            //	}
            //}

            OnNearestPointFound(minDistncePointsInfo);

            return(minDistncePointsInfo);
        }