Table of Contents

Geocoding Plugin for Google

The example below implements a plugin for the Google Geocoding Services.
For overview and documentation on how to implement, see Notes on Geocoding Plugins.

(function(){
 
 orbit.webclient.GeocodePlugins.Google = {
  sensor: false,
  apiKey: null
 };
 
 /**
  * Implements the geocoding request for Google Geocoding API V2
  * @see https://developers.google.com/maps/documentation/geocoding/v2/
  */
 orbit.webclient.GeocodePlugins.Google.geocode = function(query,handleResult,handleFault) {
  var url = "http://maps.googleapis.com/maps/api/geocode/json";
  url += "?address="+ encodeURIComponent(query);
  url += "&sensor="+ this.sensor;
  if (this.apiKey!=null) url += "&key="+ encodeURIComponent(this.apiKey);
 
  sendRequest(url,handleResult,handleFault);
 }   
 
 // Example URL : http://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false
 function sendRequest(url,handleResult,handleFault) {
  var req = createXMLHTTPObject();
  if (!req) { handleFault({code:'plugin_error',message:"Failed to create XMLHTTPRequest object."}); return; }
  req.open("GET",url,true/*async*/);
  req.setRequestHeader('User-Agent','XMLHTTP/1.0');
  req.onreadystatechange = function () {
   if (req.readyState != 4) return;
   if (req.status != 200 && req.status != 304) 
   {
    handleFault({code:'network_error',message:"Invalid http response (status code "+ req.status +")"});
   }
   else
   {
    try
    {
     var object = JSON.parse(req.responseText);
     if (object.status=="OK" || object.status=="ZERO_RESULTS")
     {
      var list = [];
      if (object.results.length>0)
      {
       var result = object.results[0];
       var loc = result.geometry.location
       var lat = loc.lat;
       var lng = loc.lng;
       var boundingbox = null;
       if (result.geometry.viewport)
       {
        var max = result.geometry.viewport.northeast;
        var min = result.geometry.viewport.southwest;
        boundingbox = {minX:min.lng,maxX:max.lng,minY:min.lat,maxY:max.lat};
       }
       list.push({coordinate:{x:lng,y:lat},crs:"4326",boundingbox:boundingbox});
      }
      handleResult(list);
     }
     else if (object.status=="OVER_QUERY_LIMIT")
     {
      handleFault({code:'query_limit_reached',message:"Query limit reached."});
     }
     else if (object.status=="REQUEST_DENIED")
     {
      handleFault({code:'no_permission',message:"Request denied."});
     }
     else if (object.status=="UNKNOWN_ERROR")
     {
      handleFault({code:'service_error',message:"Internal server error occurred."});
     }
     else
     {
      handleFault({code:'service_error',message:"Unkown status code returned by service  '"+ object.status +"'"});
     }
    }
    catch(error)
    {
     handleFault({code:'plugin_error',message:"Plugin error while processing response: "+ error});
    }
   }
  }
  req.send();
 }
 
 var XMLHttpFactories = [
  function () {return new XMLHttpRequest()},
  function () {return new ActiveXObject("Msxml2.XMLHTTP")},
  function () {return new ActiveXObject("Msxml3.XMLHTTP")},
  function () {return new ActiveXObject("Microsoft.XMLHTTP")}
 ];
 
 function createXMLHTTPObject() {
  var xmlhttp = false;
  for (var i=0;i<XMLHttpFactories.length;i++) {
   try {
    xmlhttp = XMLHttpFactories[i]();
   }
   catch (e) {
    continue;
   }
   break;
  }
  return xmlhttp;
 }
 
})();