原文:ArcGIS API for Silverlight 实现修改地图上的工程点位置

 #region 处理工程点点击编辑相关事件

        public Graphic editgraphics = null; //待编辑的Graphics图层
public Graphic oldgraphics = null; //原先Graphics图层
public Symbol symbolold = null; /// <summary>
/// 在地图上点击编辑点处理事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void myMap_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
ESRI.ArcGIS.Client.Projection.WebMercator mercator = new ESRI.ArcGIS.Client.Projection.WebMercator();
try
{
if (editgraphics != null)
{
if (isedit)
{
System.Windows.Point screenPoint = e.GetPosition(myMap);
ESRI.ArcGIS.Client.Geometry.MapPoint mapPoint = myMap.ScreenToMap(screenPoint);
double x = Math.Round(mapPoint.X, 4);
double y = Math.Round(mapPoint.Y, 4);
MapPoint mp = new MapPoint(x, y);
editgraphics.Geometry = mp;
}
else
{
editgraphics = oldgraphics;
}
}
else
{ }
}
catch (Exception)
{
return;
}
} void graphic_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Graphic graphic = sender as Graphic;
oldgraphics = graphic; //保存原先的Graphics图层
isedit = true;
//选工程点
if (graphic != null)
{
//将上一个图元还原第一个图元
if (symbolold != null)
{
editgraphics.Symbol = symbolold;
} editgraphics = graphic;
symbolold = editgraphics.Symbol;
editgraphics.Symbol = ((SimpleMarkerSymbol)this.FindName("SimpleSymbol")); ESRI.ArcGIS.Client.Geometry.MapPoint mp = (MapPoint)graphic.Geometry;
ESRI.ArcGIS.Client.Projection.WebMercator mercator = new ESRI.ArcGIS.Client.Projection.WebMercator();
mp = WKIDConvert.mercator2lonlat(ESRI.ArcGIS.Client.Geometry.Geometry.NormalizeCentralMeridian(mp) as ESRI.ArcGIS.Client.Geometry.MapPoint);
//打开Tab进行编辑操作
this.gridTab2.Width = new GridLength(278, GridUnitType.Pixel);
tbTip1.Text = "<<";
string title = graphic.Attributes["NAME"].ToString(); //工程名称
this.tbProjectName.Text = title;
this.tbLatitute.Text = Math.Round(mp.X, 4).ToString(); //经度
this.tbLongitute.Text = Math.Round(mp.Y, 4).ToString(); //纬度
}
} void graphic_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
Graphic graphic = sender as Graphic; editgraphics.Symbol = ((SimpleMarkerSymbol)this.FindName("SimpleSymbol")); ESRI.ArcGIS.Client.Geometry.MapPoint mp = (MapPoint)graphic.Geometry;
ESRI.ArcGIS.Client.Projection.WebMercator mercator = new ESRI.ArcGIS.Client.Projection.WebMercator();
mp = WKIDConvert.mercator2lonlat(ESRI.ArcGIS.Client.Geometry.Geometry.NormalizeCentralMeridian(mp) as ESRI.ArcGIS.Client.Geometry.MapPoint);
string title = graphic.Attributes["NAME"].ToString(); //工程名称
this.tbProjectName.Text = title;
this.tblEditName.Text = title;
this.tbLatitute.Text = Math.Round(mp.X, 4).ToString(); //经度
this.tbLongitute.Text = Math.Round(mp.Y, 4).ToString(); //纬度
} void graphic_MouseMove(object sender, MouseEventArgs e)
{
Graphic graphic = sender as Graphic;
Grid grid = new Grid();
grid.Background = new SolidColorBrush(Colors.Blue);
TextBlock msg = new TextBlock();
msg.Foreground = new SolidColorBrush(Colors.White);
msg.FontSize = 13;
msg.FontFamily = new FontFamily("Microsoft YaHei");
msg.Text = graphic.Attributes["NAME"].ToString();
grid.Children.Add(msg);
graphic.MapTip = grid;
} RichTextBox rtb; void graphic_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
if (isedit)
{
//只有在选中点开始编辑后,才可以取消编辑
RTBContextMenu menu = new RTBContextMenu(rtb, this);
menu.Show(e.GetPosition(LayoutRoot));
}
else
{
//什么也不执行
}
} void graphic_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
} private void btnModify_Click(object sender, System.Windows.RoutedEventArgs e)
{
try
{
if (string.IsNullOrEmpty(this.tbProjectName.Text))
{
MessageBox.Show("请先选择一个工程点!");
}
else
{
MapPoint mp = (MapPoint)editgraphics.Geometry;
getDataSoapClient client = new getDataSoapClient();
client.updagePositionCompleted += new EventHandler<AsyncCompletedEventArgs>(client_updagePositionCompleted);
MapPoint mapPoint = WKIDConvert.mercator2lonlat(ESRI.ArcGIS.Client.Geometry.Geometry.NormalizeCentralMeridian(mp) as ESRI.ArcGIS.Client.Geometry.MapPoint);
client.updagePositionAsync(this.tbProjectName.Text, Math.Round(mapPoint.X, 4).ToString(), Math.Round(mapPoint.Y, 4).ToString());
}
}
catch (Exception)
{
MessageBox.Show("请先选择一个工程点!");
} } void client_updagePositionCompleted(object sender, AsyncCompletedEventArgs e)
{
//重新加载数据,这里需要维持地图缩放的比例
ESRI.ArcGIS.Client.Projection.WebMercator mercator = new ESRI.ArcGIS.Client.Projection.WebMercator();
ESRI.ArcGIS.Client.Geometry.Envelope selectedFeatureExtent = mercator.ToGeographic(editgraphics.Geometry).Extent; //选中点的位置
double expandPercentage = 10; //加数值后,聚焦(这里需要注意,进行地理坐标和墨卡托坐标的转换)
double widthExpand = (selectedFeatureExtent.Width + 5) * (expandPercentage / 100);
double heightExpand = (selectedFeatureExtent.Height + 5) * (expandPercentage / 100);
ESRI.ArcGIS.Client.Geometry.Envelope displayExtent = new Envelope(WKIDConvert.lonlat2mercator(new MapPoint(selectedFeatureExtent.XMin - (widthExpand / 2), selectedFeatureExtent.YMin - (heightExpand / 2))), WKIDConvert.lonlat2mercator(new MapPoint(selectedFeatureExtent.XMax + (widthExpand / 2), selectedFeatureExtent.YMax + (heightExpand / 2))))
{
SpatialReference = new SpatialReference(102100)
}; MessageBox.Show("工程位置更新成功!");
//重新加载地图
GetGCInfoByType(tip_Base.CurrentValue);
//重新置文本输入框为空
this.tbProjectName.Text = "";
this.tbLatitute.Text = "";
this.tbLongitute.Text = "";
} #endregion using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Media.Imaging;
using System.Windows.Media.Effects;
using ESRI.ArcGIS.Client.FeatureService.Symbols;
using ESRI.ArcGIS.Client.Geometry; namespace MapClient.CommonClass
{
public class RTBContextMenu : ContextMenu
{
RichTextBox rtb;
GCSiteM _gcSite; public RTBContextMenu(RichTextBox rtb, GCSiteM gcSite)
{
this.rtb = rtb;
_gcSite = gcSite;
} //构造菜单按钮并返回一个FrameworkElement对象
protected override FrameworkElement GetContent()
{
Border border = new Border() { BorderBrush = new SolidColorBrush(Color.FromArgb(255, 167, 171, 176)), BorderThickness = new Thickness(1), Background = new SolidColorBrush(Colors.White) };
border.Effect = new DropShadowEffect() { BlurRadius = 3, Color = Color.FromArgb(255, 230, 227, 236) }; //取消选中
Button tjspButton = new Button() { Height = 22, Margin = new Thickness(0, 0, 0, 0), HorizontalAlignment = HorizontalAlignment.Stretch, VerticalAlignment = VerticalAlignment.Top, HorizontalContentAlignment = HorizontalAlignment.Left };
tjspButton.Style = Application.Current.Resources["ContextMenuButton"] as Style;
tjspButton.Click += new RoutedEventHandler(tjspButton_Click); tjspButton.Content = "取消选中"; border.Child = tjspButton;
return border;
} void tjspButton_Click(object sender, RoutedEventArgs e)
{
//恢复原来的颜色
_gcSite.editgraphics.Symbol = new SimpleMarkerSymbol()
{
Color = new SolidColorBrush(ColorRevert.ToColor("#FF0551A7")),
Size = 10,
Style = ESRI.ArcGIS.Client.FeatureService.Symbols.SimpleMarkerSymbol.SimpleMarkerStyle.Circle
};
_gcSite.isedit = false; //重新加载数据,这里需要维持地图缩放的比例
ESRI.ArcGIS.Client.Projection.WebMercator mercator = new ESRI.ArcGIS.Client.Projection.WebMercator();
ESRI.ArcGIS.Client.Geometry.Envelope selectedFeatureExtent = mercator.ToGeographic(_gcSite.oldgraphics.Geometry).Extent; //原先选中点的位置
double expandPercentage = 10; //加数值后,聚焦(这里需要注意,进行地理坐标和墨卡托坐标的转换)
double widthExpand = (selectedFeatureExtent.Width + 5) * (expandPercentage / 100);
double heightExpand = (selectedFeatureExtent.Height + 5) * (expandPercentage / 100);
ESRI.ArcGIS.Client.Geometry.Envelope displayExt http:// ent = new Envelope(WKIDConvert.lonlat2mercator(new MapPoint(selectedFeatureExtent.XMin - (widthExpand / 2), selectedFeatureExtent.YMin - (heightExpand / 2))), WKIDConvert.lonlat2mercator(new MapPoint(selectedFeatureExtent.XMax + (widthExpand / 2), selectedFeatureExtent.YMax + (heightExpand / 2))))
{
SpatialReference = new SpatialReference(102100)
}; //重新加载地图
_gcSite.GetGCInfoByType(tip_Base.CurrentValue);
//重新置文本输入框为空
_gcSite.tbProjectName.Text = "";
_gcSite.tbLatitute.Text = "";
_gcSite.tbLongitute.Text = "";
Close();
}
}
}

