////////////////////////////////////////////////////////////////////////////////// // 日本の京都の住所表記に対応したジオコーダ「ジオどすⅡ」 // GoogleMapsAPIのGClientGeocoderの拡張 // gclientgeocoder_geodosu2extension.js // // by Naoki Ueda, Geodosu Project // Copyright 2009 All rights reserved // // Enhance GClientGeocoder.getLatLng function with GEODOSU2 geocoder. // // GEODOSU2 geocoder is a specialized geocoder for tradittional // address expression used in KYOTO city, JAPAN. // // First, run original getLatLng() function normally. // If geocoding failed, then run GEODOSU geocoder. // // How to use: // 1. include this file AFTER Google Maps API script. // // // 2. use GClientGeocoderWithGeodosu class instead of GClientGeocoderclass // Example: // //geocoder = new GClientGeocoder(); //original code // geocoder = new GClientGeocoderWithGeodosu(preprocessor); //GEODOSU is available // // * preprocessor: whether to call Geodosu2 geocode preprosessor API // // 3. That is all! Now getLatLng() can handle tradittional address of KYOTO city.. // Varsion 2.0 15-Sep-2009 // ////////////////////////////////////////////////////////////////////////////////// GClientGeocoderWithGeodosu=function(preprocessor){ if(!window.___api_geodosu_com_global_object)window.___api_geodosu_com_global_object=new Object(); var _global=window.___api_geodosu_com_global_object; _global.preprocessor=preprocessor; _global.timeout=100000; _global.geodosu2=new Object(); var baseobj=new GClientGeocoder(); //inherit GClientGeocoder class baseobj.getLatLng_original=baseobj.getLatLng; baseobj.getLatLng_geodosu = function(address){ var _global=window.___api_geodosu_com_global_object; _global.geodosu2.lat = null; _global.geodosu2.lon = null; _global.geodosu2.geocoded = 0; var url="http://api.geodosu.com/v2/geodosu2?&callback=window.___api_geodosu_com_global_object.callbackfunc&address="+encodeURI(address)+"&output=json&preprocess=true&apikey=xxxxxxxxxx"; _global.callbackfunc=function(jsonobj){ //ジオどすⅡAPIのコールバック clearTimeout(window.___api_geodosu_com_global_object.geodosutimer); if(jsonobj.result.geocoded-0==1){ //Geodosu2 _global.geodosu2.lat = jsonobj.result.coordinates.point.lat; _global.geodosu2.lon = jsonobj.result.coordinates.point.lon; _global.geodosu2.geocoded = 1; _global.geodosu2.detect_addr = jsonobj.result.addresses.detected.kanji; _global.geodosu2.addr = jsonobj.result.addresses.input; _global.geodosu2.pp_addr = jsonobj.result.addresses.pre_processed; }else{ _global.geodosu2.detect_addr = null; _global.geodosu2.addr = jsonobj.result.addresses.input; _global.geodosu2.pp_addr = jsonobj.result.addresses.pre_processed; } //Googleジオコーダを呼ぶ if(_global.preprocessor==true){ baseobj.getLatLng_original(_global.geodosu2.pp_addr,function(point){ if(!point){ //前処理住所で検索失敗 baseobj.getLatLng_original(window.___api_geodosu_com_global_object.geodosu2.addr,function(point){ if(!point){ //元の住所で検索失敗 if(window.___api_geodosu_com_global_object.geodosu2.geocoded == 1){ //ジオどすの結果データを使う point = new GLatLng(window.___api_geodosu_com_global_object.geodosu2.lat, window.___api_geodosu_com_global_object.geodosu2.lon); window.___api_geodosu_com_global_object.func_ptr(point); }else{ //全て検索失敗 window.___api_geodosu_com_global_object.func_ptr(null); } }else{ //元の住所で検索成功 window.___api_geodosu_com_global_object.func_ptr(point); } }); }else{ //前処理住所で検索成功 window.___api_geodosu_com_global_object.func_ptr(point); } }); }else{ baseobj.getLatLng_original(window.___api_geodosu_com_global_object.geodosu2.addr,function(point){ if(!point){ //元の住所で検索失敗 if(window.___api_geodosu_com_global_object.geodosu2.geocoded == 1){ //ジオどすの結果データを使う point = new GLatLng(window.___api_geodosu_com_global_object.geodosu2.lat, window.___api_geodosu_com_global_object.geodosu2.lon); window.___api_geodosu_com_global_object.func_ptr(point); }else{ //全て検索失敗 } }else{ //元の住所で検索成功 window.___api_geodosu_com_global_object.func_ptr(point); } }); } } _global.geodosutimer=setTimeout(function(){ window.___api_geodosu_com_global_object.callbackfunc(null); window.___api_geodosu_com_global_object.callbackfunc=function(){} },_global.timeout);//Timeout for Geodosu. var s=document.getElementById('___api_geodosu_com_json_response'); if(s!=null){ s.parentNode.removeChild(s);//prevent a lot of script elements created s=null; } s = document.createElement("script"); s.setAttribute("id", "___api_geodosu_com_json_response"); s.setAttribute("type", "text/javascript"); s.setAttribute("charset", "utf-8"); s.setAttribute("src", url); document.body.appendChild(s); } baseobj.getLatLng=function(address, func_ptr){ //override getLatLng() var _global=window.___api_geodosu_com_global_object; _global.func_ptr = func_ptr; baseobj.getLatLng_geodosu(address); } return(baseobj); }