【问题标题】:Google API throws exception at specified lat & long position?Google API 在特定的经纬度位置抛出异常?
【发布时间】:2013-06-25 06:53:08
【问题描述】:

下面是我的示例代码

public static string GetGeoLoc(string latitude, string longitude,
        out string Address_ShortCountryName,
        out string Address_country,
        out string Address_administrative_area_level_1,
        out string Address_administrative_area_level_1_short_name,
        out string Address_administrative_area_level_2,
        out string Address_administrative_area_level_3,
        out string Address_colloquial_area,
        out string Address_locality,
        out string Address_sublocality,
        out string Address_neighborhood)
    {
        Address_ShortCountryName = "";
        Address_country = "";
        Address_administrative_area_level_1 = "";
        Address_administrative_area_level_1_short_name = "";
        Address_administrative_area_level_2 = "";
        Address_administrative_area_level_3 = "";
        Address_colloquial_area = "";
        Address_locality = "";
        Address_sublocality = "";
        Address_neighborhood = "";

        XmlDocument doc = new XmlDocument();

        try
        {
            doc.Load("http://maps.googleapis.com/maps/api/geocode/xml?latlng=" + latitude + "," + longitude + "&sensor=false");
            XmlNode element = doc.SelectSingleNode("//GeocodeResponse/status");
            if (element.InnerText == "ZERO_RESULTS")
            {
                return ("No data available for the specified location");
            }
            else
            {

                element = doc.SelectSingleNode("//GeocodeResponse/result/formatted_address");

                string longname = "";
                string shortname = "";
                string typename = "";


                XmlNodeList xnList = doc.SelectNodes("//GeocodeResponse/result/address_component");
                foreach (XmlNode xn in xnList)
                {
                    try
                    {
                        longname = xn["long_name"].InnerText;
                        shortname = xn["short_name"].InnerText;
                        typename = xn["type"].InnerText;

                        switch (typename)
                        {
                            case "country":
                                {
                                    Address_country = longname;
                                    Address_ShortCountryName = shortname;
                                    break;
                                }

                            case "locality":
                                {
                                    Address_locality = longname;
                                    break;
                                }

                            case "sublocality":
                                {
                                    Address_sublocality = longname;
                                    break;
                                }

                            case "neighborhood":
                                {
                                    Address_neighborhood = longname;
                                    break;
                                }

                            case "colloquial_area":
                                {
                                    Address_colloquial_area = longname;
                                    break;
                                }

                            case "administrative_area_level_1":
                                {
                                    Address_administrative_area_level_1 = longname;
                                    Address_administrative_area_level_1_short_name = shortname;
                                    break;
                                }

                            case "administrative_area_level_2":
                                {
                                    Address_administrative_area_level_2 = longname;
                                    break;
                                }

                            case "administrative_area_level_3":
                                {
                                    Address_administrative_area_level_3 = longname;
                                    break;
                                }

                            default:
                                break;
                        }
                    }

                    catch (Exception e)
                    {
                        clsExHandler.Instance.Write(e);
                    }
                }
                return (element.InnerText);
            }

        }
        catch (Exception ex)
        {
            return ("(Address lookup failed: ) " + ex.Message);
        }
    }

尝试将纬度设为 33.4965,将经度设为 -112.205

我在该行中获得了对无效对象的异常对象引用

**typename = xn["type"].InnerText;**

当我逐步调试时,没有像 ["type"] 这样的属性

为什么还有一些其他的语言字符?

我该如何解决这个问题。

【问题讨论】:

    标签: c#-4.0 google-maps-api-3 google-api


    【解决方案1】:

    我不熟悉 c#,我不确定您的代码是否正确(例如,类型不是属性,它是 elementNode)。

    假设您的代码是正确的并且您可以使用 node['nameOfChildNode'] 选择节点,当您检查 XML 文件时:http://maps.googleapis.com/maps/api/geocode/xml?latlng=33.4965,-112.205&sensor=false 您将看到有带有 2 个 <type> 的 address_components 以及没有任何地址的 address_components <type>.

    我猜您的代码不会在缺少的<type> 处中断,而是在您尝试访问缺少的<type> 的属性(InnerText)时中断。

    您可以做什么:使用selectSingleNode 选择<type>,当它返回null 时执行回退或离开进一步处理。

    【讨论】:

    • 是的,我确实接受该类型是一个元素节点,而且我正在使用SelectSingleNode,只阅读我上面的示例代码。
    • 但是xn["type"],这就是我们所说的,你不要在那里使用SelectSingleNode。但是,当此表示法是 C# 中 SelectSingleNode 的有效简写时,这不是问题所在。访问maps.googleapis.com/maps/api/geocode/…,您会看到有 1 个结果,其中 address_component 没有子 <type>(向下滚动一点,结果是...我猜是日文字符 USA, Arizona, フェニックス=メサ=スコッツデール 和这个结果的第一个<address_component/> 没有类型,这就是问题)
    【解决方案2】:

    http://maps.googleapis.com/maps/api/geocode/json?latlng=33.4965%20,%20-112.205&sensor=false

    返回

    {
       "results" : [],
       "status" : "ZERO_RESULTS"
    }
    

    因此

    XmlNode element = doc.SelectSingleNode("//GeocodeResponse/status");
                if (element.InnerText == "ZERO_RESULTS")
                {
                    return ("No data available for the specified location");
                }
    

    没有捕捉到ZERO_RESULTS

    我不熟悉 C#,所以我无法提供进一步的帮助。

    【讨论】:

    猜你喜欢
    • 2022-06-16
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    相关资源
    最近更新 更多