当你的网页中包含一个地图,你可以以编程的方式更改地图。您可以更改地图的风格,调整缩放级别,平移地图到新的位置,显示和隐藏默认导航控件,并添加自己的地图控件。
修改地图视图
有几种方法可以以编程方式更改地图试图。你可以:
- 调用VEMap.ZoomIn方法和VEMap.ZoomOut方法实现地图的缩放。
VEMap.ZoomIn方法
将地图的缩放级别加一。
备注:有效值范围从1到19。如果现在的缩放级别已经是最大,再调用放大方法时,缩放级别不发生变化。
VEMap.ZoomOut方法
将地图的缩放级别减一。
备注:有效值范围从1到19。如果现在的缩放级别已经是最小,再调用缩小方法时,缩放级别不发生变化。
- 调用VEMap.SetZoomLevel方法可以设置缩放级别为特定值。
VEMap.SetZoomLevel方法
设置地图的视图为某个特定的缩放级别。
VEMap.SetZoomLevel(zoomLevel);
参数 描述 zoomLevel 地图的缩放级别。有效值在从1到19 备注:更高的缩放级别显示更多的地图细节,你似乎就更接近地面。有些地图没有高分辨率的航空影像,因此可能不支持最高的缩放级别。
如果你既设置中心点又设置缩放级别,你应该使用VEMap.SetCenterAndZoom方法。而不是分别调用VEMap.SetCenter方法和SetZoomLevel方法。
- 设置地图的中心位置,可以通过调用VEMap.SetCenter方法实现。或者既设置地图的中心位置又设置缩放级别,可以通过调用VEMap.SetCenterAndZoom方法。
VEMap.SetCenterAndZoom方法
将地图的中心定位到一个特定的经纬度上,并设置地图的缩放级别。
VEMap.SetCenterAndZoom(VELatLong, zoomLevel);
参数 描述 VELatLong 一个VELatlong类的对象。其中包含了定位地图中心位置的经度和纬度。 zoomLevel 地图的缩放级别。有效值为从1到19。 备注:SetCenterAndZoom方法返回结果的速度比分别调用SetCenter方法和SetZoomLevel方法要快。
VEMap.SetCenter方法
定位地图中心的经纬度。
VEMap.SetCenter(VELatLong);
参数 描述 VELatLong 一个VELatlong类的对象。其中包含了定位地图中心位置的经度和纬度。
例如:
1: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">2: <html>3: <head>4: <title></title>5: <meta http-equiv="Content-Type" content="text/html; charset=utf-8">6:7: <script type="text/javascript" src="http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2"></script>8:9: <script type="text/javascript">10: var map = null;11: var latLong = null;12: var zoomLevel = 3;13:14: function GetMap()15: {16: map = new VEMap('myMap');17: map.LoadMap();18:19: map.SetZoomLevel(zoomLevel);20:21: // zoom to cursor and center22: map.SetMouseWheelZoomToCenter(false);23:24: document.getElementById('txtZoom').value = zoomLevel;25: map.AttachEvent("onclick", GetLatLong);26: latLong = map.GetCenter();27: divInfo.innerHTML = latLong;28: }29:30: function GetLatLong(e)31: {32: //Get the pixel coordinates from the click event, convert to LatLong value33: var x = e.mapX;34: var y = e.mapY;35: pixel = new VEPixel(x, y);36: latLong = map.PixelToLatLong(pixel);37: divInfo.innerHTML = latLong;38: }39:40: function SetCenterAndZoom()41: {42: map.SetCenterAndZoom(latLong, zoomLevel);43: }44:45: function SetCenter()46: {47: map.SetCenter(latLong);48: }49:50: function SetZoom()51: {52: map.SetZoomLevel(zoomLevel);53: }54:55: function ZoomIn()56: {57: //Increase zoom level by a factor of 158: map.ZoomIn();59: document.getElementById('txtZoom').value = map.GetZoomLevel();60: }61:62: function ZoomOut()63: {64: //Decrease zoom level by a factor of 165: map.ZoomOut();66: document.getElementById('txtZoom').value = map.GetZoomLevel();67: }68:69: function ValidateEntry()70: {71: //Check to make sure zoom level is within range72: if (document.getElementById('txtZoom').value > 0 && document.getElementById('txtZoom').value <= 19)73: {74: zoomLevel = document.getElementById('txtZoom').value;75: }76: else77: {78: alert("Enter a value between 1 and 19.");79: }80: }81: </script>82: </head>83: <body onload="GetMap();" style="font-family:Arial">84: <div id='myMap' style="position:relative; width:400px; height:400px;"></div>85: Click the map to select a center point.<br />86: <div id="divInfo"> <br /></div>87: Zoom Level: <input id="txtZoom" type="text" value="" onchange="ValidateEntry()"/><br />88: <input id="btnSetCZ" type="button" value="Set Center and Zoom" onclick="SetCenterAndZoom()"><br />89: <input id="btnSetCenter" type="button" value="Set Center" onclick="SetCenter()"><br />90: <input id="btnSetZoom" type="button" value="Set Zoom" onclick="SetZoom()"><br />91: <input id="btnZoomIn" type="button" value="Zoom in by 1" onclick="ZoomIn()">92: <input id="btnZoomOut" type="button" value="Zoom out by 1" onclick="ZoomOut()">93: </body>94: </html>
- 调用VEMap.SetMapStyle方法,修改地图的样式
VEMap.SetMapStyle方法
设置地图的样式
VEMap.SetMapStyle(mapStyle);
参数 描述 mapStyle 定义地图样式的VEMapStyle枚举值
成员 描述 Road 路线地图样式 Shaded 阴影地图风格是一个路线图的阴影轮廓 Aerial 航拍地图样式 Hybrid 混合样式是一个覆盖有标签的航拍图样式 Obligue 斜地图风格,这与Birdseye样式相同 Birdseye 倾斜的鸟瞰样式 BirdseyeHybrid 一个覆盖有标签的鸟瞰图样式 备注:阴影地图样式不是所有的区域都支持。
如果你想在VEMapMode.Mode3D中查看Birdseye或BirdseyeHybrid地图样式,就必须使用VEMap.Show3DBirdseye方法。
地图的样式还可以在调用VEMap.LoadMap方法加载地图时设置。
- 让虚拟地球基于你设置的点、图钉、折线来决定最佳的地图展现样式。你可以通过将一个点或线的数组传递到VEMap.SetMapView方法中实现上述功能。
VEMap.SetMapView方法
设置地图的样式以包含定义在一个数组中的所有的点、线或多边形。或者设置为一个VEMapViewSpecification类对象所定义的视图。
VEMap.SetMapView(object);
参数 描述 object 在2D模式中,是一个VELatLong类端点的数组或者一个VELatLongRectangle类的对象。
在3D模式中,也可以是一个VEMapViewSpecification类对象。这个对象定义一个位置、高度、间距,并将其用于地图视图。备注:当你想让地图覆盖已知点集合,而你又不确定地图中心位置时,这个方法非常有用。或者缩放级别必须适应你现在的地图的整个区域时,也可适用。
例如:
1: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">2: <html>3: <head>4: <title></title>5: <meta http-equiv="Content-Type" content="text/html; charset=utf-8">6:7: <script type="text/javascript" src="http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2"></script>8:9: <script type="text/javascript">10: var map = null;11: var center = new VELatLong(38.62504326121764, -90.18497586250308);12: var initView = new VEMapViewSpecification(center, 16, 1000, -90, 0);13:14: function GetMap()15: {16: map = new VEMap('myMap');17: map.LoadMap();18:19: map.SetMapMode(VEMapMode.Mode2D);20: map.SetMapStyle(VEMapStyle.Aerial);21: map.SetMapView(initView);22: }23:24: function ToggleMode()25: {26: var mode = map.GetMapMode();27:28: if (mode == VEMapMode.Mode2D)29: {30: map.SetMapMode(VEMapMode.Mode3D);31: }32: else if (mode == VEMapMode.Mode3D)33: {34: map.SetMapMode(VEMapMode.Mode2D);35: }36: }37:38: function SetMapStyle()39: {40: if (styleForm.styleType[0].checked)41: {42: var style = map.GetMapStyle();43:44: if (style == VEMapStyle.Aerial)45: {46: alert("The Aerial style is already set.");47: }48: else49: {50: map.SetMapStyle(VEMapStyle.Aerial);51: alert("Map style has been set to Aerial.");52: }53: }54: else if (styleForm.styleType[1].checked)55: {56: var style = map.GetMapStyle();57:58: if (style == VEMapStyle.Birdseye)59: {60: alert("The Birdseye style is already set.");61: }62: else63: {64: map.SetMapStyle(VEMapStyle.Birdseye);65: alert("Map style has been set to Birdseye.");66: }67: }68: else if (styleForm.styleType[2].checked)69: {70: var style = map.GetMapStyle();71:72: if (style == VEMapStyle.Road)73: {74: alert("The Road style is already set.");75: }76: else77: {78: map.SetMapStyle(VEMapStyle.Road);79: alert("Map style has been set to Road.");80: }81: }82: else if (styleForm.styleType[3].checked)83: {84: var style = map.GetMapStyle();85:86: if (style == VEMapStyle.Hybrid)87: {88: alert("The Hybrid style is already set.");89: }90: else91: {92: map.SetMapStyle(VEMapStyle.Hybrid);93: alert("Map style has been set to Hybrid.");94: }95: }96: }97: </script>98: </head>99: <body onload="GetMap();">100: <div id='myMap' style="position:relative; width:400px; height:400px;"></div>101: <INPUT id="btnToggle" type="button" value="Toggle Map Mode" name="btnToggle"102: onclick="ToggleMode();">103: <form name="styleForm">104: <input id="aerial" type="radio" name="styleType" checked="checked" /> Aerial<br />105: <input id="birdseye" type="radio" name="styleType" /> Birdseye<br />106: <input id="road" type="radio" name="styleType" /> Road<br />107: <input id="hybrid" type="radio" name="styleType" /> Hybrid108: </form>109: <INPUT id="btnStyle" type="button" value="Set Selected Map Style" name="btnStyle"110: onclick="SetMapStyle();">111: <div id="latlon"></div>112: </body>113: </html>
显示和隐藏地图控件
你可以通过调用VEMap.HideDashboard方法和VEMap.ShowDashboard方法显示和隐藏默认的地图导航控件。你还可以使用HTML创建自己的地图导航控件,并调用VEMap.AddControl方法将这些控件添加到地图中。
VEMap.HideDashboard方法
隐藏控制地图的默认的用户接口(平移和缩放控件)
备注:如果你想在地图上添加自己的用户接口以控制地图,那么你可以调用这个方法先隐藏默认的控件,然后再使用VEMap.AddControl方法显示自定义控件。要显示默认的面板,可以调用VEMap.ShowDashboard方法。
VEMap.ShowDashboard方法
显示默认的控制地图界面(平移和缩放控制)。默认情况下是这种显示模式。
例如:
1: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">2: <html>3: <head>4: <title></title>5: <meta http-equiv="Content-Type" content="text/html; charset=utf-8">6:7: <script type="text/javascript" src="http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2"></script>8:9: <script type="text/javascript">10: var map = null;11: var clickEvent = null;12:13: function GetMap()14: {15: map = new VEMap('myMap');16:17: // SetDashboardSize must be called before calling LoadMap18: map.SetDashboardSize(VEDashboardSize.Normal);19:20: map.LoadMap();21:22: map.SetMapMode(VEMapMode.Mode3D);23:24: }25:26: // Dashboard hide & show calls27: function HideDashboard()28: {29: map.HideDashboard();30: }31:32: function ShowDashboard()33: {34: map.ShowDashboard();35: }36:37: // 3D Navigation hide & show calls38: function Hide3DNav()39: {40: map.Hide3DNavigationControl();41: }42:43: function Show3DNav()44: {45: if (map.GetMapMode() == VEMapMode.Mode2D)46: {47: map.SetMapMode(VEMapMode.Mode3D);48: }49:50: map.Show3DNavigationControl();51: }52:53:54: // Mini Map hide & show calls55: function HideMiniMap()56: {57: map.HideMiniMap();58: }59:60: function ShowMiniMap()61: {62: if (map.GetMapMode() == VEMapMode.Mode3D)63: {64: map.SetMapMode(VEMapMode.Mode2D);65: }66:67: map.ShowMiniMap(200, 100);68: }69:70: function SetScaleBar(distanceUnit)71: {72: map.SetScaleBarDistanceUnit(distanceUnit);73: }74: </script>75: </head>76: <body onload="GetMap();" style="font-family: Arial">77: <div id='myMap' style="position: relative; width: 800px; height: 400px;">78: </div>79: <div id="links">80: <a href="#" onclick="HideDashboard()">Hide Dashboard</a> | <a href="#" onclick="ShowDashboard()">81: Show Dashboard</a><br />82: <a href="#" onclick="Hide3DNav()">Hide 3D Navigation Control</a> | <a href="#" onclick="Show3DNav()">83: Show 3D Navigation Control</a><br />84: <a href="#" onclick="HideMiniMap()">Hide Mini Map</a> | <a href="#" onclick="ShowMiniMap()">85: Show Mini Map(2D view only)</a><br />86: <a href="#" onclick="SetScaleBar(VEDistanceUnit.Miles)">Set Scale Bar Distance Unit to Miles</a> |87: <a href="#" onclick="SetScaleBar(VEDistanceUnit.Kilometers)">Set Scale Bar Distance Unit to Kilometers</a>88: </div>89: </body>90: </html>
VEMap.AddControl方法
添加一个自定义控件到地图中。
VEMap.AddControl(element, zIndex);
参数 描述 element 包含要加入到地图中的控件的HTML元素 zIndex 控件的顺序。可选 注意:element参数是一个可以内嵌Java script的HTML元素。来在执行之前验证网页上的输入值。
备注:你可以使用文档对象模型(DOM)中的document.CreateElement方法来创建一个HTML新元素。添加你需要的方法实现,然后调用AddControl方法。你还可以使用DOM来移除控件。
当在3D模式下运行时,由于IE浏览器在网页上显示嵌入的控件的方式,自定义控件会被隐藏在地图的后面。如果你想要在3D模式中显示一个自定义的控件,可以遵循如下步骤:
- 创建一个IFrame元素。使这个元素的大小和位置都与自定义控件相当。
- 设置IFrame的frameborder属性为0,以及scrolling属性为“on”。
- 在IFrame的style属性中,设置z-index属性为1,位置设置为与控件相当。
- 在自定义控件的style属性中,设置z-index数大于1。
- 调用下面这样代码,shim是IFrame元素,el是你的自定义控件:
el.shimElement = shim;el.parentNode.insertBefore(shim, el);
例如:
1: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">2: <html>3: <head>4: <title></title>5: <meta http-equiv="Content-Type" content="text/html; charset=utf-8">6:7: <script type="text/javascript" src="http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2"></script>8:9: <script type="text/javascript">10: var map = null;11: var i = 0;12:13: function GetMap()14: {15: map = new VEMap('myMap');16: map.LoadMap();17: }18:19: function AddControl()20: {21: var el = document.createElement("div");22: el.id = "myControl" + i;23: el.style.top = 100 + (i * 10);24: el.style.left = 100 + (i * 10);25: el.style.border = "2px solid black";26: el.style.background = "White";27: el.innerHTML = el.id;28: map.AddControl(el);29: addShim(el);30: counter.value = i;31: i++;32: }33:34: function addShim(el)35: {36: var shim = document.createElement("iframe");37: shim.id = "myShim" + i;38: shim.frameBorder = "0";39: shim.style.position = "absolute";40: shim.style.zIndex = "1";41: shim.style.top = el.offsetTop;42: shim.style.left = el.offsetLeft;43: shim.width = el.offsetWidth;44: shim.height = el.offsetHeight;45: el.shimElement = shim;46: el.parentNode.insertBefore(shim, el);47: }48:49: function DeleteControl()50: {51: var myControl = document.getElementById("myControl" + counter.value);52:53: if (myControl!=null)54: {55: var myControlID = myControl.id;56: map.DeleteControl(myControl);57: alert("Control " + myControlID + " has been deleted.");58: }59: else60: {61: alert("No control with ID " + counter.value + " was found.");62: return;63: }64:65: var myShim = document.getElementById("myShim" + counter.value);66:67: if (myShim!=null)68: {69: myShim.parentNode.removeChild(myShim);70: }71:72: myShim = null;73: i--;74: counter.value = i;75: }76:77: function HideControl()78: {79: var myControl = document.getElementById("myControl" + counter.value);80:81: if (myControl!=null)82: {83: map.HideControl(myControl);84: alert(myControl.id + " is now hidden from view.");85: }86: else87: {88: alert("No control with ID " + counter.value + " was found.");89: return;90: }91: }92:93: function ShowControl()94: {95: var myControl = document.getElementById("myControl" + counter.value);96:97: if (myControl!=null)98: {99: map.ShowControl(myControl);100: alert(myControl.id + " has been restored.");101: }102: else103: {104: alert("No control with ID " + counter.value + " was found.");105: return;106: }107: }108: </script>109: </head>110: <body onload="GetMap();" style="font-family:Arial;font-size:x-small">111: <div id='myMap' style="position: relative; width: 400px; height: 400px;">112: </div>113: Control: 114: <input type="text" id="counter" size="20" value="0"/>115: <br />116: <input type="button" value="add control" onclick="AddControl();"/>117: <input type="button" value="delete control" onclick="DeleteControl();"/>118: <br/>119: <input type="button" value="hide control" onclick="HideControl();"/>120: <input type="button" value="show control" onclick="ShowControl();"/>121: </body>122: </html>