/// <summary>
/// 顺时针正北0度->逆时针正东0度
/// </summary>
/// <param name="azimuth"></param>
/// <returns></returns>
public static int AngleConvertN2E(int azimuth)
{
return ((360 - azimuth) + 90) % 360;
}
/// <summary>
/// 创建扇形
/// </summary>
/// <param name="coordSys">坐标系</param>
/// <param name="pt">中心点</param>
/// <param name="radius">半径</param>
/// <param name="startAngle">起始角</param>
/// <param name="endAngle">终止角</param>
/// <returns></returns>
internal static FeatureGeometry CreateSector(CoordSys coordSys, DPoint pt, double radius, int startAngle, int endAngle)
{
FeatureGeometry ftr;
if (startAngle == 0 && endAngle == 360)
ftr = new MapInfo.Geometry.Ellipse(coordSys, pt, radius * 0.75, radius * 0.75, DistanceUnit.Meter,
DistanceType.Spherical);//因为是经纬度坐标系,所以只能用Spherical
else
{
int a2 = AngleConvertN2E(startAngle);
int a1 = AngleConvertN2E(endAngle);//因为LegacyArc是用的逆时针坐标轴,所以转换后起始位置要交换一下
var arc = new MapInfo.Geometry.LegacyArc(coordSys, pt, radius, radius, DistanceUnit.Meter,
DistanceType.Spherical, a1, a2);
var mc = arc.CreateMultiCurve(100);
var arcPts = mc[0][0].SamplePoints();
var linePts = new[] { mc[0].EndPoint, pt, mc[0].StartPoint };
var pts = new MapInfo.Geometry.DPoint[arcPts.Length - 1 + 3];
for (int i = 0, j = 0; i < arcPts.Length - 1 + 3; i++)
{
if (i < arcPts.Length - 1)
pts[i] = arcPts[i];
else
pts[i] = linePts[j++];
}
ftr = new MultiPolygon(coordSys, CurveSegmentType.Linear, pts);
}
return ftr;
}
效果预览: