2009-10-25 89 views
2

我在我的應用程序中使用谷歌地理編碼API,但我發現很難解析返回的地址信息可靠。我希望有人有一個圖書館或解析信息的方式,以防止我不得不寫我的自我,並涵蓋每一個案件。解析谷歌地理編碼

即時通訊使用JSON API,可以很容易地提取地址線和座標 並將它們存儲在數據庫中,但問題是以可靠的方式提取其他地址信息,因此我可以將其存儲。

我看過谷歌用於地理編碼數據的XAL結構化地址規範,但是我的問題是,它可以滿足每個國家/地區的每種地址類型,因此很難解析結果。

像郵政編碼一樣簡單的東西可以嵌套在父標籤的任何組合內。即使在一個國家內,樹的出現方式也可能有所不同,這使得解析難度大於預期。具有諷刺意味的是,我的最終目標是將其存儲在我的數據庫中的一棵樹上(想想rails acts_as_tree或類似的東西),以便用戶以後可以輕鬆找到這些項目。例如,點擊國家,州,然後區,鎮,然後郊區等

林在軌工作

回答

2

有一個gem和插件,爲你封裝所有這些。它被稱爲GeoKit

有可能使其使用谷歌或其他一些地理編碼服務提供商。如果你的模型有合適的字段,它也可以做距離計算(真正整潔的東西是數學,這是在SQL中完成的)。

我一直在我的生產應用程序中使用它很長時間來計算zipcode之間的距離。正如我所提到的,我一直在生產中使用它一段時間,所以我對代碼的可靠性沒有任何擔憂。

+0

謝謝我看過這個。我原本以爲我只是處理座標和返回的原始地理編碼數據之間的距離,但它似乎至少試圖統一地理編碼數據 – ADAM 2009-10-26 06:17:32

1

我已經這樣做了幾次。他們的(谷歌)示例代碼有效,但很脆弱 - 您從Google獲取的地理編碼數據至多不完整,最差的情況是不一致的。

無論如何。所有的地理編碼器都很糟糕,但至少谷歌是免費的,並且比其他人要少。要求一致性的要求太高了嗎?嘆。嘗試以下方法;你將它傳遞給一個地標(注意,getLocations AJAX方法可能會返回多個),並且它會標準化結果。如果您想要看起來很棒,請使用placemark.address字段 - 有時它會包含比單個字段更多的信息。通常情況下,它只會包含您實際發送到地理編碼的文本。

function Mark(placemark) { 
    this.latitude = 0.0; 
    this.longitude = 0.0; 
    this.accuracy = 0; 
    this.country = null; 
    this.region = null; 
    this.city = null; 
    this.postalCode = null; 
    this.street = null; 
    this.address = null; 
    this.placemark = placemark; 

    if (placemark) { 
    if (placemark.Point && placemark.Point.coordinates) { 
     this.latitude = placemark.Point.coordinates[0]; 
     this.longitude = placemark.Point.coordinates[1]; 
    } 

    var elem = placemark.AddressDetails; 

    if (elem) { 
     this.accuracy = elem.Accuracy; 

     if (elem.Country) { 
     elem = elem.Country; 
     this.country = elem.CountryNameCode; 
     } 

     if (elem.AdministrativeArea) { 
     elem = elem.AdministrativeArea; 
     this.region = elem.AdministrativeAreaName; 
     } 

     if (elem.SubAdministrativeArea) { 
     elem = elem.SubAdministrativeArea; 
     } 

     if (elem.Locality) { 
     elem = elem.Locality; 
     this.city = elem.LocalityName; 
     } 

     if (elem.PostalCode) { 
     this.postalCode = elem.PostalCode.PostalCodeNumber; 
     } 

     if (elem.Thoroughfare) { 
     this.street = elem.Thoroughfare.ThoroughfareName; 
     } 
    } 
    } 
} 
+0

感謝您的代碼,有趣的做法,與javascript而不是紅寶石的繁重工作。我會試試 – ADAM 2009-10-26 06:20:13

+0

..我是個傻瓜,我甚至沒有看標籤。我的壞 - 只是有點認爲這是一個JavaScript問題。當你所有的是一個錘子等 – Maas 2009-10-26 07:13:51