|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Announcements
Chapters
Services
Feature Zones
|
IntroductionThis was a project I did to explore the Google Maps API. Google Maps is a great JavaScript driven service, and extremely easy to use and manipulate (Great job, Google). But, it has a severe limitation, it does not have a source of geo-location information accessible via the API. For example, if I want to display my address on a Google Map, I need to know the latitude and longitude so I can set the point via the API. This presented a problem as I have no idea what that would be, and in a real world application, if I wanted to plot some data points, I would need a way figure that out. Yahoo! to the rescue! Yahoo! has a very cool (and free) Web Service for GeoCoding. However, the trick is to make Yahoo!'s service play nice with Google Maps. The answer was obvious, I needed to use AJAX and a custom class to query Yahoo!'s information directly and transfer it to the JavaScript. Geocode Class InternalsThe Private Function Query
Dim XmlDoc as new XmlDocument
Dim XmlNS as new XmlNamespaceManager(xmlDoc.NameTable)
Try
XmlDoc.Load(BuildURL)
XmlNS.AddNamespace("def","urn:yahoo:maps")
mResults("Latitude") = _
XmlDoc.SelectSingleNode(".//def:Latitude", XmlNS).InnerXML
mResults("Longitude") = _
XmlDoc.SelectSingleNode(".//def:Longitude", XmlNS).InnerXML
mResults("Address") = _
XmlDoc.SelectSingleNode(".//def:Address", XmlNS).InnerXML
mResults("City") = _
XmlDoc.SelectSingleNode(".//def:City", XmlNS).InnerXML
mResults("State") = _
XmlDoc.SelectSingleNode(".//def:State", XmlNS).InnerXML
mResults("Zip") = _
XmlDoc.SelectSingleNode(".//def:Zip", XmlNS).InnerXML
mResults("Country") = _
XmlDoc.SelectSingleNode(".//def:Country", XmlNS).InnerXML
Catch e as Exception
Return False
End Try
Return True
End Function
Note: For full details, please see the source code, and for information on how I constructed the URLs, refer to my GeoCoder Class In ActionTo query Yahoo!'s Web Service, all you need to do is create the object and pass it two parameters: Dim myGeocode as New Clarity.Utils.Geocode("AppID", "Free Form Text")
Alternately, you can also pass them in like this: Dim myGeocode as New Clarity.Utils.Geocode("AppID")
myGeocode.Street = ""
myGeocode.City = ""
myGeocode.State = ""
myGeocode.Zip = ""
myGeocode.Location = ""
Now, to read the data sent back from the query is extremely easy. Just execute the '*****************************************
' Here are the possible values:
'*****************************************
' Clarity.Utils.Geocode.ResultType.Latitude
' Clarity.Utils.Geocode.ResultType.Longitude
' Clarity.Utils.Geocode.ResultType.Address
' Clarity.Utils.Geocode.ResultType.City
' Clarity.Utils.Geocode.ResultType.State
' Clarity.Utils.Geocode.ResultType.Zip
' Clarity.Utils.Geocode.ResultType.Country
'
Console.WriteLine(" Latitude: " & _
myGeocode.Results(Clarity.Utils.Geocode.ResultType.Latitude))
Console.WriteLine("Longitude: " & _
myGeocode.Results(Clarity.Utils.Geocode.ResultType.Longitude))
Geocode Class Testing ApplicationNot much to explain with this, I just needed a way to test the Sub Main()
Dim Location as String
Console.WriteLine(".NET Interface" & _
" for Yahoo's GeoLocation Web-Service")
Console.WriteLine("Matthew Hazlett, Clarity Computers")
Console.WriteLine()
Console.Write("Enter address: ")
Location = Console.ReadLine
Console.WriteLine()
Dim myGeocode as New Clarity.Utils.Geocode("AppID", Location)
Console.WriteLine(" Address: " & _
myGeocode.Results(Clarity.Utils.Geocode.ResultType.Address))
Console.WriteLine(" City: " & _
myGeocode.Results(Clarity.Utils.Geocode.ResultType.City))
Console.WriteLine(" State: " & _
myGeocode.Results(Clarity.Utils.Geocode.ResultType.State))
Console.WriteLine(" Zip: " & _
myGeocode.Results(Clarity.Utils.Geocode.ResultType.Zip))
Console.WriteLine(" Country: " & _
myGeocode.Results(Clarity.Utils.Geocode.ResultType.Country))
Console.WriteLine()
Console.WriteLine(" Latitude: " & _
myGeocode.Results(Clarity.Utils.Geocode.ResultType.Latitude))
Console.WriteLine("Longitude: " & _
myGeocode.Results(Clarity.Utils.Geocode.ResultType.Longitude))
Console.WriteLine()
Console.Write("...Slam Return...")
Console.Read
End Sub
AJAX vs. Mr. CleanIf you don't know what AJAX is then you can refer to the plethora of information on the web. [Definition, AJAX Library for .NET] I'm not going to go into how to add AJAX to your project or how to create an AJAX page. You will need to refer to the Quick Start documentation for that information. I have also not included the Google Mapping functions, this is just a sample application of how to query Yahoo! with AJAX (but they are included in the source). The following is the code used by the web application to accomplish the Protected Sub Page_Load(ByVal sender As Object, _
ByVal e AsSystem.EventArgs) Handles Me.Load
Ajax.Utility.RegisterTypeForAjax(GetType(_Default))
End Sub
<Ajax.AjaxMethod()> _
Public Function Lookup(Location as String) as ArrayList
Dim Geo as new Clarity.Utils.Geocode("AppID", Location)
Dim Results as New ArrayList
Results.Add(Geo.Results(Clarity.Utils.Geocode.ResultType.Latitude))
Results.Add(Geo.Results(Clarity.Utils.Geocode.ResultType.Longitude))
Results.Add(Geo.Results(Clarity.Utils.Geocode.ResultType.Address))
Results.Add(Geo.Results(Clarity.Utils.Geocode.ResultType.City))
Results.Add(Geo.Results(Clarity.Utils.Geocode.ResultType.State))
Results.Add(Geo.Results(Clarity.Utils.Geocode.ResultType.Zip))
Results.Add(Geo.Results(Clarity.Utils.Geocode.ResultType.Country))
Return Results
End Function
The Notice the function is called like this: function MapMe() {
text = document.getElementById("Location").value;
LocData = _Default.Lookup(text);
document.getElementById("Latitude").innerHTML = LocData.value[1];
document.getElementById("Longitude").innerHTML = LocData.value[0];
document.getElementById("Address").innerHTML = LocData.value[2];
document.getElementById("City").innerHTML = LocData.value[3];
document.getElementById("State").innerHTML = LocData.value[4];
document.getElementById("Zip").innerHTML = LocData.value[5];
document.getElementById("Country").innerHTML = LocData.value[6];
}
Finally!Well, this wasn't the most complicated project but definitely one of the most fun! I wanted to share my work and hope someone else will find it useful and create the next great HousingMaps.Com (not mine, just a cool Map Hack). Post up the links to your Google Map Hacks!
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||