一步一步手寫GIS開源項目-(2)地圖平移縮放實現

系列文章目錄

一步一步手寫GIS開源項目-(1)500行代碼實現基礎GIS展示功能

一步一步手寫GIS開源項目-(2)地圖平移縮放實現

項目github地址:https://github.com/HuHongYong/ATtuingMap

1. 地圖平移

地圖平移分爲三步:

1鼠標按下-首先要取得鼠標按下地圖的屏幕座標,以及保存這時候的地圖圖片。

/// <summary>
/// 鼠標按下
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
     //鼠標按下的屏幕座標位置
     _mousedrag = e.Location;
     //鼠標按下,爲了區分普通鼠標移動和鼠標按下移動
     _mousedragging = true;
     //當前地圖 圖片
     _mousedragImg = pictureBox1.Image;
}

2鼠標移動-平移過程對上一步的地圖圖片進行切割,以模擬地圖拖放效果。如圖:

image

/// <summary>
/// 鼠標移動
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
     var point = Transform.MapToWorld(new PointF(e.X, e.Y), myMap);
     label1.Text = $"座標X:{point.X}  Y:{point.Y}";
     //拖動已有圖像
     if (_mousedragging)
     {
         Bitmap _dragImg1 = new Bitmap(pictureBox1.Width, pictureBox1.Height);
         Graphics g = Graphics.FromImage(_dragImg1);
         g.Clear(Color.Transparent);

        //圖片裁剪
         g.DrawImageUnscaled(_mousedragImg,
                             new System.Drawing.Point(e.Location.X - _mousedrag.X,
                                                      e.Location.Y - _mousedrag.Y));
         g.Dispose();
         pictureBox1.Image = _dragImg1;
     }
}

3鼠標彈起-zoom地圖縮放不變,只需重新定位地圖中心點,對地圖進行重新繪製。

image

/// <summary>
/// 鼠標彈起事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
     //地圖的新中心
     System.Drawing.Point pnt = new System.Drawing.Point(pictureBox1.Width / 2 + (_mousedrag.X - e.Location.X),
                                            pictureBox1.Height / 2 + (_mousedrag.Y - e.Location.Y));
     //修改鼠標拖動後的地圖中心空間座標點
     myMap.Center = Transform.MapToWorld(pnt, myMap);
     pictureBox1.Image = myMap.GetMap();
     //取消鼠標拖動
     _mousedragging = false;
}

2.地圖縮放

地圖縮放比較難理解,這裏我們以下圖的例子爲例,黑色邊框爲地圖可視區域,紅色矩形代表的地圖上的一個矢量圖形,這時候鼠標在左上角或者任意一點,如圖1、2,

image     4

滾動鼠標滾輪對地圖進行放大,這是展示不同鼠標點放大後的地圖如圖3、4

image    6

      我們知道地圖的兩個核心要素爲zoom和新的地圖中心點座標,zoom=zoom*縮放倍數,新的地圖中心點座標怎麼算呢?我們可以通過第5、6圖進行簡單的轉化便可以算出。

首先通過把地圖中心點定位到鼠標點,鼠標點的空間座標已經知道,可以從六張圖中看出,鼠標點到未來中心點的紫色線是恆定的,那我們知道了未來中心點的屏幕座標,便可以求出他的未來中心點的空間座標。實現代碼如下:

image    5

/// <summary>
/// 鼠標滾輪觸發縮放地圖事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MapImage_Wheel(object sender, MouseEventArgs e)
{
     //重新定位鼠標位置爲中心點
     myMap.Center = Transform.MapToWorld(new System.Drawing.Point(e.X, e.Y), myMap);
     //e.Delta常數,鼠標滾輪滾一下
     double scale = (e.Delta / 120.0);
     //縮放1.2倍
     double scaleBase = 1 + (2.0 / 10);
     //重新設置zoom縮放等級
     myMap.Zoom *= Math.Pow(scaleBase, scale);

    //如圖第5、6中的未來中心點的屏幕座標
     int NewCenterX = (pictureBox1.Width / 2) + ((pictureBox1.Width / 2) - e.X);
     int NewCenterY = (pictureBox1.Height / 2) + ((pictureBox1.Height / 2) - e.Y);
     //修改鼠標縮放後的地圖中心點空間座標
     myMap.Center = Transform.MapToWorld(new System.Drawing.Point(NewCenterX, NewCenterY), myMap);
     pictureBox1.Image = myMap.GetMap();
}

3.總結

        本節主要講了一下地圖的平移和縮放的實現,展示地圖操作的最基礎的操作功能,相信大家可以通過簡單的代碼理解到GIS最核心的展示功能,下一節主要講一下shape文件中的.dbf屬性文件的讀取以及鼠標點擊查詢,敬請期待。

本節代碼上傳github,生成一個release,大家可以參考調試一下項目源碼。

image

github項目地址:https://github.com/HuHongYong/ATtuingMap

作者:ATtuing

出處:http://www.cnblogs.com/ATtuing

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章