使用GPS坐标从圆弧中移除圆弧

时间:2018-05-15 21:34:10

标签: c# asp.net math trigonometry

如何从圆圈中删除圆弧坐标?我无法真正使用纬度或经度来比较坐标。

我有3个坐标可供使用。

A是起始坐标

B是停止坐标

C是中心坐标

C也有距离A或B 13英里的半径或圆圈的任何坐标

请注意,坐标可以是圆圈上的任何位置,也可以是任何顺序。

Sample of the image

2 个答案:

答案 0 :(得分:1)

假设弧形成θ的角度,因此y坐标的A和B差异给出底部三角形的长度。所以我们说A(x1,y1)和B(x2,y2),

2rsin(θ/ 2)= y1-y2

解决这个问题,你将获得θ。因此,弧度为2πr(θ/ 360)。

答案 1 :(得分:0)

整晚都想出来。

 /// <summary>
        /// Draw an arc with .Net code
        /// </summary>
        /// <param name="a">Start point</param>
        /// <param name="b">Stop oint</param>
        /// <param name="centerPoint">Center point</param>
        /// <param name="nauticalMiles"></param>
        /// <returns></returns>
        public static string ExactArtGpsCoordinate(TfrXY a, TfrXY b, TfrXY centerPoint, decimal nauticalMiles)
        {
            //Notice database store longitude then latitude
            StringBuilder coordinates = new StringBuilder();
            DbGeography point = DbGeography.PointFromText(string.Format("POINT ({0} {1})", centerPoint.LngX, centerPoint.LatY), DbGeography.DefaultCoordinateSystemId);
            // create a circle around a point, convert from Nautical Miles to Kilometers
            var radius = UniversalWeather.Weather.API.Utility.MetricConversions.MetricConversions.NauticalMilesToMeters(nauticalMiles);
            DbGeography orig = point.Buffer(Convert.ToDouble(radius));
            string resultData = orig.AsText();

            //Clean data
            resultData = resultData.Replace("POLYGON ((", "");
            resultData = resultData.Replace(", ", ",0\n");
            resultData = resultData.Replace("))", ",0");
            resultData = resultData.Replace(" ", ",");

            //Convert the circular coordinate into array
            string[] splitCoordinates = resultData.Split('\n');
            bool IsEastToWest = false;
            #region Determinte direction
            if (a.LngX > b.LngX)
            {
                IsEastToWest = true;
            }
            #endregion

            //Add stop point
            coordinates.Append(b.LngX.ToString() + "," + b.LatY.ToString() + ",0\n");

            //Help to split the calculation for the arc
            double middleX = (a.LngX + b.LngX) / 2f;
            double middleY = (a.LatY + b.LatY) / 2f;

            for (int i = 0; i < splitCoordinates.Length; i++)
            {
                //split data to long then lat
                string[] temp = splitCoordinates[i].Split(',');
                //Current longitude
                double cx = Convert.ToDouble(temp[0]);
                double cy = Convert.ToDouble(temp[1]);

                #region Logic for East to West
                if (IsEastToWest)
                {
                    ////Half East
                    if (a.LatY > cy && middleX <= cx)
                    {
                        coordinates.Append(splitCoordinates[i] + "\n");
                    }
                    //Half West
                    else if (middleX >= cx && b.LatY >= cy)
                    {
                        coordinates.Append(splitCoordinates[i] + "\n");
                    }
                }
                #endregion
                #region Logic for West to EAST
                else
                {
                    //Half West
                    if (a.LatY < cy && middleX >= cx)
                    {
                        coordinates.Append(splitCoordinates[i] + "\n");
                    }
                    //Half East
                    else if (middleX <= cx && cx < b.LngX && cy > centerPoint.LatY)
                    {
                        coordinates.Append(splitCoordinates[i] + "\n");
                    }
                } 
                #endregion
            }
            //Add start point
             coordinates.Append(a.LngX.ToString() + "," + a.LatY.ToString() + ",0\n");
            return coordinates.ToString();
        }