I want to parse Google Map API for reverse geocode in Android
Asked Answered
S

2

6

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

this link gives me following result This XML file does not appear to have any style information associated with it. The document tree is shown below.

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>

I want to fetch the long_name, locality and country from the xml i have tried various posts but didnt get the perfect answer can anybody please guide me, how to parse this XML into android ??

Sensitive answered 25/5, 2013 at 7:37 Comment(2)
choose the parser and parse your xml data . developer.android.com/training/basics/network-ops/xml.htmlFranckot
There are lots of long_names. Which one do you wish to access?Heelpiece
H
27

Raghunandan is right. However if your aim is to just get the 'long_name', locality etc using Google maps API, you might want to try the following way to get it. You can get the response is in form of JSON which I feel is more structured. You can yourself try the URL first: http://maps.google.com/maps/api/geocode/json?latlng=23.0043673,72.5411868999996&sensor=false

I use the following method all the time and it works for me. It might help you get what you are trying:

You can get the latitude and longitude and then request google servers, to reply with a JSON object containing various information about the location co-ordinates. Here is the function:

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;
}

Now you can parse the JSON to get whatever you want. For example, suppose you want complete formatted_address, here is how you can get:

// 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();

}

If you want to know more of how to extract the desired data from the type of JSON that you'll get in response, see answers on Android - How to parse JSONObject and JSONArrays question. Hope it helps you.

Update:

Hope you've read the answers on above question. Now, For example: If you want to get JSON Array of address_components, then just do something like

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

Now you can get the first long_name as follows:

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

So try to see compare the pattern here to the JSON response that you are getting. This will make you understand how to approach for getting any element. Here, result was JSONARray, so I got it as JSONArray. Then I took the first object of the result JSONArray whose name wasaddress_components and the value was another JSONArray. Then because I wanted to get the first long_name, so I again took the first object of the address_component JSONArray and then asked to get the value of the component whose name was long_name. Hope now you understand a bit how you can read values.

P.S: I didn't run the last two lines but formulated logically. Hope it makes you understand. All the best!

Heelpiece answered 25/5, 2013 at 8:18 Comment(0)
P
0

Simple way to get exact result . Hope it helps !

just put this line where you want address:

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

Then add this ,

    //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;**
Perspiratory answered 25/12, 2014 at 17:33 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.