65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.43/5 (10投票s)

2005年12月21日

3分钟阅读

viewsIcon

124067

downloadIcon

887

使用REST、AJAX和Yahoo!实现地理位置定位,用于Google Maps。

Sample Image

引言

这是一个我为了探索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 = ""

现在,读取从查询返回的数据非常容易。 只需执行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的链接!

© . All rights reserved.