6

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 を Android に解析する方法を教えてください。

4

2 に答える 2

27

ラグナンダンは正しい。ただし、Google マップ API を使用して「long_name」や地域などを取得するだけの場合は、次の方法で取得することをお勧めします。応答は、より構造化されていると思われる JSON の形式で取得できます。最初に URL を試すことができます: 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 の回答を参照してください - JSONObject および JSONArrays の質問を解析する方法。お役に立てば幸いです。

更新

上記の質問に対する回答を読んでいただければ幸いです。たとえば、 の JSON 配列を取得する場合はaddress_components、次のようにします。

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で取得。次に、JSONArray の最初のオブジェクトをresult取得しました。そのオブジェクトは、別の JSONArraynameでした。次に、最初の を取得したかったので、再度JSONArrayの最初のオブジェクトを取得し、名前が であるコンポーネントのを取得するように要求しました。値を読み取る方法を少し理解していただければ幸いです。address_componentsvaluelong_nameaddress_componentvaluelong_name

PS: 最後の 2 行は実行しませんでしたが、論理的に定式化しました。ご理解いただけると幸いです。ではごきげんよう!

于 2013-05-25T08:18:38.573 に答える
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;**
于 2014-12-25T17:33:45.060 に答える