You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动