使用REST、AJAX和Yahoo!进行地理位置定位,用于Google Maps






4.43/5 (10投票s)
2005年12月21日
3分钟阅读

124067

887
使用REST、AJAX和Yahoo!实现地理位置定位,用于Google Maps。
引言
这是一个我为了探索Google Maps API而做的项目。 Google Maps是一个很棒的JavaScript驱动的服务,而且非常容易使用和操作(做得好,Google)。 但是,它有一个严重的限制,它没有一个可以通过API访问的地理位置信息来源。
例如,如果我想在Google Map上显示我的地址,我需要知道纬度和经度,这样我才能通过API设置点。 这是一个问题,因为我不知道那会是什么,而且在真实世界的应用程序中,如果我想绘制一些数据点,我需要一种方法来找出它。
Yahoo! 来帮忙了! Yahoo! 有一个非常酷(而且免费)的地理编码Web服务。 然而,诀窍是让Yahoo!的服务与Google Maps配合使用。 答案是显而易见的,我需要使用AJAX和一个自定义类来直接查询Yahoo!的信息并将其传输到JavaScript。
地理编码类内部结构
我编写的用于查询Yahoo! Web服务的Geocode
类非常简单。 我所要做的就是根据Yahoo!定义的规范构建URL,并将XmlDocument
指向该URL。 接下来,我使用xPath
语句将数据解析到Hashtable
。(我不是XML专家,很可能有更好的方法来编写这些xPath
查询。)
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
注意:有关完整详细信息,请参阅源代码,有关如何构建URL的信息,请参阅我的URLBuilder
类(包含在源代码中)。
GeoCoder类运作
要查询Yahoo! Web服务,您只需创建对象并向其传递两个参数
Dim myGeocode as New Clarity.Utils.Geocode("AppID", "Free Form Text")
或者,您也可以像这样传递它们
Dim myGeocode as New Clarity.Utils.Geocode("AppID")
myGeocode.Street = ""
myGeocode.City = ""
myGeocode.State = ""
myGeocode.Zip = ""
myGeocode.Location = ""
- 什么是ApplicationID?
- 访问注册 Yahoo! 以获得您的免费ApplicationID。
现在,读取从查询返回的数据非常容易。 只需执行Results
函数并传递相应的值即可。
'*****************************************
' 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
类,所以我写了一个快速的控制台应用程序。
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. Clean
如果您不知道什么是AJAX,那么您可以参考网络上大量的信息。 [定义, .NET的AJAX库]
我不会深入探讨如何将AJAX添加到您的项目或如何创建AJAX页面。 您需要参考快速入门文档以获取该信息。 我也没有包括Google Mapping函数,这只是一个如何使用AJAX查询Yahoo!的示例应用程序(但它们包含在源代码中)。
以下是Web应用程序用于完成GeoCode
函数的代码
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
Lookup
函数看起来像一个普通函数,但它实际上是一个AJAX函数。 这意味着我们可以从页面中包含的JavaScript中调用这个函数(非常棒)。 最后,这是页面上用于调用Lookup
函数的JavaScript。
请注意,该函数的调用方式如下:Result = Class.Function(args);
。
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];
}
终于!
好吧,这并不是最复杂的项目,但绝对是最有趣的之一! 我想分享我的工作,并希望其他人会觉得它有用,并创建下一个伟大的HousingMaps.Com(不是我的,只是一个很酷的地图黑客)。
发布您的Google Map Hack的链接!