One of the best features of Yahoo’s AJAX Maps API is its ability to geo-code full-text mailing addresses into lat/long on-the-fly, so you can say for instance “draw a map of 1300 Crittenden Lane, Mountain View, CA 94043“. (By now, Google and MSFT also offer geocoding, but Yahoo had it way earlier because they embraced JSON-P at a time when everyone else was still scratching their heads).
Yahoo does a pretty good job of geocoding addresses even if the format is a bit weird or some the info is missing, but of course they can’t always figure it out, especially if the address is garbage to start with. Their API indicates (somewhat cryptically) that you can capture an event when geocoding completes, but they don’t tell you what data you get or how to deal with it. Since there doesn’t appear to be much discussion of this on the Internets, I thought I’d provide the answer here for the record.
When creating a YMap, you can register a callback function to get triggered every time geocoding completes, like so:
var map = new YMap( ”¦ ); YEvent.Capture(map, EventsList.onEndGeoCode, myCallback); ”¦ function myCallback(resultObj) { ”¦ }
Yahoo’s API claims that you can also pass an optional private context object, but as far as I can tell they never send it back to you. Of course you can always use a closure around your callback function to achieve the same thing.
Now for the part they don’t tell you: your callback is called with a single resultObj argument. You can figure out the contents of this argument by just writing your callback function to take an argument and then writing console.dir(resultObj)
to print out its full nested structure in the unbelievably useful Firebug (Joe, you’re my hero!). Here’s what you’ll see:
var resultObj = { success: 1, /* 1 for success, 0 for failure */ /* Original address you tried to geo-code */ Address: “1300 Crittenden Lane Mountain View, CA 94043”³, GeoPoint: { /* This is a YGeoPoint, which also has a bunch of functions you can call */ Lat: 37.424663, Long: -122.07248 }, ThisMap: { /* reference to the YMap */ } };
So in your callback function you just test for resultObj.success
, and if the geocoding failed, you can show an appropriate error message.
One trick I found for showing an error message is that you can embed a hidden div with an error message inside the map-holder div you pass to the YMap constructor, and YMap won’t get rid of it. If you use absolute positioning and give it a z-index, you can then show it when geocoding fails and get a nice “Map not available” right where the map would normally be.
Here’s a working example of handling geocoding and showing an error message. Thanks Yahoo! for the great API, and hopefully some of this info will find its way into the next rev of your API docs.
PS: Special thanks to Mark Jen for finding me a decent code-writing plug-in for Windows Live Writer! Boy did I struggle with getting WordPress not to mangle my code in the eval post!
Liked this post? Follow this blog to get more.