获得0.0作为纬度和经度

时间:2014-06-16 07:45:32

标签: android geolocation

我正在尝试对地址进行地理编码并获取坐标。我不需要将它显示在地图上,根据我的搜索,它不需要API密钥。在运行我的代码时,我得到NullPointerException所以我将服务器连接代码放在一个单独的线程中,但现在我得到0.0,0.0作为我的纬度和经度。 那么,我犯了错误?

这是我的代码:

public class MainActivity extends Activity {

    private TextView myAddress;
    private EditText addressET;
    private Button okButton;

    GeocodeResponse gr;
    Button hiButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myAddress = (TextView) findViewById(R.id.myAdrs);
        addressET = (EditText) findViewById(R.id.addressEditText);
        okButton = (Button) findViewById(R.id.OK);

        okButton.setOnClickListener(new OnClickListener() {

            double lattitude;
            double longitude;
            private String address;

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                address = addressET.getText().toString();
                if (address == null) {
                    Toast.makeText(getApplicationContext(), "Enter address",
                            Toast.LENGTH_SHORT).show();
                } else {
                    new Thread(new Runnable() {

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            gr.gecodeResponse(address);
                        }
                    });

                    if(lattitude!=0)lattitude = gr.lattitude();
                    if(longitude!=0)longitude = gr.longitude();

                    myAddress.setText(lattitude + " " + longitude);
                }
            }
        });
    }
}

GeocodeResponse.java:

public class GeocodeResponse {

     double lng;
     double lat;


    public void gecodeResponse(String address) {
        // TODO Auto-generated method stub
        String uri = "http://maps.google.com/maps/api/geocode/json?address="+address+"&sensor=false";
        HttpGet httpGet = new HttpGet(uri);
        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) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject = new JSONObject(stringBuilder.toString());

            lng = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
                    .getJSONObject("geometry").getJSONObject("location")
                    .getDouble("lng");

            lat = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
                    .getJSONObject("geometry").getJSONObject("location")
                    .getDouble("lat");

             Log.e("lattitude"+"", lat+"");
             Log.e("longitude", lng+""); 
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

    double lattitude() {
        return lat;

    }

    double longitude() {
        return lng;
    }

}

json回复:

https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA

2 个答案:

答案 0 :(得分:0)

您未来的问题是,您不会检查您获得的回复类型。是屋顶还是其他东西。我不知道这对你来说是否重要,但有时你可以得到很远的结果。

我在下面这样做。迭代整个结果(如果您获得任何结果,则为调试器提供专业版),检查结果类型(请参阅gmaps文档),例如将其添加到全局列表中。

if (result!=null){
    List<Integer> rooftopsIds = new ArrayList<Integer>();
    JSONArray result = ((JSONArray) jsonObj.get("results"));
    int length = result.length();
    for (int i = 0; i < length; i++) {
        String type = result.getJSONObject(i).getJSONObject("geometry").getString("location_type");
        if (type.equalsIgnoreCase("ROOFTOP")) {
            //probably the most accurate response
            rooftopsIds.add(i); 
        }
        if (type.equalsIgnoreCase("RANGE_INTERPOLATED")) {
            //less accurate response
        }
        if (type.equalsIgnoreCase("GEOMETRIC_CENTER")) {
            //the worst result as for me :)
        }
    }
}

然后我可以检查每种类型是否有多个结果。这很重要,因为我有一个地址,我有一个地址的两个屋顶,不同的是,另一个地址是在附近的城市,而不是一个用户提供。所以我的建议是检查它。

对于gmaps url,你还要添加&#34;&amp; language = en-EN&#34; (或您的语言)

您是否检查过JSON结果对象,它包含哪些内容?你可以将gmaps网址粘贴到你想要进行地理编码的地址的firefox中,你会得到打印结果。

最好在收到结果后在设备上使用断点和调试(您可以轻松查看整个JSON对象。

答案 1 :(得分:-1)

基兰,

通过代码,我觉得没问题,问题是你在哪里测试了应用程序?

  • 您必须使用DDMS预期
  • 将lat,long发送到模拟器
  • 否则,您必须通过手机(首选)调试应用程序

我希望你理解这个问题:)

修改

JSONObject jsonObject = new JSONObject();
    try {
        jsonObject = new JSONObject(stringBuilder.toString());

        lng = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
                .getJSONObject("geometry").getJSONObject("location")
                .getDouble("lng");

        lat = ((JSONArray) jsonObject.get("results")).getJSONObject(1)
                .getJSONObject("geometry").getJSONObject("location")
                .getDouble("lat");

试试这个。