最近のトラックバック

2017年9月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Google AdSense2

WebAPIサンプル

Web APIのレスポンスXML形式データをJSONに変換

WebAPIから送られたXML形式データをJSONに変換について記述する。
「XML→JSONへのデータ変換」および「プロキシサーバアクセス」に「JKL.ParseXML」というJavaScriptライブラリを利用している。


■JKL.ParseXMLの入手
Kawa.net xpJKL.ParseXML/ajax通信処理ライブラリからダウンロード出来る。
同ページにはライブラリの使用方法も記述されている。
ライセンスは「修正BSD」。


■サンプル
このサンプルソースには以下の注意点がある。
①fnProxyXml2Json()メソッド内では本ブログの別記事の「ASP.NET(C#)でWeb API中継用プロキシサーバを作ってみた」で紹介したプロキシサーバを利用している。
このサーバはインターネット上に存在しないため、各自で利用するプロキシサーバに書き直す必要がある。
②価格調査で有名な価格.comが提供している「価格.com Webサービス」、および文字コード変換するJavaScriptライブラリ「Escape Codec Library: ecl.js」を利用している。
サンプルを試す場合、事前に「ecl.js」を入手する必要がある。
「ecl.js」は「価格.com Webサービス」で検索条件をSJISでエンコードするために利用している。


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>ASP.NET Webサービスプロキシ&XML→JSON変換テスト</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<script src="jkl-parsexml.js" type="text/jscript"></script>
<script src="ecl.js" type="text/jscript"></script>
<script type="text/javascript">

/// <summary>
/// 価格.com Webサービスのキー(貴方のIDを設定してください)
/// </summary>
var g_sKakakuApiKey = "XXXXXXXXXXXXXXXXXXXX";

/// <summary>
/// REST通信&取得したXMLデータをJSON変換
/// </summary>
/// <param name="url">REST対象のURL</param>
/// <param name="callbackFnc">コールバックファンクション</param>
function fnProxyXml2Json(url, callback)
{
    //---------------------------------------------------------------------------------------------
    // 自鯖プロキシサーバのURL作成(ASP.NET向け)
    // ※ここは各自で利用しているプロキシサーバのURLに書き換えてね。
    //---------------------------------------------------------------------------------------------
    // 自分のサーバ+仮想フォルダのURLを取得
    var sVirtualUrl = window.location.href;
    var i = sVirtualUrl.indexOf('/', "http://".length);
    i = sVirtualUrl.indexOf('/', i+1);
    sVirtualUrl = sVirtualUrl.substr(0, i+1);
    // URLのクロスドメイン対策の自鯖にPROXYサーバURL作成 
    var sProxyUrl = sVirtualUrl + "Service.asmx/fnCallUrl?sUriEncodingURL=" + encodeURIComponent(url);
    //---------------------------------------------------------------------------------------------
    // jkl-parsexml.js経由でPROXYサーバにアクセス&XMLをJSON変換
    //---------------------------------------------------------------------------------------------
    var xml = new JKL.ParseXML(sProxyUrl);
    xml.async(callback , true)
    var data = xml.parse();
}
/// <summary>
/// プロキシサーバからの受信先メソッド
/// <summary>
function fnReturnJson(res)
{
    var divResult = document.getElementById("divResult");
    //---------------------------------------------------------------------------------------------
    // 受信したresオブジェクトはXML→JSONに変換されている。
    //---------------------------------------------------------------------------------------------
    // 該当製品なし
    if (typeof(res.ProductInfo) == "undefined")
    {
        divResult.innerHTML = "該当製品は見つかりませんでした。";
        return;
    }
    // 検索結果表示
    divResult.innerHTML =
        "<span style=\"background-color:red; color: white; ;font-size:large;\">" + 
        "検索件数: " + 
        res.ProductInfo.NumOfResult + "件中、" + res.ProductInfo.Item.length + "件表示" + 
        "</span><br />";
    for (var i = 0; i < res.ProductInfo.Item.length; i++) {
        var sRecord = "";
        sRecord += "製品名:" + res.ProductInfo.Item[i].ProductName + "<br />";
        sRecord += "最低価格:" + res.ProductInfo.Item[i].LowestPrice + "<br />";
        sRecord += "<img src=\"" + res.ProductInfo.Item[i].ImageUrl + "\" />";
        sRecord += "<hr />";
        divResult.innerHTML += sRecord;
    }
}
/// <summary>
/// [プロキシサーバ通信]ボタン押下
/// <summary>
function evSendRequest()
{
    //---------------------------------------------------------------------------------------------
    // XML形式のデータをレスポンスする価格.com Webサービスにアクセス
    //---------------------------------------------------------------------------------------------
    var sKeyword = document.getElementById("txtSearch").value;
    var sKakakuRestUrl = "http://api.kakaku.com/WebAPI/ItemSearch/Ver1.0/ItemSearch.aspx";
    sKakakuRestUrl += "?Keyword=" + EscapeSJIS(sKeyword);    // ← ecl.jsを使っているのはここだけ
    sKakakuRestUrl += "&ApiKey=" + g_sKakakuApiKey;
    fnProxyXml2Json(sKakakuRestUrl, fnReturnJson);
}
</script>
</head>
<body>
    <h1>ASP.NET Webサービスプロキシ&XML→JSON変換テスト</h1>
    <span style="font-size:x-small; color:Gray;">
        自鯖プロキシを経由して価格.comのWebAPIからデータ取得&XMLデータをJSON化:
    </span>
    <br />
    <input type="text" id="txtSearch" value="Intel Core 2 Quad" />
    <input type="button" onclick="evSendRequest();" value="検索" />
    <hr />
    <br />
    <div id="divResult" style="background-color:#f0f0f0;"></div>
</body>
</html>

価格.com Webサービスで「Intel Core 2 Quad」を検索したときの検索結果XML


検索結果イメージ


■参考URL


■関連ページ

ASP.NET(C#)でWeb API中継用プロキシサーバを作ってみた

ASP.NET(C#)でWeb API中継用プロキシサーバを作ってみた。
※本内容はWebAPI利用時に問題となるクロスドメイン対策のためのプロキシサーバ作成を目的としてます。
※WebAPIから取得したXML形式のデータをJSON変換に利用したい場合、別記事の Web APIのレスポンスXML形式データをJSONに変換を参照してほしい。


■最初に
開発環境は以下の通り

  • Visual Studio 2008 SP1
  • .NET Framework 3.5 SP1
  • ASP.NET3.5 (ASP.NET Webサービス)

※本内容だけでは不正アクセスへの対応は不十分です。


■中継サーバ作成
1.「ASP.NET Webサービス」プロジェクト作成


フォルダ/ファイル構成


2.web.configの変更
web.configにwebServicesタグを加える。


<configuration>
  <system.web>
    :
    :
    <!--  WebServiceアクセスを許可する。(*.asmxを使ったWebサービス通信) -->
    <webServices>
      <protocols>
        <add name="HttpPost" />
        <add name="HttpGet" />
      </protocols>
    </webServices>
  </system.web>
</configuration>

3.プロキシサーバ作成
プロジェクトに最初から存在するService.csを変更。

using System;
using System.IO;
using System.Net;
using System.Text;
using System.Web;
using System.Web.Script.Services;
using System.Web.Services;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// この Web サービスを、スクリプトから ASP.NET AJAX を使用して呼び出せるようにするには、次の行のコメントを解除します。 
[System.Web.Script.Services.ScriptService]
public class Service : System.Web.Services.WebService
{
    /// <summary>
    /// コンストラクタ
    /// </summary>
    public Service () {

        //デザインされたコンポーネントを使用する場合、次の行をコメントを解除してください 
        //InitializeComponent(); 
    }
    /// <summary>
    /// 外部サーバURLのREST呼び出し
    /// </summary>
    /// <param name="sUriEncodingURL">URIエンコードされた外部サーバURL</param>
    /// <remarks>
    /// クロスドメイン対策プロキシ<br />
    /// 常に安全対策を考慮すること<br />
    /// </remarks>
    [WebMethod]
    [ScriptMethod]
    public void fnCallUrl(string sUriEncodingURL)
    {
        HttpRequest req = HttpContext.Current.Request;
        HttpResponse res = HttpContext.Current.Response;
        //-----------------------------------------------------------------------------------------
        // 不正アクセス対策
        //-----------------------------------------------------------------------------------------
        // 別ホストサーバ経由のアクセスの場合は何もしない
        if (req.UrlReferrer.Authority != req.Url.Authority)
        {
            return;
        }
        // Basic認証、ログインパスワード、ワンタイムパスワードなど
        ;
        //-----------------------------------------------------------------------------------------
        // 外部サーバからデータを取り出す。
        //-----------------------------------------------------------------------------------------
        WebRequest wrGETURL = WebRequest.Create(sUriEncodingURL);
        WebProxy myProxy = new WebProxy("call_proxy", 80);
        myProxy.BypassProxyOnLocal = true;
        string sContent;
        using (Stream objStream = wrGETURL.GetResponse().GetResponseStream())
        using (StreamReader objReader = new StreamReader(objStream, Encoding.GetEncoding("UTF-8")))
        {
            sContent = objReader.ReadToEnd();
            objReader.Close();
            objStream.Close();
        }
        //-----------------------------------------------------------------------------------------
        // レスポンスにコンテンツ内容を書き出す
        //-----------------------------------------------------------------------------------------
        res.Clear();
        //res.AddHeader("Content-Type",~);
        //res.AddHeader("Pragma", "no-cache");
        res.Write(sContent);
    }
}

4.テスト用XML作成
動作確認用にXMLFile.xmlを作成。
内容は何でもよい。

<?xml version="1.0" encoding="utf-8" ?>
<address>
  <item>
    <country>日本</country>
    <city>東京</city>
  </item>
  <item>
    <country>日本</country>
    <city>大阪</city>
  </item>
  <item>
    <country>日本</country>
    <city>名古屋</city>
  </item>
</address>

5.テスト用HTML作成
稼働確認用のHTMLファイルtest.htmを作成。
非同期通信で中継プロキシにアクセス。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Proxyテスト</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<script type="text/javascript">

/// <summary>
/// 価格.com Webサービスのキー(貴方のIDを設定してください)
/// </summary>
var g_sKakakuApiKey = "XXXXXXXXXXXXXXXXXXXX";

/// <summary>
/// 非同期リクエスト
/// <summary>
function fnAjaxRequest(sUrl, fnCallback)
{
    var res;
    //---------------------------------------------------------------------------------------------
    // 非同期リクエストオブジェクト作成
    //---------------------------------------------------------------------------------------------
    if (window.XMLHttpRequest) {
        res = new XMLHttpRequest();
    }
    else {
        try {
            res = new ActiveXObject("Msxml2.XMLHTTP");
        } catch(e)
        {
            res = new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
    //---------------------------------------------------------------------------------------------
    // 非同期リクエスト
    //---------------------------------------------------------------------------------------------
    // リクエスト準備
    res.open("GET", sUrl, true);
    res.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
    // レスポンス呼出の準備
    res.onreadystatechange = function() {
        if (res.readyState == 4) {
            fnCallback(res);
        }
    }
    // リクエスト
    res.send(null);
}
/// <summary>
/// プロキシサーバからの受信先メソッド
/// <summary>
function fnSendResponse(res)
{
    var divResult = document.getElementById("divResult");
    divResult.innerText = res.responseText;
}
/// <summary>
/// [プロキシサーバ通信]ボタン押下
/// <summary>
function evSendRequest()
{
    var sVirtualUrl;
    var sCallUrl;
    //---------------------------------------------------------------------------------------------
    // サーバURLおよびフォルダ取得
    //---------------------------------------------------------------------------------------------
    sVirtualUrl = window.location.href;
    var i = sVirtualUrl.indexOf('/', "http://".length);
    i = sVirtualUrl.indexOf('/', i+1);
    sVirtualUrl = sVirtualUrl.substr(0, i+1);
    //---------------------------------------------------------------------------------------------
    // 呼び出し先URL取得
    //---------------------------------------------------------------------------------------------
    var selCallUrl = document.getElementById("selCallUrl");
    switch(selCallUrl.value)
    {
        // 価格.com WEBサービス(REST)
        case "kakaku":
            sCallUrl = "http://api.kakaku.com/WebAPI/ItemSearch/Ver1.0/ItemSearch.aspx";
            sCallUrl += "?Keyword=%83o%83C%83I&CategoryGroup=pc&ResultSet=medium&SortOrder=pricerank&PageNum=1";
            sCallUrl += "&ApiKey=" + g_sKakakuApiKey;
            break;
        // Yahoo!トップページ
        case "yahoo":
            sCallUrl = "http://yahoo.co.jp";
            break;
        // 自鯖XMLファイル
        case "xml":
            sCallUrl = sVirtualUrl + "XMLFile.xml";
            break;
    }
    //---------------------------------------------------------------------------------------------
    // 作成したプロキシサーバに非同期リクエスト
    //---------------------------------------------------------------------------------------------
    // プロキシサーバURL作成
    var sProxyUrl = sVirtualUrl + "Service.asmx/fnCallUrl?sUriEncodingURL=";
    // リクエストURL作成
    var sRequestUrl = sProxyUrl + encodeURIComponent(sCallUrl);
    // 非同期リクエスト
    fnAjaxRequest(sRequestUrl, fnSendResponse);
}
</script>
</head>
<body>
    <select id="selCallUrl">
        <option value="kakaku" selected="selected">価格.com WEBサービス(REST)</option>
        <option value="yahoo">Yahoo!トップページ</option>
        <option value="xml">自鯖XMLファイル</option>
    </select>
    <input type="button" onclick="evSendRequest();" value="プロキシ通信" />
    <div id="divResult" style="background-color:#f0f0f0;"></div>
</body>
</html>

6.稼働確認
・価格.com Webサービス(REST)への中継結果

・Yahoo!トップページへの中継結果

・自分のサーバのXMLFile.xlsに中継した結果


■中継サーバ運用時の注意
  • セキュリティ(不正アクセスの温床になったり、踏み台にされないこと)
  • 文字コードはWebAPIでは主にUTF-8だがShift-JIS等の他の文字コードもあるので注意。


■参考URL


■関連ページ

「Google Maps」「Yahoo!地図」「Virtual Earth」の共通インタフェース作成

題名も本文もソースコードも長いので注意してね!

2つ以上の地図系WebAPIを使ったことがある人は「表示も操作も似ているんだからAPIをインタフェース化できないか?」と 考える人も多いと思う。
そんな他愛もないことに挑戦してみました。

なお本インタフェースは「デュアルマップサービス」で使った機能だけのため網羅度は非常に低い。
情報ウィンドウやポリゴンなど基本的な機能ですら対応していないので注意してほしい。
興味のある人は機能補完をよろしく!


■利用した地図API
利用した地図APIは以下の通り(※2009/05/23時点では各API共に最新だと思う。)

  • Google Maps API(GMap2オブジェクト)
  • Yahoo!地図Web API(Ver.2?)
  • Windows Virtual Earth SDK(ver.6.2)



■基本方針
「各地図で固有機能がある」「バージョンアップも活発」等の理由で全APIの共通化は無理。
他に「測地系」「表示スケール」「ズーム範囲」等、同じ機能でも地図ごとに違いがある。
「Virtual Earth」に至っては地図の種類が違うだけで設定値や利用不可になるAPIも存在する。

というわけで以下の基本方針を作った。

  • 全ての地図で対応している「世界測地系」を利用。
  • 表示スケールの違いは視認判定で作り込み。
    (Yahooは最小スケール60mだからGoogleの最小スケール50mに合わせる等)
  • ズーム範囲の違いは視認判定で作り込み。
  • 同じ機能だけインタフェース化。なくても必要かつ簡単に作れる機能は自作。
  • 必要機能だけインタフェース化。
  • 可能な限り固有機能も使えるようにする。


■インタフェース
上でも書いたけど機能の網羅度は非常に低い。
興味のある人は機能補完をよろしく!

クラス・列挙型

クラス名 概要
OmYMap 「Yahoo!地図Web API」のYahooMapsCtrlクラスを共通インタフェース化したクラス
OmGMap 「Google Maps API」のGMap2クラスを共通インタフェース化したクラス
OmVMap 「Windows Virtual Earth SDK」のVEMapクラスを共通インタフェース化したクラス
OmLatLng 各種APIの緯度・経度クラスの差異を吸収した緯度・経度クラス
OmMapKind 地図の識別オブジェクト(列挙:YMap/GMap/VMap)

OmYMap・OmGMap・OmVMapのコンストラクタ
関数名 シグニチャ 備考
コンストラクタ function(sDivId, iLat, iLng,
  iZoom, enMapMode)
シグニチャは共通。
引数sDivId:DIVタグID、
引数:iLat, iLngには世界測定系の緯度・経度
引数iZoom・enMapModeは各API固有値を設定。

OmYMap・OmGMap・OmVMap共通イベント
イベント名 シグニチャ 備考
マウスドラッグ中 evMoving(fnc) 引数fncにはfunction()型のコールバック関数を渡す。
マウスドラッグ終了 evMoved(func) 引数fncにはfunction()型のコールバック関数を渡す。
ズーム終了 evZoomed(fnc) 引数fncにはfunction(iZoom)型のコールバック関数を渡す。

OmYMap・OmGMap・OmVMap共通メソッド
メソッド名 シグニチャ 備考
マップオブジェクト取得 fnGetMapObj() 各APIの地図オブジェクトを返す。
マップDIVタグID取得 fnGetMapDivId() マップで利用しているDIVタグのIDを返す。
マップ種別取得 fnGetMapDivId() 各API別のOmMapKindの列挙値を返す。
中心マークを表示する? fnSetVisibleCentermark(bShow) 中心マークの表示/非表示切り替え。
地図モード取得 fnGetMapMode() 各APIの現在の地図モードを返す。
地図モード設定 fnSetMapMode(enMapMode) 各APIの現在の地図モードを設定する。引数enMapModeには各API固有値を渡す。
中心座標設定 fnSetCenter(objLatLng) 中心座標の設定。引数objLatLngにはOmLatLngオブジェクトを渡す。
中心座標取得 fnGetCenter() 中心座標の取得。戻り値はOmLatLngオブジェクト。
ズーム設定 fnSetZoom(iZoom) ズーム設定。引数iZoomには各API用のズーム値を渡す。
ズーム取得 fnGetZoom() ズーム値の取得。戻り値には各API用のズーム値を返す。
地図の移動 fnMoveTo(objLatLng) 地図の移動。引数objLatLngにはOmLatLngオブジェクトを渡す。
地図のサイズ変更 fnResize(width, height) 地図の幅・高さをリサイズする。
Yahoo!地図のズーム取得 fnGetYMapZoom(iZoom) 引数未設定なら現在の地図オブジェクトのズーム値を基にYahoo!地図のズーム値を返す。
引数が設定されていれば引数を基にYahoo!地図のズーム値を返す。
Google Mapsのズーム取得 fnGetGMapZoom(iZoom) 引数未設定なら現在の地図オブジェクトのズーム値を基にGoogle Mapsのズーム値を返す。
引数が設定されていれば引数を基にGoogle Mapsのズーム値を返す。
Virtual Earthのズーム取得 fnGetVMapZoom(iZoom) 引数未設定なら現在の地図オブジェクトのズーム値を基にVirtual Earthのズーム値を返す。
引数が設定されていれば引数を基にVirtual Earthのズーム値を返す。

OmLatLngコンストラクタ
メソッド名 シグニチャ 備考
コンストラクタ function(obj1, obj2) 引数obj1:はYLLPoint、GLatLng、VELatLongオブジェクトまたは緯度(数値)のいずれか。
引数obj2:経度(数値)。

OmLatLngメソッド
メソッド名 シグニチャ 備考
緯度取得 fnGetLat() 世界測地系の緯度を返す。
経度取得 fnGetLng() 世界測地系の経度を返す。

OmMapKind列挙型
定数 シグニチャ
Yahoo!地図 OmMapKind.YMap
Google Maps OmMapKind.GMap
Virtual Earth OmMapKind.VMap


> ■JavaScriptソースコード
かなり長いけど...
Oncemail Labの 「デュアルマップサービス」からサンプルの起動確認ができる。

map.js


///////////////////////////////////////////////////////////////////////////////////////////////////
/// ASP.NET for AJAXを使っている場合、不要
///////////////////////////////////////////////////////////////////////////////////////////////////

function $get(id)
{
	return document.getElementById(id);
}

///////////////////////////////////////////////////////////////////////////////////////////////////
/// 地図の識別オブジェクト
///////////////////////////////////////////////////////////////////////////////////////////////////

var OmMapKind =
{
    YMap:0, // Yahoo!地図
    GMap:1, // Google Maps
    VMap:2  // Virtual Earth
};

///////////////////////////////////////////////////////////////////////////////////////////////////
/// 緯度・経度クラス(各種APIの緯度・経度クラスの差異を吸収)
///////////////////////////////////////////////////////////////////////////////////////////////////

/// <summary>
/// コンストラクタ
/// </summary>
/// <param name="obj1">緯度/YLLPointオブジェクト/GLatLngオブジェクト</param>
/// <param name="obj2">経度</param>
var OmLatLng = function(obj1, obj2)
{
    // YLLPointオブジェクト
    if (typeof(obj1.lat) != "undefined" && typeof(obj1.lon) != "undefined")
    {
        this.m_iLat = obj1.lat;
        this.m_iLng = obj1.lon;
    }
    // GLatLngオブジェクト
    else if (typeof(obj1.lat) != "undefined" && typeof(obj1.lng) != "undefined")
    {
        this.m_iLat = obj1.lat();
        this.m_iLng = obj1.lng();
    }
    // VELatLongオブジェクト
    else if (typeof(obj1.Latitude) != "undefined" && typeof(obj1.Longitude) != "undefined")
    {
        this.m_iLat = obj1.Latitude;
        this.m_iLng = obj1.Longitude;
    }
    // 数値の場合
    else if (typeof(obj1) != "undefined" && typeof(obj2) != "undefined")
    {
        this.m_iLat = obj1;
        this.m_iLng = obj2;
    }
}
/// <summary>
/// 緯度取得
/// </summary>
/// <returns>緯度</returns>
OmLatLng.prototype.fnGetLat = function()
{
    return this.m_iLat;
}
/// <summary>
/// 経度取得
/// </summary>
/// <returns>経度</returns>
OmLatLng.prototype.fnGetLng = function()
{
    return this.m_iLng;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
/// Yahoo!地図APIラッパークラス
///////////////////////////////////////////////////////////////////////////////////////////////////

/// <summary>
/// コンストラクタ
/// </summary>
/// <param name="sDivId">divタグのID</param>
/// <param name="iLat">緯度</param>
/// <param name="iLng">経度</param>
/// <param name="iZoom">ズーム値(1~11)</param>
/// <param name="enMapMode">地図モード:YMapMode.MAP[地図]、YMapMode.AERO[航空写真]</param>
var OmYMap = function(sDivId, iLat, iLng, iZoom, enMapMode)
{
    // マップオブジェクト生成
    var latlng = new YLLPoint(iLat, iLng);
    this.m_objMap = new YahooMapsCtrl(sDivId, latlng, iZoom, enMapMode, YDatumType.WGS84);
    this.m_objMap.setVisibleModeButton(false);
    this.m_objMap.setVisibleHomeButton(false);
    this.m_sDivId = sDivId;
}
/// <summary>
/// マップオブジェクト取得
/// </summary>
/// <returns>YahooMapsCtrlオブジェクト</returns>
OmYMap.prototype.fnGetMapObj = function()
{
    return this.m_objMap;
}
/// <summary>
/// マップDIVタグID取得
/// </summary>
/// <returns>DIVタグID</returns>
OmYMap.prototype.fnGetMapDivId = function()
{
    return this.m_sDivId;
}
/// <summary>
/// マップ種別
/// </summary>
/// <returns>OmMapKind列挙体</returns>
OmYMap.prototype.fnGetMapKind = function()
{
    return OmMapKind.YMap;
}
/// <summary>
/// イベントMoving
/// </summary>
/// <param name="fnc">関数オブジェクト[void func()]</param>
OmYMap.prototype.evMoving = function(fnc)
{
    this.m_objMap.addEvent(YEventType.MAP_MOVING, function(){ fnc(); });
}
/// <summary>
/// イベントMoved
/// </summary>
/// <param name="fnc">関数オブジェクト[void func()]</param>
OmYMap.prototype.evMoved = function(fnc)
{
    this.m_objMap.addEvent(YEventType.MAP_MOVED, function(){ fnc(); });
}
/// <summary>
/// イベントZoomed
/// </summary>
/// <param name="fnc">関数オブジェクト[void func(iZoom)]</param>
OmYMap.prototype.evZoomed = function(fnc)
{
    var refMap = this.m_objMap;
    this.m_objMap.addEvent(YEventType.LAYER_CHANGED, function(){ fnc(refMap.getCurrentLayer()); });
}
/// <summary>
/// 中心マークを表示する?
/// </summary>
/// <param name="bShow">true:表示、false:非表示</param>
OmYMap.prototype.fnSetVisibleCentermark = function(bShow)
{
    this.m_objMap.setVisibleCentermark(bShow);
}
/// <summary>
/// マップモードボタンを表示する?
/// </summary>
/// <param name="bShow">true:表示、false:非表示</param>
OmYMap.prototype.fnSetVisibleMapModeButton = function(bShow)
{
    this.m_objMap.setVisibleModeButton(bShow);
}
/// <summary>
/// ホームボタンUIを表示する?
/// </summary>
/// <param name="bShow">true:表示、false:非表示</param>
OmYMap.prototype.fnSetVisibleHomeButton= function(bShow)
{
    this.m_objMap.setVisibleHomeButton(bShow);
}
/// <summary>
/// 地図モード取得
/// </summary>
/// <returns>地図モード/returns>
OmYMap.prototype.fnGetMapMode = function()
{
    return this.m_objMap.getCurrentMode();
}
/// <summary>
/// 地図モード設定
/// </summary>
/// <param name="enMapMode">地図モード:YMapMode.MAP[地図]、YMapMode.AERO[航空写真]</param>
OmYMap.prototype.fnSetMapMode = function(enMapMode)
{
    this.m_objMap.changeMode(enMapMode);
}
/// <summary>
/// 中心座標設定
/// </summary>
/// <param name="objLatLng">座標オブジェクト</param>
OmYMap.prototype.fnSetCenter = function(objLatLng)
{
    var latlng = new YLLPoint(objLatLng.fnGetLat(), objLatLng.fnGetLng());
    this.m_objMap.moveTo(latlng);
}
/// <summary>
/// 中心座標取得
/// </summary>
/// <returns>座標オブジェクト/returns>
OmYMap.prototype.fnGetCenter = function()
{
    return new OmLatLng(this.m_objMap.getCenter());
}
/// <summary>
/// ズーム設定
/// </summary>
/// <param name="iZoom">ズーム値(1~11)</param>
OmYMap.prototype.fnSetZoom = function(iZoom)
{
    this.m_objMap.setLayer(iZoom);
}
/// <summary>
/// ズーム取得
/// </summary>
/// <returns>ズーム値(1~11)</returns>
OmYMap.prototype.fnGetZoom = function()
{
    return this.m_objMap.getCurrentLayer();
}
/// <summary>
/// 地図の移動
/// </summary>
/// <param name="objLatLng">座標オブジェクト</param>
OmYMap.prototype.fnMoveTo = function(objLatLng)
{
    var latlng = new YLLPoint(objLatLng.fnGetLat(), objLatLng.fnGetLng());
    // 指定マップの経度/緯度を移動
    this.m_objMap.moveTo(latlng);
}
/// <summary>
/// 地図のサイズ変更
/// </summary>
/// <param name="width">幅</param>
/// <param name="height">高さ</param>
OmYMap.prototype.fnResize = function(width, height)
{
    // divタグのサイズ変更
    var map = $get(this.m_sDivId);
    map.style.width = width + "px";
    map.style.height = height + "px";
    // リサイズ通知
    this.m_objMap.resizeMap();
}
/// <summary>
/// Yahoo!地図のズーム取得
/// </summary>
/// <param name="iYMapZoom">ズーム値(1~11)</param>
/// <returns>Yahoo!地図のズーム</returns>
OmYMap.prototype.fnGetYMapZoom = function(iYMapZoom)
{
    return this.fnGetZoom();
}
/// <summary>
/// Google Mapsのズーム取得
/// </summary>
/// <param name="iYMapZoom">ズーム値(1~11)</param>
/// <returns>Google Mapsのズーム</returns>
OmYMap.prototype.fnGetGMapZoom = function(iYMapZoom)
{
    if (typeof(iYMapZoom) == "undefined")
    {
        iYMapZoom = this.fnGetZoom();
    }
    switch(iYMapZoom) {
        case 0:
            return 16;
        case 1:
            return 18;
        case 2:
            return 17;
        case 3:
            return 16;
        case 4:
            return 14;
        case 5:
            return 12;
        case 6:
            return 11;
        case 7:
            return 10;
        case 8:
            return 9;
        case 9:
            return 8;
        case 10:
            return 5;
        case 11:
            return 3;
        default:
            return 1;
    }
}
/// <summary>
/// Virtual Earthのズーム取得
/// </summary>
/// <param name="iYMapZoom">ズーム値(1~11)</param>
/// <returns>Virtual Earthのズーム</returns>
OmYMap.prototype.fnGetVMapZoom = function(iYMapZoom)
{
    if (typeof(iYMapZoom) == "undefined")
    {
        iYMapZoom = this.fnGetZoom();
    }
    switch(iYMapZoom) {
        case 1:
            return 18;
        case 2:
            return 17;
        case 3:
            return 16;
        case 4:
            return 14;
        case 5:
            return 12;
        case 6:
            return 11;
        case 7:
            return 10;
        case 8:
            return 9;
        case 9:
            return 8;
        case 10:
            return 5;
        case 11:
            return 2;
        default:
            return 19;
    }
}

///////////////////////////////////////////////////////////////////////////////////////////////////
/// Google Map APIラッパークラス
///////////////////////////////////////////////////////////////////////////////////////////////////

/// <summary>
/// コンストラクタ
/// </summary>
/// <param name="sDivId">divタグのID</param>
/// <param name="iLat">緯度</param>
/// <param name="iLng">経度</param>
/// <param name="iZoom">ズーム値(1~19)</param>
/// <param name="enMapMode">地図モード:G_NORMAL_MAP[地図]、G_SATELLITE_MAP[航空写真]、G_HYBRID_MAP[地図+写真]</param>
var OmGMap = function(sDivId, iLat, iLng, iZoom, enMapMode)
{
    // マップ作成
    this.m_objMap = new GMap2($get(sDivId));
    // 各種コントロール追加
    this.m_objScaleControl = new GScaleControl();
    this.m_objLargeMapControl = new GLargeMapControl();
    this.m_objMap.setCenter(new GLatLng(iLat, iLng), iZoom);
    this.m_objMap.addControl(this.m_objScaleControl);
    this.m_objMap.addControl(this.m_objLargeMapControl);
    this.m_objMap.setMapType(enMapMode);
    //// ホイールの有効化
    //this.m_objMap.enableScrollWheelZoom();
    // メンバー変数追加 
    this.m_sDivId = sDivId;
    // 中心マークオブジェクト
    this.m_divCenterMark = document.createElement("div");
}
/// <summary>
/// マップオブジェクト取得
/// </summary>
/// <returns>YahooMapsCtrlオブジェクト</returns>
OmGMap.prototype.fnGetMapObj = function()
{
    return this.m_objMap;
}
/// <summary>
/// マップDIVタグID取得
/// </summary>
/// <returns>DIVタグID</returns>
OmGMap.prototype.fnGetMapDivId = function()
{
    return this.m_sDivId;
}
/// <summary>
/// マップ種別
/// </summary>
/// <returns>OmMapKind列挙体</returns>
OmGMap.prototype.fnGetMapKind = function()
{
    return OmMapKind.GMap;
}
/// <summary>
/// イベントMoving
/// </summary>
/// <param name="fnc">関数オブジェクト[void func()]</param>
OmGMap.prototype.evMoving = function(fnc)
{
    GEvent.addListener(this.m_objMap, "drag", function(){ fnc(); });
}
/// <summary>
/// イベントMoved
/// </summary>
/// <param name="fnc">関数オブジェクト[void func()]</param>
OmGMap.prototype.evMoved = function(fnc)
{
    GEvent.addListener(this.m_objMap, "dragend", function(){ fnc(); });
}
/// <summary>
/// イベントZoomed
/// </summary>
/// <param name="fnc">関数オブジェクト[void func(iZoom)]</param>
OmGMap.prototype.evZoomed = function(fnc)
{
    GEvent.addListener(this.m_objMap, "zoomend", function(oldLevel, newLevel){ fnc(newLevel); });
}
/// <summary>
/// 中心マークを表示する?
/// </summary>
/// <param name="bShow">true:表示、false:非表示</param>
OmGMap.prototype.fnSetVisibleCentermark = function(bShow)
{
    // 一度中心マークを削除
    try {
        this.m_objMap.getContainer().removeChild(this.m_divCenterMark);
    }catch(e) {
        // this.m_divCenterMarkがaddされていない時に例外処理が走るが無視
    }
    // 中心マークを設定
    if (bShow) {
        var mapW = parseInt(this.m_objMap.getContainer().style.width);
        var mapH = parseInt(this.m_objMap.getContainer().style.height);
        var markW = 33; // センターマークの横幅(ピクセル数)
        var markH = 33; // センターマークの縦幅(ピクセル数)
        var x = (mapW - markW) / 2; // センターマークの中心位置(X座標)
        var y = (mapH - markH) / 2; // センターマークの中心位置(Y座標)
        this.m_divCenterMark.style.position = "absolute";
        this.m_divCenterMark.style.top = y+"px";
        this.m_divCenterMark.style.left = x+"px";
        this.m_divCenterMark.style.backgroundImage = "url(../img/gmap_centermark.gif)";
        this.m_divCenterMark.style.width = markW+"px";
        this.m_divCenterMark.style.height = markH+"px";
        //this.m_divCenterMark.style.opacity = 0.5;
        this.m_objMap.getContainer().appendChild(this.m_divCenterMark);
    }
}
/// <summary>
/// マップモードボタンを表示する?
/// </summary>
/// <param name="bShow">true:表示、false:非表示</param>
OmGMap.prototype.fnSetVisibleMapModeButton = function(bShow)
{
    if (bShow)
    {
        this.m_objMap.addControl(this.m_objScaleControl);
        this.m_objMap.addControl(this.m_objLargeMapControl);
    }
    else
    {
        this.m_objMap.removeControl(this.m_objScaleControl);
        this.m_objMap.removeControl(this.m_objLargeMapControl);
    }
}
/// <summary>
/// ホームボタンUIを表示する?
/// </summary>
/// <param name="bShow">true:表示、false:非表示</param>
OmGMap.prototype.fnSetVisibleHomeButton= function(bShow)
{
    // APIが存在しない
    ;
}
/// <summary>
/// 地図モード取得
/// </summary>
/// <returns>地図モード/returns>
OmGMap.prototype.fnGetMapMode = function()
{
    return this.m_objMap.getCurrentMapType();
}
/// <summary>
/// 地図モード設定
/// </summary>
/// <param name="enMapMode">地図モード:G_NORMAL_MAP[地図]、G_SATELLITE_MAP[航空写真]、G_HYBRID_MAP[地図+写真]</param>
OmGMap.prototype.fnSetMapMode= function(enMapMode)
{
    this.m_objMap.setMapType(enMapMode);
}
/// <summary>
/// 中心座標設定
/// </summary>
/// <param name="objLatLng">座標オブジェクト</param>
OmGMap.prototype.fnSetCenter = function(objLatLng)
{
    var latlng = new GLatLng(objLatLng.fnGetLat(), objLatLng.fnGetLng());
    this.m_objMap.setCenter(latlng);
}
/// <summary>
/// 中心座標取得
/// </summary>
/// <returns>座標オブジェクト/returns>
OmGMap.prototype.fnGetCenter = function()
{
    return new OmLatLng(this.m_objMap.getCenter());
}
/// <summary>
/// ズーム設定
/// </summary>
/// <param name="iZoom">ズーム値(1~11)</param>
OmGMap.prototype.fnSetZoom = function(iZoom)
{
    this.m_objMap.setZoom(iZoom);
}
/// <summary>
/// ズーム設定
/// </summary>
/// <returns>ズーム値(1~19)</returns>
OmGMap.prototype.fnGetZoom = function()
{
    return this.m_objMap.getZoom();
}
/// <summary>
/// 地図の移動
/// </summary>
/// <param name="objLatLng">座標オブジェクト</param>
OmGMap.prototype.fnMoveTo = function(objLatLng)
{
    var latlng = new GLatLng(objLatLng.fnGetLat(), objLatLng.fnGetLng());
    // 指定マップの経度/緯度を移動
    this.m_objMap.panTo(latlng);
}
/// <summary>
/// 地図のサイズ変更
/// </summary>
/// <param name="width">幅</param>
/// <param name="height">高さ</param>
OmGMap.prototype.fnResize = function(width, height)
{
    // divタグのサイズ変更
    var map = $get(this.m_sDivId);
    map.style.width = width + "px";
    map.style.height = height + "px";
    // リサイズ通知
    this.m_objMap.checkResize();
}
/// <summary>
/// Yahoo!地図のズーム取得
/// </summary>
/// <param name="iGMapZoom">ズーム値(1~19)</param>
/// <returns>Yahoo!地図のズーム</returns>
OmGMap.prototype.fnGetYMapZoom = function(iGMapZoom)
{
    if (typeof(iGMapZoom) == "undefined")
    {
        iGMapZoom = this.fnGetZoom();
    }
    switch(iGMapZoom) {
        case 19:
        case 18:
            return 1;
        case 17:
            return 2;
        case 16:
        case 15:
            return 3;
        case 14:
            return 4;
        case 13:
        case 12:
            return 5;
        case 11:
            return 6;
        case 10:
            return 7;
        case 9:
            return 8;
        case 8:
            return 9;
        case 7:
        case 6:
        case 5:
        case 4:
            return 10;
        case 3:
        case 2:
        case 1:
        case 0:
            return 11;
        default:
            return 11;
    }
}
/// <summary>
/// Google Mapsのズーム取得
/// </summary>
/// <param name="iGMapZoom">ズーム値(1~19)</param>
/// <returns>Google Mapsのズーム</returns>
OmGMap.prototype.fnGetGMapZoom = function(iGMapZoom)
{
    return this.fnGetZoom();
}
/// <summary>
/// Virtual Earthのズーム取得
/// </summary>
/// <param name="iGMapZoom">ズーム値(1~19)</param>
/// <returns>Virtual Earthのズーム</returns>
OmGMap.prototype.fnGetVMapZoom = function(iGMapZoom)
{
    if (typeof(iGMapZoom) == "undefined")
    {
        iGMapZoom = this.fnGetZoom();
    }
    switch(iGMapZoom) {
        case 1:
            return 2;
        case 2:
            return 3;
        case 3:
            return 4;
        case 4:
            return 5;
        case 5:
        case 6:
            return 6;
        case 7:
            return 7;
        case 8:
            return 8;
        case 9:
            return 9;
        case 10:
            return 11;
        case 11:
            return 11;
        case 12:
            return 13;
        case 13:
            return 14;
        case 14:
            return 15;
        case 15:
            return 16;
        case 16:
        case 17:
            return 17;
        case 18:
            return 18;
        case 19:
            return 19;
        default:
            return 1;
    }
}

///////////////////////////////////////////////////////////////////////////////////////////////////
/// Virtual Earth APIラッパークラス
/// http://msdn.microsoft.com/ja-jp/library/bb412546.aspx
/// 注意:複数の外部ファイルを読み込む場合、Virtual Earthの<script>を先頭に書かないとfirefoxでバグる?
/// http://ongmap.com/blog/?p=54
///////////////////////////////////////////////////////////////////////////////////////////////////

/// <summary>
/// コンストラクタ
/// </summary>
/// <param name="sDivId">divタグのID</param>
/// <param name="iLat">緯度</param>
/// <param name="iLng">経度</param>
/// <param name="iZoom">ズーム値(1~19)</param>
/// <param name="enMapMode">地図モード:VEMapStyle.Road[道路地図]、VEMapStyle.Shaded[影付きマップ道路地図]、
/// VEMapStyle.Aerial[航空写真]、VEMapStyle.Hybrid[ハイブリッド]、VEMapStyle.Oblique[斜角マップ]、
/// VEMapStyle.Birdseye[概観図 (斜角) ]、VEMapStyle.BirdseyeHybrid[概観ハイブリッド]</param>
var OmVMap = function(sDivId, iLat, iLng, iZoom, enMapMode, enMapView)
{
    // マップ作成
    this.m_objMap = new VEMap(sDivId);
    // 各種コントロール追加
    this.m_objMap.SetDashboardSize(VEDashboardSize.Tiny);
    this.m_objMap.LoadMap(new VELatLong(iLat, iLng), iZoom, enMapMode, false, VEMapMode.Mode2D);
    this.m_objMap.SetScaleBarDistanceUnit(VEDistanceUnit.Kilometers);
    // メンバー変数追加 
    this.m_sDivId = sDivId;
    // 中心マークオブジェクト
    this.m_divCenterMark = document.createElement("div");
}
/// <summary>
/// マップオブジェクト取得
/// </summary>
/// <returns>YahooMapsCtrlオブジェクト</returns>
OmVMap.prototype.fnGetMapObj = function()
{
    return this.m_objMap;
}
/// <summary>
/// マップDIVタグID取得
/// </summary>
/// <returns>DIVタグID</returns>
OmVMap.prototype.fnGetMapDivId = function()
{
    return this.m_sDivId;
}
/// <summary>
/// マップ種別
/// </summary>
/// <returns>OmMapKind列挙体</returns>
OmVMap.prototype.fnGetMapKind = function()
{
    return OmMapKind.VMap;
}
/// <summary>
/// イベントMoving
/// </summary>
/// <param name="fnc">関数オブジェクト[void func()]</param>
OmVMap.prototype.evMoving = function(fnc)
{
    this.m_objMap.AttachEvent("onmousemove", function(e) { fnc(); });
}
/// <summary>
/// イベントMoved
/// </summary>
/// <param name="fnc">関数オブジェクト[void func()]</param>
OmVMap.prototype.evMoved = function(fnc)
{
    this.m_objMap.AttachEvent("onmouseup", function(e) { fnc(); });
}
/// <summary>
/// イベントZoomed
/// </summary>
/// <param name="fnc">関数オブジェクト[void func(iZoom)]</param>
OmVMap.prototype.evZoomed = function(fnc)
{
    this.m_objMap.AttachEvent("onendzoom", function(e) { fnc(e.zoomLevel); });
}
/// <summary>
/// 中心マークを表示する?
/// </summary>
/// <param name="bShow">true:表示、false:非表示</param>
OmVMap.prototype.fnSetVisibleCentermark = function(bShow)
{
    var divMap = $get(this.m_sDivId);
    // 一度中心マークを削除
    try {
        this.m_objMap.DeleteControl(this.m_divCenterMark);
    }catch(e) {
        // this.m_divCenterMarkがaddされていない時に例外処理が走るが無視
    }
    // 中心マークを設定
    if (bShow) {
        var mapW = parseInt(divMap.style.width);
        var mapH = parseInt(divMap.style.height);
        var markW = 33; // センターマークの横幅(ピクセル数)
        var markH = 33; // センターマークの縦幅(ピクセル数)
        var x = (mapW - markW) / 2; // センターマークの中心位置(X座標)
        var y = (mapH - markH) / 2; // センターマークの中心位置(Y座標)
        this.m_divCenterMark.style.position = "absolute";
        this.m_divCenterMark.style.top = y+"px";
        this.m_divCenterMark.style.left = x+"px";
        this.m_divCenterMark.style.backgroundImage = "url(../img/gmap_centermark.gif)";
        this.m_divCenterMark.style.width = markW+"px";
        this.m_divCenterMark.style.height = markH+"px";
        //this.m_divCenterMark.style.opacity = 0.5;
        this.m_objMap.AddControl(this.m_divCenterMark, 1);
    }
}
/// <summary>
/// マップモードボタンを表示する?
/// </summary>
/// <param name="bShow">true:表示、false:非表示</param>
OmVMap.prototype.fnSetVisibleMapModeButton = function(bShow)
{
    if (bShow)
    {
        this.m_objMap.AddControl(this.m_objScaleControl, 1);
        this.m_objMap.AddControl(this.m_objLargeMapControl, 1);
    }
    else
    {
        this.m_objMap.DeleteControl(this.m_objScaleControl);
        this.m_objMap.DeleteControl(this.m_objLargeMapControl);
    }
}
/// <summary>
/// ホームボタンUIを表示する?
/// </summary>
/// <param name="bShow">true:表示、false:非表示</param>
OmVMap.prototype.fnSetVisibleHomeButton= function(bShow)
{
    // APIが存在しない
    ;
}
/// <summary>
/// 地図モード取得
/// </summary>
/// <returns>地図モード/returns>
OmVMap.prototype.fnGetMapMode = function()
{
    return this.m_objMap.GetMapStyle();
}
/// <summary>
/// 地図モード設定
/// </summary>
/// <param name="enMapMode">地図モード:VEMapStyle.Road[道路地図]、VEMapStyle.Shaded[影付きマップ道路地図]、
/// VEMapStyle.Aerial[航空写真]、VEMapStyle.Hybrid[ハイブリッド]、VEMapStyle.Oblique[斜角マップ]、
/// VEMapStyle.Birdseye[概観図 (斜角) ]、VEMapStyle.BirdseyeHybrid[概観ハイブリッド]</param>
OmVMap.prototype.fnSetMapMode= function(enMapMode)
{
    this.m_objMap.SetMapStyle(enMapMode);
}
/// <summary>
/// 中心座標設定
/// </summary>
/// <param name="objLatLng">座標オブジェクト</param>
OmVMap.prototype.fnSetCenter = function(objLatLng)
{
    var latlng = new VELatLong(objLatLng.fnGetLat(), objLatLng.fnGetLng());
    this.m_objMap.SetCenter(latlng);
}
/// <summary>
/// 中心座標取得
/// </summary>
/// <returns>座標オブジェクト/returns>
OmVMap.prototype.fnGetCenter = function()
{
    return new OmLatLng(this.m_objMap.GetCenter());
}
/// <summary>
/// ズーム設定
/// </summary>
/// <param name="iZoom">ズーム値(1~19)</param>
OmVMap.prototype.fnSetZoom = function(iZoom)
{
    this.m_objMap.SetZoomLevel (iZoom);
}
/// <summary>
/// ズーム設定
/// </summary>
/// <returns>ズーム値(1~11)</returns>
OmVMap.prototype.fnGetZoom = function()
{
    return this.m_objMap.GetZoomLevel();
}
/// <summary>
/// 地図の移動
/// </summary>
/// <param name="objLatLng">座標オブジェクト</param>
OmVMap.prototype.fnMoveTo = function(objLatLng)
{
    var latlng = new VELatLong(objLatLng.fnGetLat(), objLatLng.fnGetLng());
    // 指定マップの経度/緯度を移動
    this.m_objMap.PanToLatLong(latlng);
}
/// <summary>
/// 地図のサイズ変更
/// </summary>
/// <param name="width">幅</param>
/// <param name="height">高さ</param>
OmVMap.prototype.fnResize = function(width, height)
{
    // divタグのサイズ変更
    var map = $get(this.m_sDivId);
    map.style.width = width;
    map.style.height = height;
    // 指定マップのサイズ変更
    this.m_objMap.Resize(width, height);
}
/// <summary>
/// Yahoo!地図のズーム取得
/// </summary>
/// <param name="iVMapZoom">ズーム値(1~19)</param>
/// <returns>Yahoo!地図のズーム</returns>
OmVMap.prototype.fnGetYMapZoom = function(iVMapZoom)
{
    if (typeof(iVMapZoom) == "undefined")
    {
        iVMapZoom = this.fnGetZoom();
    }
    switch(iVMapZoom) {
        case 1:
        case 2:
        case 3:
        case 4:
            return 11;
        case 5:
        case 6:
            return 10;
        case 7:
        case 8:
            return 9;
        case 9:
            return 8;
        case 10:
        case 11:
            return 7;
        case 12:
            return 6;
        case 13:
            return 5;
        case 14:
            return 4;
        case 15:
        case 16:
        case 0:
            return 3;
        case 17:
            return 2;
        case 18:
        case 19:
            return 1;
        default:
            return 11;
    }
}
/// <summary>
/// Google Mapsのズーム取得
/// </summary>
/// <param name="iVMapZoom">ズーム値(1~19)</param>
/// <returns>Google Mapsのズーム</returns>
OmVMap.prototype.fnGetGMapZoom = function(iVMapZoom)
{
    if (typeof(iVMapZoom) == "undefined")
    {
        iVMapZoom = this.fnGetZoom();
    }
    switch(iVMapZoom) {
        case 1:
        case 2:
            return 1;
        case 3:
            return 2;
        case 4:
            return 3;
        case 5:
            return 4;
        case 6:
            return 5; // or 6
        case 7:
            return 7;
        case 8:
            return 8;
        case 9:
            return 9;
        case 10:
        case 11:
            return 10;
        case 12:
            return 11;
        case 13:
            return 13;
        case 14:
            return 14;
        case 15:
            return 15;
        case 16:
            return 16;
        case 17:
            return 17;
        case 18:
            return 18;
        case 19:
            return 19;
        default:
            return 1;
    }
}
/// <summary>
/// Virtual Earthのズーム取得
/// </summary>
/// <param name="iVMapZoom">ズーム値(1~19)</param>
/// <returns>Virtual Earthのズーム</returns>
OmVMap.prototype.fnGetVMapZoom = function(iVMapZoom)
{
    return this.fnGetZoom();
}

test.htm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>マップインタフェーステスト</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<script src="http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2" type="text/javascript"></script>
<script src="http://map.yahooapis.jp/MapsService/js/V2/?appid=(あなたのID)" type="text/javascript"></script>
<script src="http://maps.google.com/maps?file=api&key=(あなたのキー)" type="text/javascript"></script>
<script src="../js/Map.js" type="text/javascript"></script>
<script type="text/javascript">
var gYMap;
var gGMap;
var gVMap;
window.onload = function()
{
    if (GBrowserIsCompatible()) {
        gYMap = new OmYMap("ymap", 35.681382, 139.766084, 3, YMapMode.MAP);
        gGMap = new OmGMap("gmap", 35.681382, 139.766084, 16, G_NORMAL_MAP);
        gVMap = new OmVMap("vmap", 35.681382, 139.766084, 16, VEMapStyle.Road);
    }
}
window.onunload = function()
{
    GUnload();
}
</script>
</head>
<body>
    <div id="ymap" style="position: relative; width:300px; height:200px;"></div><br />
    <div id="gmap" style="position: relative; width:300px; height:200px;"></div><br />
    <div id="vmap" style="position: relative; width:300px; height:200px;"></div><br />
</body>
</html>

■参考URL


■関連ページ

Google AdSense


  • ---

Amazon ウィジェット

  • ウィジェット

@niyo_naのツイート

無料ブログはココログ

Google Analytics