打造地圖拼接利器(四)數(shù)據(jù)交互

這里的數(shù)據(jù)交互恩脂,主要指在地圖上可以選擇一個范圍帽氓,這個范圍可以調(diào)節(jié),同時返回所選范圍的經(jīng)緯度值俩块。

GMap.net提供一個繪制矩形的函數(shù)黎休,但我們還需要加入一些控制點,用來隨意調(diào)整區(qū)域的大小和位置玉凯。內(nèi)置函數(shù)GMapPolygon可以生成一個矩形對象势腮,然后添加到地圖上。

新建一個類SelectArea漫仆,將地圖控件作為構造函數(shù)的參數(shù)傳入捎拯。

  public SelectArea(GMapControl control)
        {
            this.control = control;
            //獲取兩個層,分別用于放置區(qū)域和控制點盲厌,如果沒有署照,測創(chuàng)建
            InitOverlay(control);
            //綁定事件
            InitEvent(control);
        }

同時,生成兩個層吗浩,分別用來放置圖形和控制點建芙。這也是我們制作標繪的思路,即通過控制點拓萌,生成復雜圖形岁钓。

 /// <summary>
        /// 初始化圖層,拖動層和顯示層微王,如果有則不創(chuàng)建
        /// </summary>
        /// <param name="control"></param>
        private void InitOverlay(GMapControl control)
        {
            bool haspolygons = false, hasdrags = false;
            foreach (GMapOverlay overlay in control.Overlays)
            {
                if (overlay.Id.Equals("polygons"))
                {
                    haspolygons = true;
                    this.polygonOverlay = overlay;
                    continue;
                }
                if (overlay.Id.Equals("drags"))
                {
                    hasdrags = true;
                    this.dragOverlay = overlay;
                    break;
                }
            }
            if (!haspolygons)
            {
                polygonOverlay = new GMapOverlay("polygons");
                control.Overlays.Insert(0, polygonOverlay);
            }
            if (!hasdrags)
            {
                dragOverlay = new GMapOverlay("drags");
                control.Overlays.Add(dragOverlay);
            }
        }

在類中設置左上和右下兩個關鍵點P1屡限、P2,綁定鼠標按下炕倘、移動和抬起事件钧大。當鼠標按下時,記錄第一個點罩旋,當鼠標移動時啊央,更新第二個點眶诈,當鼠標抬起時,停止更新瓜饥,同步在polygons層里繪制矩形逝撬。

 /// <summary>
        /// 根據(jù)2個關鍵點坐標,獲取矩形坐標
        /// </summary>
        /// <param name="p1"></param>
        /// <param name="p2"></param>
        /// <returns></returns>
        List<PointLatLng> GetPolygonPoints(PointLatLng p1, PointLatLng p2)
        {
            return new List<PointLatLng>(){
                new PointLatLng(p1.Lat,p1.Lng),
                new PointLatLng(p1.Lat,p2.Lng),
                new PointLatLng(p2.Lat,p2.Lng),
                new PointLatLng(p2.Lat,p1.Lng)
            };
        }

鼠標抬起后乓土,生成控制點宪潮。這里需要說明,其實控制點也是一個polygon矩形趣苏,只不過比較小狡相,再加上描邊效果,看起來像一個控制柄食磕【∽兀控制點有3個,p1彬伦、p2和中點滔悉,分別為drag1、drag2和dragcenter媚朦,每個控制點根據(jù)中心坐標氧敢,算出邊距為10的小矩形。

Polygon對象有一個.IsMouseOver屬性询张,可以判斷是否鼠標點擊在上面孙乖,但實測不好使,所以寫了一個檢測函數(shù)份氧,用來判斷控制點是否選中:

  /// <summary>
        /// 判斷點是否在區(qū)域范圍內(nèi)
        /// </summary>
        /// <param name="p"></param>
        /// <param name="pm"></param>
        /// <returns></returns>
        bool isInside(GPoint p, PointLatLng pm,int radius)
        {
            bool isinside = false;
            GPoint pa = control.FromLatLngToLocal(pm);
            if (p.X > pa.X - radius && p.X < pa.X + radius && p.Y > p.Y - radius && p.Y < pa.Y + radius)
            {
                isinside = true;
            }
            return isinside;
        }

