您的位置:首页 > 其它

WPF ArcGis仿高德地图拖拽画圆

2016-07-27 19:24 537 查看
实现需要解决的几个问题:

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  arcgis 地图 高德地图