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);
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);
相关文章推荐
- 百度地图经纬度转换到腾讯地图/Google 对应的经纬度
- Windows下C#的GUI窗口程序中实现调用Google Map的实例
- Andriod arcgis保存Mapview为图片的实例代码
- iOS开发之离线地图核心代码
- 基于Arcgis for javascript实现百度地图ABCD marker的效果
- 基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标
- 在Google 地图上实现做的标记相连接
- PHP计算百度地图两个GPS坐标之间距离的方法
- sogou地图API用法实例教程
- Android实现带列表的地图POI周边搜索功能
- 使用OpenLayers3 添加地图鼠标右键菜单
- 在arcgis使用python脚本进行字段计算时是如何解决中文问题的
- Python和Perl绘制中国北京跑步地图的方法
- ArcGis Map 中操作备忘
- ArcGis 的教程和资源
- 基于ArcEngine+C#开发的空间数据管理平台架构设计及功能说明
- iOS 高德地图(-)(基础篇)
- iOS 高德地图(二)(进阶具体使用的细节)
- 动态栅格(DEM)图层实现服务端渲染