當鼠標按下時唯袄,判斷選擇哪個控制點,并用state標記:

    void control_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            control.DragButton = System.Windows.Forms.MouseButtons.Right;
            isDrag = true;
            if (polygon == null&&state==0)
            {
                p1=control.FromLocalToLatLng(e.X, e.Y);
                p2=control.FromLocalToLatLng(e.X, e.Y);
                List<PointLatLng> points = GetPolygonPoints(p1, p2);
                polygon = new GMapPolygon(points, "polygon");
                polygon.Stroke =new Pen( new SolidBrush(Color.Red),3);
                polygonOverlay.Polygons.Add(polygon);
            }
            if (drag1 != null && isInside(new GPoint(e.X, e.Y), p1,5))
            {
                state = 1;
            }
            if (drag2 != null && isInside(new GPoint(e.X, e.Y), p2, 5))
            {
                state = 2;
            }
            if (dragcenter != null && isInside(new GPoint(e.X, e.Y), GetDragCenterPointsLatLng(p1, p2), 5))
            {
                state = 3;
            }


        }

添加一個代理事件蜗帜,用于在矩形變化時將坐標返回主界面的左側區(qū)域恋拷。

\\類外:
public  delegate  void  showInfo(SelectInfo selectinfo);
\\類內(nèi):
 public  event  showInfo MyShowInfo;
[\\mouseMove](file://mouseMove)事件中回饋
   SelectInfo cinfo = new SelectInfo();
                cinfo.StartPoint = p1;
                cinfo.EndPoint = p2;
                MyShowInfo(cinfo);

最終效果如下圖:


控制點效果圖
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市厅缺,隨后出現(xiàn)的幾起案子蔬顾,更是在濱河造成了極大的恐慌,老刑警劉巖湘捎,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诀豁,死亡現(xiàn)場離奇詭異,居然都是意外死亡窥妇,警方通過查閱死者的電腦和手機舷胜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來活翩,“玉大人烹骨,你說我怎么就攤上這事翻伺。” “怎么了沮焕?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵吨岭,是天一觀的道長。 經(jīng)常有香客問我峦树,道長未妹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任空入,我火速辦了婚禮,結果婚禮上族檬,老公的妹妹穿的比我還像新娘歪赢。我一直安慰自己,他們只是感情好单料,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布埋凯。 她就那樣靜靜地躺著,像睡著了一般扫尖。 火紅的嫁衣襯著肌膚如雪白对。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天换怖,我揣著相機與錄音甩恼,去河邊找鬼。 笑死沉颂,一個胖子當著我的面吹牛条摸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播铸屉,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼钉蒲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了彻坛?” 一聲冷哼從身側響起顷啼,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昌屉,沒想到半個月后钙蒙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡怠益,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年仪搔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜻牢。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡烤咧,死狀恐怖偏陪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情煮嫌,我是刑警寧澤笛谦,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站昌阿,受9級特大地震影響饥脑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜懦冰,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一灶轰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刷钢,春花似錦笋颤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至阱缓,卻和暖如春非凌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背荆针。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工敞嗡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人祭犯。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓秸妥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沃粗。 傳聞我的和親對象是個殘疾皇子粥惧,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 因為要做一個地圖操作的項目,需要用到這個地圖庫最盅,但是查詢官方API麻煩突雪,而且這個地圖框架的API做的用起來確實太麻...
    虛幻的銹色閱讀 33,909評論 1 15
  • 前言 Processing是一種靈活的軟件寫生本,是一種學習如何在視覺藝術的環(huán)境中編寫代碼的語言涡贱。自2001年以來...
    阿創(chuàng)你要加油閱讀 1,609評論 0 1
  • Chapter 1 :分類(Classificatio) 1.1 高斯混合模型(GMM:Gaussian-Mixt...
    jdzhangxin閱讀 8,554評論 0 5
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月咏删,有人笑有人哭,有人歡樂有人憂愁问词,有人驚喜有人失落督函,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,536評論 28 53
  • 信任包括信任自己和信任他人 很多時候,很多事情,失敗辰狡、遺憾锋叨、錯過,源于不自信宛篇,不信任他人 覺得自己做不成娃磺,別人做不...
    吳氵晃閱讀 6,190評論 4 8