以上使用到的右键菜单功能ContextMenu.cs类请参考:http://blog.csdn.net/taomanman/article/details/7333612

ArcGIS API for Silverlight 实现修改地图上的工程点位置的更多相关文章

  1. 解决ArcGIS API for Silverlight 加载地图的内外网访问问题

    原文:解决ArcGIS API for Silverlight 加载地图的内外网访问问题 先上一个类,如下: public class BaseClass { public static string ...

  2. 使用ArcGIS API for Silverlight + Visifire绘制地图统计图

    原文:使用ArcGIS API for Silverlight + Visifire绘制地图统计图 最近把很久之前做的统计图又拿出来重新做了一遍,感觉很多时候不复习,不记录就真的忘了,时间是最好的稀释 ...

  3. ArcGIS API For Silverlight使用在线地图的多种方法总结

    引自:http://www.cnblogs.com/meimao5211/p/3283969.html ArcGIS API For Silverlight使用在线地图的多种方法总结 本人也正在学习A ...

  4. ArcGIS API for Silverlight部署本地地图服务

    这一节我们来讲新建立的ArcGIS API for Silverlight应用程序如何加载自己的地图服务的问题,网上的资料讲的都有点含糊不清,这次我们详细的讲一下配置的步骤: 首先介绍下我们的开发和部 ...

  5. ArcGIS API for Silverlight实现地图测距功能

    原文:ArcGIS API for Silverlight实现地图测距功能 问题:如何实现地图测距功能? 地图工具栏 <Grid x:Name="gToolMenu" Hei ...

  6. ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件

    原文:ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件 先看效果图,然后上代码: <UserControl x:Class= ...

  7. ArcGIS API for Silverlight之配准JPG图片地图文字倾斜解决方案

    原文:ArcGIS API for Silverlight之配准JPG图片地图文字倾斜解决方案 根据实际JPG图片进行配准后,发布的地图,利用ArcGIS API for Silverlight在网页 ...

  8. arcgis api for silverlight使用google map等多个在线地图

    原文 http://blog.csdn.net/leesmn/article/details/6820245 无可否认,google map实在是很漂亮.可惜对于使用arcgis api for si ...

  9. ArcGIS api fo silverlight学习一(silverlight加载GeoServer发布的WMS地图)

    最好的学习资料ArcGIS api fo silverlight官网:http://help.arcgis.com/en/webapi/silverlight/samples/start.htm 一. ...

随机推荐

  1. BZOJ3498 : PA2009 Cakes

    令三元环(i,j,k)中i>j>k,则每条边只需要从大点连向小点 设d[x]表示从x连出的边的条数 从1到n枚举点i,然后枚举所有与i相连的边(i,x)(x<i) 如果$d[x]\l ...

  2. js对象数组按属性快速排序

    前一篇<关于selector性能比赛>中提到,目测觉得在$("div,p,a")这样有逗号时,sizzle耗时异常(600多个元素,花了200ms),说是它可能没有优化 ...

  3. BST & Treap

    二叉查找树递归定义: 二叉查找树是空树或不是空树二叉查找树的左二叉查找树的值一定小于二叉查找树的值或左二叉查找树为空树二叉查找树的右二叉查找树的值一定大于二叉查找树的值或右二叉查找树为空树 不维护父亲 ...

  4. new在c#方法中的使用

    new在c#中有三种用法: 1.实例化对象 2.泛型约束 3.用在方法前.new和override的区别在于:override用于重写父类的方法:new用于隐藏方法,它调用的方法来自于申明的类,如果申 ...

  5. Qt Creator Shortcuts 快捷键大全

    编号 快捷键 功能 1 Esc 切换到代码编辑状态 2 F1 查看帮助(选中某一类或函数,按下F1,出现帮助文档) 3 F2 在光标选中对象的声明和定义之间切换(和Ctrl+鼠标左键一样的效果,选中某 ...

  6. WPF 一个数据库连接测试的实现

    要实现的功能效果图如下:因为我们要测试数据是从输入框获得的,所以,我们的连接字符串不是写死在应用程序中的.下面我就详细介绍一下.

  7. android之数据库SQLite(一)

    创建数据库 首先定义SQLiteOpenHelper的子类 代码如下: package com.example.myandroid; import android.content.Context; i ...

  8. OpenCV学习笔记——图像的腐蚀与膨胀

    顺便又复习了一下cvcopy如何进行图像拼接(最近觉得打开多幅图像分别看不如缩小掉放拼接到一幅图像上对比来的好) 首先把拼接的目标图像设置兴趣区域ROI,比如我有一个total,要把a.b.c分别从左 ...

  9. CSS3:过渡大全

    代码 地址:http://jsbin.com/moquyesumi/edit?html,output <!DOCTYPE HTML> <html> <head> & ...

  10. Javascript 笔记与总结(1-2)词法分析

    词法分析,按顺序分析 3 样: 第 1 步:先分析参数 第 2 步:再分析变量声明 第 3 步:再分析函数声明 一个函数能使用的局部变量,就从上面 3 步分析而来. 具体步骤: 0:函数运行前的瞬间, ...