VEMap.GetDirections メソッド
多地点のルートをマップ上に描画し、ルートに関する詳細情報をコールバック関数に渡します。
構文
VEMap.GetDirections(locations, options);
パラメータ
パラメータ | 説明 |
---|---|
locations |
ルート上で通過する必要がある地点を指定するオブジェクトの配列。地点として指定できるのは VELatLong クラス オブジェクトまたは文字列オブジェクトです。最大 25 か所を指定できます。 |
options |
ルート設定のオプションを指定する VERouteOptions クラス オブジェクト。 |
戻り値
options パラメータに渡された VERouteOptions オブジェクトの VERouteOptions.RouteCallback プロパティに指定されているコールバック関数は、順路案内などのルートの詳細情報が格納された VERoute クラス オブジェクトを受け取ります。
locations パラメータの長さが 25 を超えている場合、空の VERoute オブジェクトが返されます。空の VERoute オブジェクトには道順情報が格納されておらず、VERoute.Distance プロパティと VERoute.Time プロパティは 0 です。
locations パラメータで指定された地点の中に見つからないものが 1 つでもあると、コールバック関数に null が返されます。
VERouteOptions.RouteMode プロパティが VERouteMode.Walking に設定されている場合、出発地点と到着地点の間のルートの距離の合計が 16 キロメートルを超えていると、空の VERoute オブジェクトが返されます。このルートの合計距離には、徒歩で移動しない部分も含みます。たとえば、ルート上のフェリーで移動する部分も、ルートの合計距離に含まれます。
解説
ローカライズされた道順案内をルートに含めることができます。そのためには、mkt 属性をマップ コントロール参照に追加します (さらに VERouteOptions.UseMWS プロパティを true に設定しなければならない場合もあります)。サポートされているカルチャなど、ローカライズされた結果を返す方法の詳細については、「ローカライズされた結果を返す方法」を参照してください。
この内容をマイル単位ではなくキロメートル単位にする必要がある場合は、VERouteOptions.DistanceUnit プロパティを VERouteDistanceUnit.Kilometer に設定します。
例
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript" src="http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.1"></script>
<script type="text/javascript">
var map = null;
// 初期マップ ビュー
var SeattleEastside = new VELatLong(47.65, -122.24, 0, VEAltitudeMode.Default);
function GetMap()
{
map = new VEMap('myMap');
map.LoadMap(SeattleEastside, 8);
}
function GetRouteMap()
{
var locations;
if (legForm.legType[0].checked)
{
locations = new Array("Tacoma WA", "Seattle WA", "Everett WA");
}
else if (legForm.legType[1].checked)
{
locations = new Array("Tacoma WA", "Bellevue WA", "Everett WA");
}
var options = new VERouteOptions;
// 次の行の設定を忘れずに行う必要があります。
options.DrawRoute = true;
// マップを変更しないように設定します。
options.SetBestMapView = false;
// マップ上のルートが決定すると、次の行で指定する関数が呼び出されます。
options.RouteCallback = ShowTurns;
// マイル単位で表示します。
options.DistanceUnit = VERouteDistanceUnit.Mile;
// 地名の選択画面を表示します。
options.ShowDisambiguation = true;
map.GetDirections(locations, options);
}
function ShowTurns(route)
{
var turns = "<h3>進路変更ごとの案内</h3> (四捨五入による誤差の可能性があります)";
turns += "<p><b>距離:</b> " + route.Distance.toFixed(1) + " マイル";
turns += "<br/><b>時間:</b> " + GetTime(route.Time) + "</p>";
if (dirsForm.dirsType[0].checked)
{
// ルートの詳細情報を取り出して、DIV タグ内に挿入します。
var legs = route.RouteLegs;
var leg = null;
var turnNum = 0; // 進路の番号
// 中間区間を取得します。
for(var i = 0; i < legs.length; i++)
{
// 参照のたびに添え字を指定する手間を省くため、現在の区間を変数に格納します。
leg = legs[i]; // leg は VERouteLeg オブジェクトです。
var legNum = i + 1;
turns += "<br/><b>距離 (区間 " + legNum + "):</b> " + leg.Distance.toFixed(1) + " マイル" +
"<br/><b>時間 (区間 " + legNum + "):</b> " + GetTime(leg.Time) + "<br/><br/>";
// 各中間区間の詳細情報を取り出します。
var turn = null; // 進路
var legDistance = null; // 進路の距離
for(var j = 0; j < leg.Itinerary.Items.length; j ++)
{
turnNum++;
turn = leg.Itinerary.Items[j]; // turn は VERouteItineraryItem オブジェクトです。
turns += "<b>" + turnNum + "</b>\t" + turn.Text;
legDistance = turn.Distance;
// 到着地の情報に "0.0" と表示されないようにします。
if(legDistance > 0)
{
// 距離を四捨五入して小数点以下 1 桁までにします。
turns += " (" + legDistance.toFixed(1) + " マイル";
// 時間情報がある場合は追加します。
if(turn.Time != null)
{
turns += "; " + GetTime(turn.Time);
}
turns += ")<br/>";
}
}
turns += "<br/>";
}
// DIV タグ内に道順案内を挿入します。
SetDirections(turns);
}
}
function SetDirections(s)
{
var d = document.getElementById("directions");
d.innerHTML = s;
}
// time は秒単位の時間を表す整数値です。
// 適切な形式の文字列を返します。
function GetTime(time)
{
if(time == null)
{
return("");
}
if(time > 60)
{ // time == 100 の場合
var seconds = time % 60; // seconds == 40
var minutes = time - seconds; // minutes == 60
minutes = minutes / 60; // ここで minutes == 1 になります。
if(minutes > 60)
{ // minutes == 100 の場合
var minLeft = minutes % 60; // minLeft == 40
var hours = minutes - minLeft; // hours == 60
hours = hours / 60; // ここで hours == 1 になります。
return(hours + " 時間 " + minLeft + " 分 " + seconds + " 秒");
}
else
{
return(minutes + " 分 " + seconds + " 秒");
}
}
else
{
return(time + " 秒");
}
}
function ClearAll()
{
map.DeleteRoute();
SetDirections("");
map.LoadMap(SeattleEastside, 8);
}
</script>
</head>
<body onload="GetMap();" style="font-family:MS PGothic">
<h3>Tacoma から Everett へのルートと道順案内の取得 (道順案内の取得は任意)</h3>
<div id='myMap' style="position:relative; width:400px; height:400px;"></div>
<form name="legForm">
ルート:
<br />
<input id="thruSeattle" type="radio" name="legType" checked="checked"/>
Seattle 経由
<br />
<input id="thruBellevue" type="radio" name="legType"/>
Bellevue 経由
</form>
<form name="dirsForm">
<input id="showdirs" type="radio" name="dirsType" checked="checked"/>
進路変更ごとの道順案内を下に表示する
<br />
<input id="showdirs" type="radio" name="dirsType"/>
進路変更ごとの道順案内を表示しない
</form>
<input id="getroutemap" type="button" value="ルート マップの取得" onclick="GetRouteMap();"/>
<input id="clear" type="button" value="すべて消去" onclick="ClearAll();"/>
<div id='directions'></div>
</body>
</html>