我正在尝试对地址进行地理编码并获取坐标。我不需要将它显示在地图上,根据我的搜索,它不需要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回复:
答案 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
预期我希望你理解这个问题:)
修改强>
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");
试试这个。