我想解析Android Map中的反向地理编码的Google Map API

时间:2013-05-25 07:37:13

标签: java android xml-parsing reverse-geocoding

http://maps.googleapis.com/maps/api/geocode/xml?latlng=23.0043673,72.5411868999996&sensor=false

这个链接给了我以下结果 此XML文件似乎没有与之关联的任何样式信息。文档树如下所示。

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<GeocodeResponse>
<status>OK</status>
<result>
<type>route</type>
<formatted_address>
Dharnidhar Road, Vasna, Ahmedabad, Gujarat 380007, India
</formatted_address>
<address_component>
<long_name>Dharnidhar Road</long_name>
<short_name>Dharnidhar Road</short_name>
<type>route</type>
</address_component>
<address_component>
<long_name>Vasna</long_name>
<short_name>Vasna</short_name>
<type>sublocality</type>
<type>political</type>
</address_component>
<address_component>
<long_name>Ahmedabad</long_name>
<short_name>Ahmedabad</short_name>
<type>locality</type>
<type>political</type>
</address_component>
<address_component>
<long_name>Ahmedabad</long_name>
<short_name>Ahmedabad</short_name>
<type>administrative_area_level_2</type>
<type>political</type>
</address_component>
<address_component>
<long_name>Gujarat</long_name>
<short_name>GJ</short_name>
<type>administrative_area_level_1</type>
<type>political</type>
</address_component>
<address_component>
<long_name>India</long_name>
<short_name>IN</short_name>
<type>country</type>
<type>political</type>
</address_component>
<address_component>
<long_name>380007</long_name>
<short_name>380007</short_name>
<type>postal_code</type>
</address_component>
<geometry>
<location>
<lat>23.0043870</lat>
<lng>72.5419184</lng>
</location>
<location_type>APPROXIMATE</location_type>
<viewport>
<southwest>
<lat>23.0030380</lat>
<lng>72.5405695</lng>
</southwest>
<northeast>
<lat>23.0057360</lat>
<lng>72.5432674</lng>
</northeast>
</viewport>
<bounds>
<southwest>
<lat>23.0041405</lat>
<lng>72.5414125</lng>
</southwest>
<northeast>
<lat>23.0046335</lat>
<lng>72.5424244</lng>
</northeast>
</bounds>
</geometry>
</result>
<result>
<type>neighborhood</type>
<type>political</type>
<formatted_address>
Yashkamal Society, Ahmedabad, Gujarat 380007, India
</formatted_address>
<address_component>
<long_name>Yashkamal Society</long_name>
<short_name>Yashkamal Society</short_name>
<type>neighborhood</type>
<type>political</type>
</address_component>
<address_component>
<long_name>Ahmedabad</long_name>
<short_name>Ahmedabad</short_name>
<type>locality</type>
<type>political</type>
</address_component>
<address_component>
<long_name>Ahmedabad</long_name>
<short_name>Ahmedabad</short_name>
<type>administrative_area_level_2</type>
<type>political</type>
</address_component>
<address_component>
<long_name>Gujarat</long_name>
<short_name>GJ</short_name>
<type>administrative_area_level_1</type>
<type>political</type>
</address_component>
<address_component>
<long_name>India</long_name>
<short_name>IN</short_name>
<type>country</type>
<type>political</type>
</address_component>
<address_component>
<long_name>380007</long_name>
<short_name>380007</short_name>
<type>postal_code</type>
</address_component>
<geometry>
<location>
<lat>23.0089040</lat>
<lng>72.5446990</lng>
</location>
<location_type>APPROXIMATE</location_type>
<viewport>
<southwest>
<lat>23.0016970</lat>
<lng>72.5373369</lng>
</southwest>
<northeast>
<lat>23.0125600</lat>
<lng>72.5510640</lng>
</northeast>
</viewport>
<bounds>
<southwest>
<lat>23.0016970</lat>
<lng>72.5373369</lng>
</southwest>
<northeast>
<lat>23.0125600</lat>
<lng>72.5510640</lng>
</northeast>
</bounds>
</geometry>
</result>
<result>
<type>sublocality</type>
<type>political</type>
<formatted_address>Vasna, Ahmedabad, Gujarat, India</formatted_address>
<address_component>
<long_name>Vasna</long_name>
<short_name>Vasna</short_name>
<type>sublocality</type>
<type>political</type>
</address_component>
<address_component>
<long_name>Ahmedabad</long_name>
<short_name>Ahmedabad</short_name>
<type>locality</type>
<type>political</type>
</address_component>
<address_component>
<long_name>Ahmedabad</long_name>
<short_name>Ahmedabad</short_name>
<type>administrative_area_level_2</type>
<type>political</type>
</address_component>
<address_component>
<long_name>Gujarat</long_name>
<short_name>GJ</short_name>
<type>administrative_area_level_1</type>
<type>political</type>
</address_component>
<address_component>
<long_name>India</long_name>
<short_name>IN</short_name>
<type>country</type>
<type>political</type>
</address_component>
<geometry>
<location>
<lat>23.0043673</lat>
<lng>72.5411869</lng>
</location>
<location_type>APPROXIMATE</location_type>
<viewport>
<southwest>
<lat>22.9964810</lat>
<lng>72.5357220</lng>
</southwest>
<northeast>
<lat>23.0125600</lat>
<lng>72.5530250</lng>
</northeast>
</viewport>
<bounds>
<southwest>
<lat>22.9964810</lat>
<lng>72.5357220</lng>
</southwest>
<northeast>
<lat>23.0125600</lat>
<lng>72.5530250</lng>
</northeast>
</bounds>
</geometry>
</result>
<result>
<type>postal_code</type>
<formatted_address>Ahmedabad, Gujarat 380007, India</formatted_address>
<address_component>
<long_name>380007</long_name>
<short_name>380007</short_name>
<type>postal_code</type>
</address_component>
<address_component>
<long_name>Ahmedabad</long_name>
<short_name>Ahmedabad</short_name>
<type>locality</type>
<type>political</type>
</address_component>
<address_component>
<long_name>Ahmedabad</long_name>
<short_name>Ahmedabad</short_name>
<type>administrative_area_level_2</type>
<type>political</type>
</address_component>
<address_component>
<long_name>Gujarat</long_name>
<short_name>GJ</short_name>
<type>administrative_area_level_1</type>
<type>political</type>
</address_component>
<address_component>
<long_name>India</long_name>
<short_name>IN</short_name>
<type>country</type>
<type>political</type>
</address_component>
<geometry>
<location>
<lat>22.9967321</lat>
<lng>72.5500596</lng>
</location>
<location_type>APPROXIMATE</location_type>
<viewport>
<southwest>
<lat>22.9810681</lat>
<lng>72.5317127</lng>
</southwest>
<northeast>
<lat>23.0220193</lat>
<lng>72.5760833</lng>
</northeast>
</viewport>
<bounds>
<southwest>
<lat>22.9810681</lat>
<lng>72.5317127</lng>
</southwest>
<northeast>
<lat>23.0220193</lat>
<lng>72.5760833</lng>
</northeast>
</bounds>
</geometry>
</result>
<result>
<type>locality</type>
<type>political</type>
<formatted_address>Ahmedabad, Gujarat, India</formatted_address>
<address_component>
<long_name>Ahmedabad</long_name>
<short_name>Ahmedabad</short_name>
<type>locality</type>
<type>political</type>
</address_component>
<address_component>
<long_name>Ahmedabad</long_name>
<short_name>Ahmedabad</short_name>
<type>administrative_area_level_2</type>
<type>political</type>
</address_component>
<address_component>
<long_name>Gujarat</long_name>
<short_name>GJ</short_name>
<type>administrative_area_level_1</type>
<type>political</type>
</address_component>
<address_component>
<long_name>India</long_name>
<short_name>IN</short_name>
<type>country</type>
<type>political</type>
</address_component>
<geometry>
<location>
<lat>23.0395677</lat>
<lng>72.5660045</lng>
</location>
<location_type>APPROXIMATE</location_type>
<viewport>
<southwest>
<lat>22.9028759</lat>
<lng>72.4541115</lng>
</southwest>
<northeast>
<lat>23.1378156</lat>
<lng>72.7026413</lng>
</northeast>
</viewport>
<bounds>
<southwest>
<lat>22.9028759</lat>
<lng>72.4541115</lng>
</southwest>
<northeast>
<lat>23.1378156</lat>
<lng>72.7026413</lng>
</northeast>
</bounds>
</geometry>
</result>
<result>
<type>administrative_area_level_2</type>
<type>political</type>
<formatted_address>Ahmedabad, Gujarat, India</formatted_address>
<address_component>
<long_name>Ahmedabad</long_name>
<short_name>Ahmedabad</short_name>
<type>administrative_area_level_2</type>
<type>political</type>
</address_component>
<address_component>
<long_name>Gujarat</long_name>
<short_name>GJ</short_name>
<type>administrative_area_level_1</type>
<type>political</type>
</address_component>
<address_component>
<long_name>India</long_name>
<short_name>IN</short_name>
<type>country</type>
<type>political</type>
</address_component>
<geometry>
<location>
<lat>23.0395677</lat>
<lng>72.5660045</lng>
</location>
<location_type>APPROXIMATE</location_type>
<viewport>
<southwest>
<lat>22.0185745</lat>
<lng>71.5979016</lng>
</southwest>
<northeast>
<lat>23.4630890</lat>
<lng>72.8419331</lng>
</northeast>
</viewport>
<bounds>
<southwest>
<lat>22.0185745</lat>
<lng>71.5979016</lng>
</southwest>
<northeast>
<lat>23.4630890</lat>
<lng>72.8419331</lng>
</northeast>
</bounds>
</geometry>
</result>
<result>
<type>administrative_area_level_1</type>
<type>political</type>
<formatted_address>Gujarat, India</formatted_address>
<address_component>
<long_name>Gujarat</long_name>
<short_name>GJ</short_name>
<type>administrative_area_level_1</type>
<type>political</type>
</address_component>
<address_component>
<long_name>India</long_name>
<short_name>IN</short_name>
<type>country</type>
<type>political</type>
</address_component>
<geometry>
<location>
<lat>22.2586520</lat>
<lng>71.1923805</lng>
</location>
<location_type>APPROXIMATE</location_type>
<viewport>
<southwest>
<lat>20.1279540</lat>
<lng>68.1628352</lng>
</southwest>
<northeast>
<lat>24.7057090</lat>
<lng>74.4764881</lng>
</northeast>
</viewport>
<bounds>
<southwest>
<lat>20.1279540</lat>
<lng>68.1628342</lng>
</southwest>
<northeast>
<lat>24.7057090</lat>
<lng>74.4764881</lng>
</northeast>
</bounds>
</geometry>
</result>
<result>
<type>country</type>
<type>political</type>
<formatted_address>India</formatted_address>
<address_component>
<long_name>India</long_name>
<short_name>IN</short_name>
<type>country</type>
<type>political</type>
</address_component>
<geometry>
<location>
<lat>20.5936840</lat>
<lng>78.9628800</lng>
</location>
<location_type>APPROXIMATE</location_type>
<viewport>
<southwest>
<lat>6.7471389</lat>
<lng>68.1627956</lng>
</southwest>
<northeast>
<lat>35.5043404</lat>
<lng>97.3955550</lng>
</northeast>
</viewport>
<bounds>
<southwest>
<lat>6.7471389</lat>
<lng>68.1623859</lng>
</southwest>
<northeast>
<lat>35.5043404</lat>
<lng>97.3955550</lng>
</northeast>
</bounds>
</geometry>
</result>
</GeocodeResponse>

