Winform中的Google地图操作

2 篇文章 0 订阅

尽管在网页中能对地图进行一些操作,包括地址查询等功能,但是这些都限于网页内部。若要将这查询数据传递至Winform中,可以在Javascript中将数据存储值本地,然后Winform去读取这些数据,或者直接通过Winform来操作网页。前面一种方式可以处理一些数据的交换,但是对于事件的处理则比较困难。采用后面一种方式则可以很好的处理事件和数据的交换。地图的操作主要包括地图缩放、移动、地址查询、坐标查询、当前地图范围、缩放级别等。网页地图与Winform的交互具体来说分成两个部分,第一个部分就是通过Winform中的程序来操作网页,第二部分就是通过网页中变化的对象返回数据至Winform中。其中,第一部分具体来说分成两个过程,第一个过程是在网页中编写Javascript函数,第二个过程是在Winform中调用网页中编写的函数,下面将以放大地图为例来说明这些过程。第二部分即从网页自动获取数据,首先需要网页提供这些数据对象,然后在Winform中实时去获取这些数据。

2.1放大地图

首先在index.htm中添加放大地图的函数,代码如下:

functionZoomInMap() { 

    var class1 = map.getZoom();

    if(class1 <21)

    {

      class1=class1+1;

       map.setZoom(class1);

    }

}

该函数直接加在<script> </script>间即可,上面代码的含义分别是:

代码

说明

