C# GMap如何绘制指定方向、距离的120度扇形多边形
修改C# GMap代码实现指定方向、距离和张角的扇形多边形
我来帮你调整这段代码,实现你需要的扇形多边形——也就是从指定坐标出发,按指定方向、距离(比如1公里)和120度张角绘制的图形。核心思路是把原来绘制全圆的逻辑,改成只生成指定角度范围内的弧线段,再加上起点坐标把图形闭合,形成完整的扇形。
修改后的完整代码
// 替换原来的CreateCircle方法,新增方向、张角参数 private void CreateSectorPolygon(double lat, double lon, double distanceKm, int colorIndex, double directionDeg, double angleSpanDeg) { GMapOverlay markers = new GMapOverlay(mygmap, "sectorMarkers"); PointLatLng originPoint = new PointLatLng(lat, lon); int segments = 360; // 分段数,数值越高弧线越平滑,360足够清晰 List<PointLatLng> gpollist = new List<PointLatLng>(); // 计算扇形的起始和结束角度(以指定方向为中心,向两侧平分张角) double startAngleDeg = directionDeg - angleSpanDeg / 2; double endAngleDeg = directionDeg + angleSpanDeg / 2; // 生成弧线上的点 double angleStep = angleSpanDeg / segments; for (double angle = startAngleDeg; angle <= endAngleDeg; angle += angleStep) { // 把角度转换成弧度,传入FindPointAtDistanceFrom计算坐标 double angleRad = DegreesToRadians(angle); gpollist.Add(FindPointAtDistanceFrom(originPoint, angleRad, distanceKm)); } // 把起点加入列表,闭合扇形(弧+两条半径) gpollist.Add(originPoint); GMapPolygon polygon = new GMapPolygon(gpollist, "SectorPolygon"); // 保留原来的颜色填充逻辑 switch (colorIndex) { case 1: polygon.Fill = new SolidBrush(Color.FromArgb(80, Color.Red)); break; case 2: polygon.Fill = new SolidBrush(Color.FromArgb(80, Color.Orange)); break; case 3: polygon.Fill = new SolidBrush(Color.FromArgb(20, Color.Aqua)); break; default: MessageBox.Show("No search zone found!"); break; } polygon.Stroke = new Pen(Color.Red, 1); markers.Polygons.Add(polygon); mygmap.Overlays.Add(markers); } // 以下辅助方法保持不变 public static GMap.NET.PointLatLng FindPointAtDistanceFrom(GMap.NET.PointLatLng startPoint, double initialBearingRadians, double distanceKilometres) { const double radiusEarthKilometres = 6371.01; var distRatio = distanceKilometres / radiusEarthKilometres; var distRatioSine = Math.Sin(distRatio); var distRatioCosine = Math.Cos(distRatio); var startLatRad = DegreesToRadians(startPoint.Lat); var startLonRad = DegreesToRadians(startPoint.Lng); var startLatCos = Math.Cos(startLatRad); var startLatSin = Math.Sin(startLatRad); var endLatRads = Math.Asin((startLatSin * distRatioCosine) + (startLatCos * distRatioSine * Math.Cos(initialBearingRadians))); var endLonRads = startLonRad + Math.Atan2(Math.Sin(initialBearingRadians) * distRatioSine * startLatCos, distRatioCosine - startLatSin * Math.Sin(endLatRads)); return new GMap.NET.PointLatLng(RadiansToDegrees(endLatRads), RadiansToDegrees(endLonRads)); } public static double DegreesToRadians(double degrees) { const double degToRadFactor = Math.PI / 180; return degrees * degToRadFactor; } public static double RadiansToDegrees(double radians) { const double radToDegFactor = 180 / Math.PI; return radians * radToDegFactor; }
关键改动说明
- 方法参数调整:把原来的
CreateCircle重命名为CreateSectorPolygon,新增了directionDeg(方向角度,比如0代表正北,顺时针递增)、angleSpanDeg(张角,这里传入120即可)、distanceKm(绘制距离,比如1公里)三个参数,更贴合需求。 - 角度范围计算:以指定方向为中心,向两侧平分张角,算出扇形的起始和结束角度,确保图形对称。
- 弧线生成:只在起始到结束角度范围内生成点,不再绘制全圆。
- 闭合图形:最后把原始起点坐标加入点列表,让多边形形成闭合的扇形(弧线+两条半径)。
- 保留原有逻辑:颜色填充和地图叠加层的逻辑基本保留,只做了适配性调整。
调用示例
比如你要在坐标(39.9042, 116.4074)(北京天安门附近),绘制一个正北方向、1公里距离、120度张角的红色扇形,就可以这样调用:
CreateSectorPolygon(39.9042, 116.4074, 1, 1, 0, 120);
内容的提问来源于stack exchange,提问作者MIX TV




