Yahoo Geocoding API
There are some mapping APIs that accept only geocode coordinates (longitudes & latitudes). You need a solution to get them for all addresses you want. One of the best solution is to use Yahoo Geocoding API. You need to register first then you can request it with your custom parameters and get the results as XML, JSON or serialized PHP.
You can use the form below to get your values:
This sample is using JSON and 2 extra files. One is a custom JSON library (json.js) for client side calls, plus a PHP file (load.php) which loads any URL on request based on fetchUrlWithoutHanging() from php.net/file (because XMLHTTP can't open pages from different server because of security restrictions).
The JavaScript function to interogate Yahoo service is here (Update: check new XML version below, JSON version is no more available from Yahoo):
function geocode() {
var frm=document.forms['frm'];
if(frm.f.value!='')
tmp="/load.php?url="+escape("api.local.yahoo.com/MapsService/V1/geocode?appid=YahooDemo&street=&city=&state=&location="+frm.f.value+"&output=json");
else
tmp="/load.php?url="+escape("api.local.yahoo.com/MapsService/V1/geocode?appid=YahooDemo&street="+frm.s.value+"&city="+frm.c.value+"&state="+frm.p.value+"&output=json");
tmp2=json_load(tmp);
var obj=eval('('+tmp2+')');
if(obj) {
frm.l1.value=obj.ResultSet.Result[0].Longitude;
frm.l2.value=obj.ResultSet.Result[0].Latitude;
}
else {
frm.l1.value="";
frm.l2.value="";
}
obj=null;
}
Here's a simple request to Yahoo service: http://api.local.yahoo.com/MapsService/V1/geocode?appid=YahooDemo&street=701+First+Street&city=Sunnyvale&state=CA
This call return JavaScript code to build an object with all requested values as properties.
There may be some problems with this scripts, but generally it should work.
The Yahoo Geocoding service is limited to 50,000 queries per IP address per day. Combined with Yahoo Maps or Google Maps could be a very powerful online tool.
Update (March 22nd): JSON results are no more available from Yahoo Geocoding API, so, we've changed the scripts to use XML files, directly from your browser (IE or FF):
function geocode() {
var frm=document.forms['frm'];if(frm.f.value!='')
tmp="/load.php?format=xml&url="+
escape("api.local.yahoo.com/MapsService/V1/geocode?appid=cod_xx2006&street=&city=&state=&location="+frm.f.value+"&output=xml");
else
tmp="/load.php?format=xml&url="+
escape("api.local.yahoo.com/MapsService/V1/geocode?appid=cod_xx2006&street="+frm.s.value+"&city="+frm.c.value+"&state="+
frm.p.value+"&output=xml");var xmlDocument=null;
if(window.XMLHttpRequest) {
// Firefox, Mozilla
xmlDocument = document.implementation.createDocument("","",null);
xmlDocument.async = false;
xmlDocument.load(tmp);
lat=xmlDocument.getElementsByTagName("Latitude").item(0).firstChild.nodeValue;
long=xmlDocument.getElementsByTagName("Longitude").item(0).firstChild.nodeValue;
err=xmlDocument.getElementsByTagName("Result").item(0).attributes.getNamedItem("warning").firstChild.nodeValue;
} else if(window.ActiveXObject) {
// IE/Windows ActiveX version
xmlDocument = new ActiveXObject('Microsoft.XMLDOM');
xmlDocument.async = false;
xmlDocument.load(tmp);
xmlDocument.setProperty("SelectionLanguage", "XPath");
xmlDocument.setProperty("SelectionNamespaces", "xmlns:my='urn:yahoo:maps'");
var objNode=xmlDocument.selectSingleNode("//my:Result/@warning");
err=objNode.text;
var objNode=xmlDocument.selectSingleNode("//my:Result/my:Latitude");
lat=objNode.text;
var objNode=xmlDocument.selectSingleNode("//my:Result/my:Longitude");
long=objNode.text;
}if(xmlDocument) {
frm.l1.value=lat;
frm.l2.value=long;
if(err!="") alert('Err: '+err);
}
}
You can download YahooGeocode.js file with all client side process (the code above). It uses XML DOM to load Yahoo page using a local proxy (load.php) and then uses different methods to get data: getElementsByTagName() for Firefox & XPath for Internet Explorer.