我想从xml中获取long_name,locality和country 我试过各种帖子,但没有得到完美的答案 任何人都可以指导我,如何将这个XML解析成an​​droid?

2 个答案:

答案 0 :(得分:27)

Raghunandan是对的。但是,如果您的目标是使用Google maps API获取“long_name”,地点等,您可能需要尝试以下方式来获取它。你可以得到JSON形式的响应,我觉得它更有条理。您可以先尝试使用网址:http://maps.google.com/maps/api/geocode/json?latlng=23.0043673,72.5411868999996&sensor=false

我一直使用以下方法,它对我有用。它可能会帮助您获得正在尝试的内容:

您可以获取纬度和经度,然后请求google服务器,使用包含有关位置坐标的各种信息的JSON对象进行回复。这是功能:

public JSONObject getLocationInfo( double lat, double lng) {

    HttpGet httpGet = new HttpGet("http://maps.google.com/maps/api/geocode/json?latlng="+lat+","+lng+"&sensor=false");
    HttpClient client = new DefaultHttpClient();
    HttpResponse response;
    StringBuilder stringBuilder = new StringBuilder();

    try {
        response = client.execute(httpGet);
        HttpEntity entity = response.getEntity();
        InputStream stream = entity.getContent();
        int b;
        while ((b = stream.read()) != -1) {
            stringBuilder.append((char) b);
        }
    } catch (ClientProtocolException e) {
        } catch (IOException e) {
    }

    JSONObject jsonObject = new JSONObject();
    try {
        jsonObject = new JSONObject(stringBuilder.toString());
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return jsonObject;
}

现在您可以解析JSON以获得您想要的任何内容。例如,假设您需要完整的formatted_address,请按以下步骤操作:

// get lat and lng value
JSONObject ret = getLocationInfo(lat, lng); 
JSONObject location;
String location_string;
try {
    //Get JSON Array called "results" and then get the 0th complete object as JSON        
    location = ret.getJSONArray("results").getJSONObject(0); 
    // Get the value of the attribute whose name is "formatted_string"
    location_string = location.getString("formatted_address");
    Log.d("test", "formattted address:" + location_string);
} catch (JSONException e1) {
    e1.printStackTrace();

}

如果您想了解更多如何从您将获得的JSON类型中提取所需数据,请参阅Android - How to parse JSONObject and JSONArrays问题的答案。希望它能帮到你。

<强>更新

希望你已经阅读了上述问题的答案。现在,例如:如果您想获得address_components的JSON数组,那么只需执行类似

的操作
JSONArray addressComp = ret.getJSONArray("results").getJSONObject(0).getJSONArray("address_components");

现在您可以按如下方式获取第一个long_name

String long_name1 = addressComp.getJSONObject(0).getString("long_name");

因此,请尝试将此处的模式与您获得的JSON响应进行比较。这将使您了解如何获取任何元素。这里,result是JSONARray,所以我把它作为JSONArray。然后我拿了result JSONArray的第一个对象,nameaddress_componentsvalue是另一个JSONArray。然后因为我想获得第一个long_name,所以我再次获取address_component JSONArray的第一个对象,然后要求获取名称为{{1}的组件的value }。希望你现在了解一下如何阅读价值观。

P.S:我没有运行最后两行但是在逻辑上制定了。希望它能让你明白。祝一切顺利!

答案 1 :(得分:0)

获得准确结果的简单方法。希望它有所帮助!

只需将此行放在您想要地址的位置:

String Adress_final=new GeocodeAPI().execute().get();

然后添加此内容,

    //calling web geocoder api to get the address

    protected class GeocodeAPI extends AsyncTask<String, String, String>
    {

        String participantURL = Config.GooglePlacesAPI+"latlng="+Lat+","+Lng+"&sensor=false";
        JSONObject json;

        @Override
        protected void onPreExecute() 
        {
            System.out.println("participantURL==>>"+participantURL);
            // Create a progressdialog mProgressDialog
            mProgressDialog = new ProgressDialog(getActivity());
            // Set progressdialog title
            mProgressDialog.setTitle("Please Wait");
            // Set progressdialog message
            mProgressDialog.setMessage("Loading Location...");
            mProgressDialog.setIndeterminate(false);
            // Show progressdialog
            mProgressDialog.show();
        }


        @Override
        protected String doInBackground(String... params) {
            JSONParser jsonParser = new JSONParser();
            System.out.println("participantURL==>>"+participantURL);
            System.out.println("latitude & Longitude=="+Lat+","+Lng);
            List<NameValuePair> parameters = new ArrayList<NameValuePair>();


            try {
                json = jsonParser.getJSONFromUrl(participantURL, parameters);
                System.out.println("********Return from JSONParser class********");
                System.out.println("json=="+json);

                if (json != null) {

                    // get lat and lng value

                    JSONObject location;

                    try {
                        //Get JSON Array called "results" and then get the 0th complete object as JSON        
                        location = json.getJSONArray("results").getJSONObject(0);
                        System.out.println("location==>>>"+location);
                        // Get the value of the attribute whose name is "formatted_string"
                        location_string = location.getString("formatted_address");
                        System.out.println("location_string==>>>"+location_string);
                        Log.d("test", "formattted address:" + location_string);
                    } catch (JSONException e1) {
                        e1.printStackTrace();
                    }

                }
                }catch (Exception error) {
                    error.getMessage();
                }


            return location_string;**