2012-02-16 18 views
1

私はGMAP.NETをC#で使っています。私はフォーム上に地図を表示することができます。今は、証明書のポイントをクリックし、マウスの左ボタンを押し続けて特定の場所までマウスをドラッグしてCIRCLEマウスを描こうとしています。円が描かれたら、私はGMAPがそれを行うことができると確信している中心点からマイルで半径を取得したいと思います。私はOpentstreetマップを使用しています。C#でGMAP.NETを使ってMAP上に円を描く方法

私はこの機能を実現することができません.GMAPコントロールを操作した人は誰でも、動作するコードであなたの経験を親切に共有してください。

おかげ

答えて

8

私は、このような結果を達成できることを認識してい唯一の方法は、PointLatLngポイントでリストを作成し、ポリゴンとしてそれらを描画することです。次に例を示します。

private void CreateCircle(PointF point, double radius, int segments) 
{ 

    List<PointLatLng> gpollist = new List<PointLatLng>(); 

    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); 
} 
+1

良いコード、ありがとう。マイナーな微調整:** Math.Cos **と** Math.Sin **、大文字の注記、半径はマイルまたは2のスケールにマッピングする場合は.01のように非常に小さくする必要があります。 – TonyG

0
private void CreateCircle(PointF point, double radius, int segments) 
{ 

List<PointLatLng> gpollist = new List<PointLatLng>(); 

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` 

ので、アパートは楕円に

4

を行っていないあなたは、描画クラスに関連付けられているGDIが特徴の典型的なを使用したい場合、あなたは、単にGMapMarkerクラスを継承することができます。これは、あなたは(、例えば形状のマイルで半径を計算します1)円のような単純な図形を描画、およびカスタムプロパティを作成することができます:

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_); 
+0

...あなたはロック! – Andres

+0

@JAlecksen、WPFで同じことをする方法を知っていますか? –

+0

@Manish Jain残念ながら私はWPFとGmapに関する経験はありませんでした。いつか私は移行する必要がありますが、私はその学習曲線を楽しみにしていません:P –

1

私は同じ問題に遭いました。私はLon、Latとradiusを持っていましたが、ここで私の解決策です。それは魔法のように動作します:)

private void CreateCircle(Double lat, Double lon, double radius) 
{ 
    PointLatLng point = new PointLatLng(lat, lon); 
    int segments = 1000; 

    List<PointLatLng> gpollist = new List<PointLatLng>(); 

    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); 
+0

ありがとう!わずかな変更で、私はwpfで同じことを実行することができます –

0

はここで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); 
    } 
} 

質問自体の2番目の部分には、次の組み込みの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 
0
private void CreateCircle(Double lat, Double lon, double radius, int ColorIndex) 
    { 
     PointLatLng point = new PointLatLng(lat, lon); 
     int segments = 1080; 

     List<PointLatLng> gpollist = new List<PointLatLng>(); 

     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); 
    } 
関連する問題