`
yuanlanxiaup
  • 浏览: 895837 次
文章分类
社区版块
存档分类
最新评论

Winform中的Google地图操作

 
阅读更多

尽管在网页中能对地图进行一些操作,包括地址查询等功能,但是这些都限于网页内部。若要将这查询数据传递至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。运行程序,其结果如下图所示:



分享到:
评论
1 楼 xz1017347332 2013-07-23  
楼主,我试着照着你的方法做。开始,除了最后一个在状态栏显示坐标等信息都能正常,但是,下午,我修改了JS代码,但是还原了以后,就没办法打开网页了,希望能得到大神的帮助,最好有Js的源代码可以供我参考参考,谢谢大神,我的邮箱是:1017347332@qq.com

相关推荐

    winform中加载Google地图

    在Windows Forms(Winform)应用程序中集成Google地图是一项常见的需求,尤其对于开发地理位置相关的桌面应用。本示例将深入探讨如何使用C#语言在Winform中实现这一功能,包括地图的加载、分类、缩放以及经纬度的...

    winform调用goole地图

    在Windows Forms(Winform)应用中,调用Google地图通常是为了在应用程序中集成地图功能,让用户能够查看地理位置、导航或进行其他地图相关的操作。这里我们主要讨论如何利用WebBrowser控件来实现这一目标。 ...

    Winform里操作谷歌离线地图API及演示文档

    介绍谷歌离线地图插件API,及部分功能演示。 特别适合Winform里实现离线谷歌的朋友们。

    太乐地图Winform控件

    (谷歌地图、百度地图、天地图、高德地图、必应地图、诺基亚地图、ArcGIS Online地图等) 2、支持对太乐地图下载器下载的地图(*.azdb格式)进行本地离线访问 3、支持坐标纠偏 4、地图基本操作:放大缩小等 5、地图...

    C# Winform开发使用离线地图 GMap 例程

    这将为你提供基础的地图操作和Winform控件。 3. **导入离线地图数据** 离线地图数据通常以瓦片形式存储,每个瓦片代表地图的一个小部分。你可以从OpenStreetMap或其他地图数据源下载这些瓦片,并按照特定的目录...

    C# (winform)计算机地图制图程序

    在本项目中,我们探讨的是一个基于C#的Windows Forms(Winform)应用程序,用于创建和操作计算机地图。这个程序的核心目标是实现地图制图功能,允许用户在Windows环境下进行地图数据的展示、编辑和分析。C#是...

    c# winform 地图应用源码

    开发者需要理解如何在WinForm中嵌入地图控件,以及如何处理地图的加载、缩放、平移等操作。 2. **加入锚点**:锚点通常指的是地图上的固定位置或兴趣点。在地图应用中,用户可以设置锚点以标记特定地点,例如家、...

    google.rar_CSharp google_google earth winform_winform google ear

    标题中的"google.rar_CSharp google_google earth winform_winform google ear"暗示了一个项目,该项目可能涉及集成Google Earth或Google Maps功能到WinForm应用中,而描述则表明我们关注的是C#中调用Google搜索服务...

    GMap.NET_TEST.rar_GMAP_GMAP.NET_c# google地图二次开发_gmap winform

    GMap.NET是一个强大的开源库,专门用于C#开发者在Windows Forms(WinForm)环境中进行Google地图的二次开发。这个名为"GMap.NET_TEST.rar"的压缩包包含了一个使用GMap.NET库构建的示例项目,帮助开发者了解如何在C#...

    Winform下的地图开发控件(GMap.NET)使用心得

    对于希望在Winform或WPF应用中集成地图功能的开发者而言,GMap.NET无疑是一个值得考虑的优秀选择。无论是基础的地图展示,还是复杂的路径规划和地理编码,GMap.NET都能够提供有力的支持,大大简化了地图功能的开发...

    VS2008 WinForm类型的GoogleMap二次开发

    这个主题涉及到C#编程语言,以及如何在Windows桌面应用中集成和操作Google Maps API。 首先,让我们了解什么是Google Map二次开发。Google Maps API允许开发者在其应用程序中嵌入Google Maps,实现自定义功能,如...

    制作简单的winForm地图检索程序

    Google Maps API是Google提供的服务,允许开发者在其应用中嵌入地图功能,进行位置检索、路线规划等操作。API主要分为JavaScript版本和Web服务版本,这里我们关注的是JavaScript API,因为它是与WebBrowser控件交互...

    C#基于GMAP的winform地图程序

    在这个项目中,C#被用来编写WinForm应用的逻辑代码,处理用户交互和地图操作。 2. **Windows Forms (WinForms)**:这是一个.NET Framework的一部分,用于构建桌面应用程序的用户界面。在这里,WinForms被用来创建...

    WinForm下实现GMAP调用高德、百度地图

    - 编译并运行你的WinForm应用,你应该能看到地图界面并能进行各种地图操作。 在提供的压缩包文件中,`GMap.sln`是解决方案文件,包含了项目的所有配置;`新建 文本文档.txt`可能是开发过程中的文档或说明;`GMap`...

    Google地图简单开发

    在本文中,我们将深入探讨如何在C# WinForm应用程序中集成和使用Google地图API进行简单的开发。这个项目的核心是利用WebBrowser控件作为交互界面,将Google地图服务嵌入到桌面应用中。以下是你需要知道的关键知识点...

    Winform各种自定义控件

    `GMap.NET.Core.dll`和`GMap.NET.WindowsForms.dll`是GMap.NET库的组件,用于在Winform应用中集成Google Maps服务,提供地图显示、定位、路线规划等功能。如果自定义控件需要地图相关功能,如地址选择、地图标记等,...

    C#实现地图加载,指定区域添加标记,可进行投屏操作。

    1.启动后加载谷歌地图默认定位到中国地图; 2.选择坐标位置可以添加marker并显示自定义的tip内容; 3.不同的状态可以显示不同的marker; 4.连接多台显示器可以实现投屏的功能; 5.附件为完整源码工程; 6.为...

    Google地图定位

    在C# WinForm应用开发中,集成Google地图定位功能是一项常见的需求。这涉及到与Google Maps API的交互,以便实现地理定位、地址解析、距离计算以及路径规划等功能。下面将详细介绍这些知识点。 首先,Google Maps ...

    Winform 公交查询软件

    7. **地图集成**:虽然描述中没有提及,但为了更直观地展示公交线路,开发者可能会集成地图API,如Google Maps或高德地图,显示公交车路线和站点位置。 8. **数据缓存**:为了提高性能和减少对API的频繁调用,...

    [珍藏]C# Gmap加载高德地图项目

    在C#项目中集成GMap.NET,可以方便地实现地图的显示、缩放、平移等基本操作,并且支持添加各种地图标记、线段、多边形等复杂功能。 在该项目中,`GMap.sln`是解决方案文件,包含了整个项目的所有配置和依赖。`GMap....

Global site tag (gtag.js) - Google Analytics