WPF ArcGis仿高德地图拖拽画圆

实现需要解决的几个问题:
1)、拖拽;
拖拽时到底拖拽的时graphic还是graphicLayer、map,需要先判断好;
2)、画圆;
需要跟着鼠标移动而实时展示到地图中

3)、拖拽结束通知前台页面;


代码如下:

  private void DragDraw()

{

            //圆心坐标
            MapPoint mapPoint = new MapPoint() { X = 117.175781, Y = 39.136024 };


            //圆半径
            double radius = MeterConvert2MapDistance(1000);


    //圆上的点(y坐标与圆心相等)

            MapPoint mPoint = new MapPoint(mapPoint.X + radius, mapPoint.Y);


           //创建图层

            var circleExtentLayer = LayerManager.CreateGraphicsLayer(this.ISSMap.Map, LayerNameConst.CircleExtentGraphicsLayer);

    LayerManager.SetGraphicsLayerToIndex(circleExtentLayer, 1);

   //画圆心展现到地图中

   DrawPoint(ref circleExtentLayer,mPoint);



   //画圆

   DrawCircle(mapPoint ,radius,ref  circleExtentLayer);


   //画圆上一点展现到地图中

   DrawPoint(ref circleExtentLayer,mPoint);


   //画直线

   ShowMap(mapPoint ,mPoint,ref  circleExtentLayer);


   this.ISSMap.Map.Layers.Add(grapLayer);

}


/// <summary>
        /// 将米转换为度,不懂区域一经度代表的距离不一样,需要配置
        /// </summary>
        /// <param name="distance">以米为单位的长度</param>
        /// <returns>以度为单位的长度</returns>
        private double MeterConvert2MapDistance(Double meterdistance)
        {
            return meterdistance * 0.000009;
        }


 /// <summary>
        /// 画圆
        /// </summary>
        /// <param name="centerPoint">中心点坐标</param>
        /// <param name="GraphicsLayer">图层</param>

/// <param name="radius">半径</param>
        private void DrawCircle(MapPoint centerPoint,double radius
,ref  GraphicsLayer circleExtentLayer)
        {
            //范围图层
            circleExtentLayer.ClearGraphics();//清除 蓝色填充区域”图层、“3个红色圆形区域”图层
            //绘制“蓝色填充区域”图层
            ESRI.ArcGIS.Client.Geometry.Geometry circle = DrawGeometry.DrawCircle(centerPoint, radius);
            var g = new Graphic();
            g.SetZIndex(0);
            g.Geometry = circle;
            g.Symbol = ResourceHelper.Resource["MapToolFillSymbol"] as ESRI.ArcGIS.Client.Symbols.SimpleFillSymbol;
            circleExtentLayer.Graphics.Add(g);
            this.ISSMap.Map.PanTo(centerPoint);
        }
            

  /// <summary>
        /// 通过圆心坐标任意点坐标画直线
        /// </summary>
        /// <param name="mapCenterPoint">圆心坐标</param>
       /// <param name="GraphicsLayer">图层</param>

/// <param name="arbitraryPoint">任意点坐标</param>
        private void ShowMap(MapPoint mapCenterPoint,MapPoint arbitraryPoint
,ref  GraphicsLayer  graLineLayer )
        {
             //直线
            Graphic graLine = new Graphic();
            graLine.Geometry = DrawGeometry.Drawline(mapCenterPoint,arbitraryPoint);
            graLine.Symbol = ResourceHelper.Resource["MapToolBlueLineSymbol"] as ESRI.ArcGIS.Client.Symbols.SimpleLineSymbol;
            graLineLayer.Graphics.Add(graLine);

        }

/// <summary>
        /// 创建圆上一点(表现到地图中)
        /// </summary>
        /// <param name="grapLayer">图层</param>
        /// <param name="mPoint">点的坐标</param>
        private void DrawPoint(ref GraphicsLayer grapLayer,MapPoint mPoint)
        {
            g = new Graphic();//创建图形


            //拖拽事件
            grapLayer.MouseLeftButtonDown += g_MouseLeftButtonDown; //图层点击事件
            this.ISSMap.Map.MouseMove += g_MouseMove; //地图上的移动事件
            this.ISSMap.MouseLeftButtonUp += g_MouseLeftButtonUp;//手指放开




            g.Attributes["Data"] = mPoint;
            //创建一个点(要定位的点)
            Double lon, lat;
            double.TryParse(mPoint.X.ToString(), out lon); double.TryParse(mPoint.Y.ToString(), out lat);
            MapPoint mp = new MapPoint(lon, lat);
            g.Geometry = mp;
            //创建要标记点的样式
            AlarmPictureMarkerSymbol picSymbol = new AlarmPictureMarkerSymbol();
            picSymbol.SetValue(AlarmPictureMarkerSymbol.ControlTemplateProperty, ResourceHelper.Resource["AlarmPictureSymbolTemplate"] as ControlTemplate);
            picSymbol.SetValue(AlarmPictureMarkerSymbol.ShowApertureProperty, ShowAperture.No);
            picSymbol.OffsetX = AlarmGraphicOffset.AlarmNotShowApertureOffsetX;
            picSymbol.OffsetY = AlarmGraphicOffset.AlarmNotShowApertureOffsetY;
            //
            Binding bingding = new Binding();
            bingding.Source = mPoint;
            bingding.Path = new PropertyPath("Status");
            bingding.Mode = BindingMode.OneWay;
            bingding.Converter = new Resource.Converter.AlarmStatusToBitmapImage();
            BindingOperations.SetBinding(picSymbol, AlarmPictureMarkerSymbol.BannerImageSourceProperty, bingding);
            //
            g.Symbol = picSymbol;


            grapLayer.Graphics.Add(g);
        }


        Point pot = new Point();
        bool whetherChoise = false;
        void g_MouseLeftButtonDown(object sender, GraphicMouseButtonEventArgs e)
        {
            pot = e.GetPosition(null);


            whetherChoise = true;


            e.Handled = true;
        }


        void g_MouseMove(object sender, MouseEventArgs e)
        {
            if (whetherChoise)
            {
                Point movePoint = e.GetPosition(null);


                pot = movePoint;


                MapPoint mPoint = this.ISSMap.Map.ScreenToMap(pot);


                mPoint.Y = 39.136024;


                g.Geometry = mPoint;


                //圆心点坐标
                MapPoint mapPoint = new MapPoint() { X = 117.175781, Y = 39.136024 };
                //半径
                double radius = (mPoint.X - mapPoint.X) / 0.000009);


           //创建图层

            var circleExtentLayer = LayerManager.CreateGraphicsLayer(this.ISSMap.Map, LayerNameConst.CircleExtentGraphicsLayer);

    LayerManager.SetGraphicsLayerToIndex(circleExtentLayer, 1);


   //画圆

   DrawCircle(mapPoint ,radius,ref  circleExtentLayer);


   //画直线

   ShowMap(mapPoint ,mPoint,ref  circleExtentLayer);


   this.ISSMap.Map.Layers.Add(grapLayer);


            }
        }
        void g_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            pot = new Point();


            whetherChoise = false;
        }



这样就能实现高德地图拖动画圆的效果了,写的不好,只供参考!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

   //画圆上一点展现到地图中

   DrawPoint(ref circleExtentLayer,mPoint);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值