尽管在网页中能对地图进行一些操作,包括地址查询等功能,但是这些都限于网页内部。若要将这查询数据传递至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。运行程序,其结果如下图所示:
分享到:
相关推荐
C#中winform开发的地图定位-Google地图定位
在winform中使用Google地图的示例,c#开发。包括地图分类,地图缩放,地图的经纬度处理。
winform调用百度地图,实时定位
本代码在VS2010开发环境,基于winform窗口小程序开发,实现了对高德地图的加载和画线基本方法,适合初学者参考,更多功能请使用高德地图官网的的api。
介绍谷歌离线地图插件API,及部分功能演示。 特别适合Winform里实现离线谷歌的朋友们。
winform使用webbrowse调用goole地图的源码例子,简单好用
基于C#的WinForm中DataGridView控件操作汇总
C#开发Winform地图项目的童鞋们有福啦,太乐地图控件for winform V1.1正式发布,支持访问40余款国内外主流地图,助您快速搭建桌面级地图产品! 1、支持访问40余款国内外主流地图 (谷歌地图、百度地图、天地图、...
VS2012开发环境,C# Winform 查看baidu地图,并且能显示行政区域的百度坐标点。
VS2008源码,一个小程序。...Google地图定位-C#中winform开发的地图定位 可以定位经纬度或是通过经纬度查找地址 也可以查询两个经纬度间的球面距离 还有路线搜索,程序需要电脑上安装有Google Earth相关程序和插件。
WinForm 嵌入了百度地图,实现了单点定位、多点定位、线路规划等等功能。 博客地址:https://www.cnblogs.com/luoyuhao/p/14523797.html
一个HTML文件调用了百度地图接口,一个Winform程序调用了该网页,显示地图
在WinForm程序中,webBrowser显示页面使用谷歌内核。避免了网页在WinForm中显示兼容性问题。
针对DataGridview在Winform中的各种操作情况进行总结 希望能够帮助有需要的
在WinForm中操作excel,动态显示工具栏,将数据库数据读取显示到excel并进行操作
C# winform中使用Redis
c# winform 2d 地图编辑器。用于各种应用
完整的工程,不像个别只放.cs的资源,下载就能用。单纯实现高德、百度地图的加载,但百度坐标计算有问题(本人打算用高德了),大家酌情考虑。
3d地图引擎,C#示例代码。渲染各种类型数据。
C# (winform)计算机地图制图程序 C# (winform)计算机地图制图程序 C# (winform)计算机地图制图程序