如何从圆圈中删除圆弧坐标?我无法真正使用纬度或经度来比较坐标。
我有3个坐标可供使用。
A是起始坐标
B是停止坐标
C是中心坐标
C也有距离A或B 13英里的半径或圆圈的任何坐标
请注意,坐标可以是圆圈上的任何位置,也可以是任何顺序。
答案 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();
}