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

原文: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

时间: 2024-10-03 16:30:52

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

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

原文:解决ArcGIS API for Silverlight 加载地图的内外网访问问题 先上一个类,如下: public class BaseClass { public static string getFullUri(string oldUriString) { string newUriString = oldUriString; //处理相对地址============================================================ if (newUri

利用arcgis api for javascript实现在地图上点的弹出(我的信息弹出不了)

问题描述 利用arcgis api for javascript实现在地图上点的弹出(我的信息弹出不了) 2C <!DOCTYPE html> Simple Map <style> html body #map { height: 100%; width: 100%; margin: 0; padding: 0; } body { background-color: #FFF; overflow: hidden; font-family: ""Trebuchet

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

原文 http://blog.csdn.net/leesmn/article/details/6820245 无可否认,google map实在是很漂亮.可惜对于使用arcgis api for silverlight的我们来说,无法使用它的确不爽.虽然,arcgis api for silverlight可以使用bing map.但是bing map中国地区的地图很差,城市道路信息几乎没有.稍微得到些许安慰的是最新版本(比方2.2版本)可以支持OpenStreetMap,效果比bing map

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

原文:ArcGIS API for Silverlight之配准JPG图片地图文字倾斜解决方案 根据实际JPG图片进行配准后,发布的地图,利用ArcGIS API for Silverlight在网页上显示的时候,原先的文字总有倾斜的现象,如何解决?   图一.配准后有文字倾斜现象的地图 解决方案如下:      <esri:Map x:Name="myMap" IsLogoVisible="False" ZoomDuration="0:00:01&

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

原文:ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件 先看效果图,然后上代码: <UserControl x:Class="MapClient.PicMusic" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx

ArcGIS API for Silverlight加载google地图(后续篇)

原文:ArcGIS API for Silverlight加载google地图(后续篇) 之前在博客中(http://blog.csdn.net/taomanman/article/details/8019687)提到的加载google地图方案,因为google地址问题,看不到图了,发现是url地址变换造成的. 现将如下三个类公布出来,源码如下:   using System; using System.Net; using System.Windows; using System.Window

ArcGIS API for Silverlight开发入门

你用上3G手机了吗?你可能会说,我就是喜欢用nokia1100,ABCDEFG跟我 都没关系.但你不能否认3G是一种趋势,最终我们每个人都会被包裹在3G网络中.1100也不是一成不变,没准哪天为了打击犯罪,会在你的1100上强制 装上GPS.GIS工作既然建立在计算机的基础上,当然也得随着IT行业与时俱进.       看看现在计算机应用的趋势吧.云(计算),这个东西可讲不清楚,因为云嘛,飘忽不定的.不过可以这样来看它,以后计算机网络上就有一坨(或者几坨)万能的 云,有什么需求云都可以满足我们,

ArcGIS API for Silverlight 调用GP服务准备---GP模型建立、发布、测试

原文:ArcGIS API for Silverlight 调用GP服务准备---GP模型建立.发布.测试                                                                                                                      第一篇.GP降雨量等值线建模.发布及测试          在水利.气象等行业中,要在WebGIS中实现空间分析功能,如绘制等值线.等高线.等直面.缓冲区等都

ArcGIS API for Silverlight 之ElementLayer使用及TextSymbol的模板使用

原文:ArcGIS API for Silverlight 之ElementLayer使用及TextSymbol的模板使用 在开发中动态在地图上添加文字信息,可以使用TextSymbol添加文字 //动态添加文本 TextSymbol textSymbol = new TextSymbol() { FontFamily = new System.Windows.Media.FontFamily("Microsoft YaHei"), Foreground = new System.Wi