如何在C#中使用GMAP.NET在MAP上绘制圆圈

我在c#中使用GMAP.NET。 我能够在表单上显示地图,现在我正在尝试通过单击一个certian点来绘制CIRCLE鼠标,保持鼠标左键并将鼠标拖动到特定位置。 一旦绘制了圆形,我想从中心点获得半径,我确信GMAP能够做到这一点。 我正在使用Opentstreet地图。

我无法在function上实现这一点,任何使用GMAP控件的人都会与一些可行的代码分享您的经验。

谢谢

我所知道的唯一可以实现这种结果的方法是使用PointLatLng点创建一个列表并将它们绘制为多边形。 这是一个例子:

private void CreateCircle(PointF point, double radius, int segments) { List gpollist = new List(); double seg = Math.PI * 2 / segments; int y = 0; for (int i = 0; i < segments; i++) { double theta = seg * i; double a = point.X + Math.Cos(theta) * radius; double b = point.Y + Math.Sin(theta) * radius; PointLatLng gpoi = new PointLatLng(a,b); gpollist.Add(gpoi); } GMapPolygon gpol = new GMapPolygon(gpollist, "pol"); overlayOne.Polygons.Add(gpol); } 

如果要使用与绘图类关联的典型GDIfunction,则只需inheritanceGMapMarker类即可。 这允许您绘制简单的形状,如圆形,并创建自定义属性(例如,将以形状的英里数计算半径):

 public class GMapPoint : GMap.NET.WindowsForms.GMapMarker { private PointLatLng point_; private float size_; public PointLatLng Point { get { return point_; } set { point_ = value; } } public GMapPoint(PointLatLng p, int size) : base(p) { point_ = p; size_ = size; } public override void OnRender(Graphics g) { g.FillRectangle(Brushes.Black, LocalPosition.X, LocalPosition.Y, size_, size_); //OR g.DrawEllipse(Pens.Black, LocalPosition.X, LocalPosition.Y, size_, size_); //OR whatever you need } } 

要在地图上绘制点:

  GMapOverlay points_ = new GMapOverlay("pointCollection"); points_.Markers.Add(new GMapPoint(new PointLatLng(35.06, -106.36), 10)); gMapControl1.Overlays.Add(points_); 

我遇到了同样的问题,在进入时我有Lon,Lat和radius,这是我的解决方案。 它像一个魅力:)

 private void CreateCircle(Double lat, Double lon, double radius) { PointLatLng point = new PointLatLng(lat, lon); int segments = 1000; List gpollist = new List(); for (int i = 0; i < segments; i++) gpollist.Add(FindPointAtDistanceFrom(point, i, radius / 1000)); GMapPolygon gpol = new GMapPolygon(gpollist, "pol"); markers.Polygons.Add(gpol); } 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(51.640980, -2.673544, 1143.899431); 
  private void CreateCircle(Double lat, Double lon, double radius, int ColorIndex) { PointLatLng point = new PointLatLng(lat, lon); int segments = 1080; List gpollist = new List(); for (int i = 0; i < segments; i++) { gpollist.Add(FindPointAtDistanceFrom(point, i*(Math.PI/180), radius / 1000)); } GMapPolygon polygon = new GMapPolygon(gpollist, "Circle"); 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); gMapCtl.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; } public static double DistanceTwoPoint(double startLat, double startLong, double endLat, double endLong) { var startPoint = new GeoCoordinate(startLat, startLong); var endPoint = new GeoCoordinate(endLat, endLong); return startPoint.GetDistanceTo(endPoint); } 
 private void CreateCircle(PointF point, double radius, int segments) { List gpollist = new List(); double seg = Math.PI * 2 / segments; int y = 0; for (int i = 0; i < segments; i++) { double theta = seg * i; double a = point.x + Math.cos( theta ) * radius; double b = point.y + Math.sin( theta ) * radius; PointLatLng gpoi = new PointLatLng(a,b); gpollist.Add(gpoi); } GMapPolygon gpol = new GMapPolygon(gpollist, "pol"); overlayOne.Polygons.Add(gpol); }`enter code here` 

所以公寓不是椭圆形

以下是如何在WPF中绘制地图上带有黑色边框的红色圆圈:

 public class YourMapControl : GMapControl { protected override void OnRender(DrawingContext drawingContext) { base.OnRender(drawingContext); Point center(40.730610, -73.935242); double radius = 0.1; drawingContext.DrawEllipse(Brushes.Red, Pens.Black, center, radius, radius); } } 

至于问题本身的第二部分,您将使用以下内置MapControl函数:

 public bool DisableAltForSelection; //if true, selects area just by holding mouse and moving public bool SelectionUseCircle; //use circle for selection public event SelectionChange OnSelectionChange; //occurs when mouse selection is changed public RectLatLng SelectedArea { get; set; } //returns rect with coordinates of the selected area