C# 使用GPS坐标从圆中删除圆弧
如何从圆中删除圆弧坐标?我不能用纬度或经度来比较坐标 我有3个坐标要处理 A是起始坐标 B是停止坐标 C是中心坐标 C的半径为A或B的13英里,或圆的任何坐标 请注意,坐标可以是圆上的任何位置,也可以是任何顺序C# 使用GPS坐标从圆中删除圆弧,c#,asp.net,math,trigonometry,C#,Asp.net,Math,Trigonometry,如何从圆中删除圆弧坐标?我不能用纬度或经度来比较坐标 我有3个坐标要处理 A是起始坐标 B是停止坐标 C是中心坐标 C的半径为A或B的13英里,或圆的任何坐标 请注意,坐标可以是圆上的任何位置,也可以是任何顺序 假设圆弧产生θ角,那么y坐标的a和B差给出了底部三角形的长度。所以我们说A(x1,y1)和B(x2,y2) 2rsin(θ/2)=y1-y2 解这个,你会得到θ。所以弧是2πr(θ/360)。花了一整晚才得出这个结论 /// <summary> /// Dr
假设圆弧产生θ角,那么y坐标的a和B差给出了底部三角形的长度。所以我们说A(x1,y1)和B(x2,y2) 2rsin(θ/2)=y1-y2
解这个,你会得到θ。所以弧是2πr(θ/360)。花了一整晚才得出这个结论
/// <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();
}
//
///使用.Net代码绘制圆弧
///
///起点
///停止点
///中心点
///
///
公共静态字符串ExactArtGpsCoordinate(TfrXY a、TfrXY b、TfrXY中心点、十进制数字文件)
{
//注意数据库存储经度,然后是纬度
StringBuilder坐标=新的StringBuilder();
DbGeography point=DbGeography.PointFromText(string.Format(“point({0}{1})”,centerPoint.LngX,centerPoint.LatY),DbGeography.defaultCoordinationSystemId);
//围绕点创建一个圆,从海里转换为公里
var radius=UniversalWeather.Weather.API.Utility.MetricConversions.MetricConversions.NauticalMilesToMeters(nauticalMiles);
DbGeography orig=point.Buffer(Convert.ToDouble(radius));
字符串resultData=orig.AsText();
//干净数据
resultData=resultData.Replace(“多边形(“,”);
resultData=resultData.Replace(“,”,“,0\n”);
resultData=resultData.Replace(“)”,“,0”);
resultData=resultData.Replace(“,”,”);
//将圆坐标转换为数组
string[]splitCoordinates=resultData.Split('\n');
bool IsEastToWest=假;
#区域决定方向
如果(a.LngX>b.LngX)
{
IseastOwest=正确;
}
#端区
//添加停止点
coordinates.Append(b.LngX.ToString()+”,“+b.LatY.ToString()+”,0\n”);
//帮助分割圆弧的计算
双中间=(a.LngX+b.LngX)/2f;
双中间层=(a.LatY+b.LatY)/2f;
对于(int i=0;icy&&middleX=cx&&b.LatY>=cy)
{
coordinates.Append(拆分坐标[i]+“\n”);
}
}
#端区
#西向东的区域逻辑
其他的
{
//半西方
如果(a.LatY=cx)
{
coordinates.Append(拆分坐标[i]+“\n”);
}
//半东
否则,如果(中轴中心点板条)
{
coordinates.Append(拆分坐标[i]+“\n”);
}
}
#端区
}
//添加起点
坐标.Append(a.LngX.ToString()+”,“+a.LatY.ToString()+”,0\n”);
返回坐标.ToString();
}
弧坐标是指要查找并删除圆边界上显示的所有坐标吗?