function ZoomInMap() {

定义放大地图函数

var class1 = map.getZoom();

定义变量class1,表示当前地图的缩放等级

if(class1 <21)

如果地图小于21级,目前Google地图的最大缩放级可达到20

class1=class1+1;

变量class1的值加上1,表示增加一级

map.setZoom(class1);

设置变量class1的值为地图的缩放等级

接下来就在VS项目中来处理,首先添加引用MicrosoftHTML Object Library,如下图所示:

然后添加一个“放大地图”的按钮,在按钮的单击事件中添加放大地图的代码,如下:

private void 放大地图button_Click(object sender, EventArgs e)

       {

            try

            {

                mshtml.IHTMLDocument2currentDoc = (mshtml.IHTMLDocument2)webBrowser1.Document.DomDocument;

                mshtml.IHTMLWindow2win = (mshtml.IHTMLWindow2)currentDoc.parentWindow;

                win.execScript("ZoomInMap()", "javascript");

            }

            catch(Exception except)

            {

                MessageBox.Show(except.Message,"提示!",

                    MessageBoxButtons.OK,MessageBoxIcon.Warning);

            }

       }

值得注意的是,上面代码中字符串ZoomInMap()必须与网页中Javascript内定义放大地图的函数名一样。运行程序,在Winform窗体中点击“放大地图”按钮即可放大网页中的地图。

2.2缩小地图

缩小地图与放大地图的原理一样,首先在index.htm中添加缩小地图的函数,如下:

function ZoomOutMap() { 

    var class1 = map.getZoom();

    if(class1 >1)

    {

       class1 =class1 -1;

          map.setZoom(class1);

    }

}

然后在VS项目中添加一个“缩小地图”按钮,为按钮的单击事件添加如下代码:

    private void缩小地图button_Click(objectsender, EventArgs e)

        {

            try

            {

                mshtml.IHTMLDocument2currentDoc = (mshtml.IHTMLDocument2)webBrowser.Document.DomDocument;

                mshtml.IHTMLWindow2win = (mshtml.IHTMLWindow2)currentDoc.parentWindow;

                win.execScript("ZoomOutMap()", "javascript");

            }

            catch(Exception except)

            {

                MessageBox.Show(except.Message,"提示!",

                    MessageBoxButtons.OK,MessageBoxIcon.Warning);

            }

       }

2.3查找地址

查找地址主要通过Google的地理解析服务来实现,首先在index.htm中定义解析的函数,如下代码:

var geocoder;

var marker;

function codeAddress(address){

  if (geocoder){

      geocoder.geocode( { 'address': address}, function(results, status)

  {

    if (status ==google.maps.GeocoderStatus.OK) {

       map.setCenter(results[0].geometry.location);

        var markerPositon =results[0].geometry.location;

        if(marker)

        {                

           marker.setPosition(markerPositon);   

        }

        else

        {

            marker = newgoogle.maps.Marker({

                    map: map,

                    position:markerPositon,

                    draggable:true 

          }); 

        }

        marker.setTitle(address);

        } else{

          //暂不处理

        }

      });

    }

}

在VS中添加一个textbox控件(Name为addressTextBox)和一个按钮,为按钮的单击事件添加如下代码:

private void 查找地址button_Click(object sender, EventArgs e)

        {

            try

            {

                if(addressTextBox.Text.Trim() != "")

                {

                    mshtml.IHTMLDocument2 currentDoc = (mshtml.IHTMLDocument2)webBrowser1.Document.DomDocument;

                    mshtml.IHTMLWindow2 win = (mshtml.IHTMLWindow2)currentDoc.parentWindow;

                    win.execScript("codeAddress(\"" +addressTextBox.Text + "\")", "javascript");

                }

            }

            catch(Exception except)

            {

                MessageBox.Show(except.Message,"提示!",

                    MessageBoxButtons.OK,MessageBoxIcon.Warning);

            }

       }

运行程序,其结果如下图:

2.4切换地图

Google地图提供了四种地图,这四种地图也可以通过Winform来任意切换,首先还是在index.htm中添加设置地图的函数,如下代码:

function SetHybridMap(){

    map.setMapTypeId(google.maps.MapTypeId.HYBRID);

}

 

function SetRoadMap(){

    map.setMapTypeId(google.maps.MapTypeId.ROADMAP);

}

 

function SetSatelliteMap(){

    map.setMapTypeId(google.maps.MapTypeId.SATELLITE);

}

 

function SetTerrainMap(){

    map.setMapTypeId(google.maps.MapTypeId.TERRAIN);

}

然后在VS中添加一个comboBox控件(Name为mapTypeComboBox),并为其Items添加四个值(电子地图、卫星地图、混合地图和地形地图),如下图所示:

同时设置其DropDownStyle属性为DropDown,如下图所示:

最后在mapTypeComboBox的SelectedIndexChanged事件中添加更改地图的代码,如下:

 private voidmapTypeComboBox_SelectedIndexChanged(objectsender, EventArgs e)

       {

            try

            {

                mshtml.IHTMLDocument2currentDoc = (mshtml.IHTMLDocument2)webBrowser1.Document.DomDocument;

                mshtml.IHTMLWindow2win = (mshtml.IHTMLWindow2)currentDoc.parentWindow;

                switch(mapTypeComboBox.Text)

                {

                    case"电子地图":

                        win.execScript("SetRoadMap()", "javascript");

                        break;

                    case"卫星地图":

                        win.execScript("SetSatelliteMap()", "javascript");

                        break;

                    case"混合地图":

                        win.execScript("SetHybridMap()", "javascript");

                        break;

                    case"地形地图":

                        win.execScript("SetTerrainMap()", "javascript");

                        break;

                }

            }

            catch(Exception except)

            {

                MessageBox.Show(except.Message,"提示!",

                    MessageBoxButtons.OK,MessageBoxIcon.Warning);

            }

       }

运行程序,其结果如下图所示:

2.5鼠标当前坐标及地图范围

首先在index.htm的<body>与</body>中添加如下代码:

<bid="mouselatitute">0</b>

<bid="mouselongitude">0</b>

<bid="XMax">100</b>

<bid="XMin">0</b>

<bid="YMax">100</b>

<bid="YMin">0</b>

<bid="ZoomClass">1</b>

然后在Script中函数initialize()内添加地图鼠标移动的监听事件,至此地图初始化函数如下(红色部分的代码为新添加的代码):

function initialize() {

  geocoder = new google.maps.Geocoder();   

  var myLatlng = newgoogle.maps.LatLng(30.658601,104.06485599999996);

  var myOptions = {

    zoom: 5,

    center: myLatlng,

    disableDoubleClickZoom:true,     

    scaleControl:true,    

    mapTypeId: google.maps.MapTypeId.ROADMAP

    }

  map = newgoogle.maps.Map(document.getElementById("map_canvas"), myOptions);

 

 google.maps.event.addListener(map,'mousemove', function(event) {

    if(event.latLng)

    {

document.getElementById("mouselatitute").innerHTML=event.latLng.lat();         document.getElementById("mouselongitude").innerHTML=event.latLng.lng();

var extent =map.getBounds();         document.getElementById("XMax").innerHTML=extent.getNorthEast().lng();

document.getElementById("YMax").innerHTML=extent.getNorthEast().lat();

document.getElementById("XMin").innerHTML=extent.getSouthWest().lng();

document.getElementById("YMin").innerHTML=extent.getSouthWest().lat();

document.getElementById("ZoomClass").innerHTML=map.getZoom();

    }   

    });

}

接下来在VS项目中窗体上添加状态栏,并添加三个StatusLabel,名称分别为:currentXYStatusLabel、currentZoneStatusLabel和zoomclassStatusLabel,如下图所示:

然后添加一个计时器timer,在timer的Tick事件中添加获取前面网页中的数据对象,如下代码:

 private voidtimer1_Tick(object sender, EventArgs e)

        {

            try

            {

                stringtag01 = webBrowser1.Document.GetElementById("mouselatitute").InnerText;

                stringtag02 = webBrowser1.Document.GetElementById("mouselongitude").InnerText;

                doublelat, lng;

                if(double.TryParse(tag01, out lat)

                    && double.TryParse(tag02, outlng))

                {

                    currentXYStatusLabel.Text ="当前坐标:"

                        + lat.ToString("F5") + ","+ lng.ToString("F5");

                }

 

                doublexmax, xmin, ymax, ymin;

                tag01 =webBrowser1.Document.GetElementById("XMax").InnerText;

                tag02 =webBrowser1.Document.GetElementById("XMin").InnerText;

                stringtag03 = webBrowser1.Document.GetElementById("YMax").InnerText;

                stringtag04 = webBrowser1.Document.GetElementById("YMin").InnerText;

 

                if(double.TryParse(tag01, out xmax)

                   && double.TryParse(tag02, outxmin)

                   && double.TryParse(tag03, outymax)

                   && double.TryParse(tag04, outymin))

                {

                    currentZoneStatusLabel.Text= "当前范围:XMin="

                        + xmin + ",XMax=" + xmax.ToString("F5")

                        + "; YMin=" + ymin.ToString("F5") + ",YMax="+ ymax.ToString("F5");

                }

               

                tag03 =webBrowser1.Document.GetElementById("ZoomClass").InnerText;

                intzoomclass;

                if(int.TryParse(tag03, outzoomclass))

                {

                    zoomclassStatusLabel.Text ="缩放等级:" + zoomclass.ToString();

                }

              

            }

            catch

            {

            }

       }

最后,设置timer1的Enable为true。运行程序,其结果如下图所示:



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值