[英]Using JSON for Lat Long on Google Maps
I am trying to get a JSON object from an API to use the Lat Long for each marker on google maps. 我正在尝试从API获取JSON对象,以对Google地图上的每个标记使用Lat Long。
I can read the JSON in, as i have been able to put it in a listview, as a string, but cants seem to parse it into a double, it crashes every time. 我可以读入JSON,因为我已经能够将它作为字符串放入列表视图中,但是似乎无法将其解析为双精度,每次都会崩溃。
Java: Java的:
package com.fly.plane;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.fly.plane.R;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.Projection;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import android.R.array;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Point;
import android.location.Location;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.View;
import android.view.animation.Interpolator;
import android.view.animation.LinearInterpolator;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class MyMapActivity extends ListActivity {
private ProgressDialog pDialog;
// URL to get data JSON
private static String url = "http://edmundgentle.com/snippets/flights/api.php";
// JSON Node speeds
private static final String TAG_data = "data";
private static final String TAG_BEARING = "bearing";
private static final String TAG_speed = "speed";
private static final String TAG_ARR = "arr";
private static final String TAG_DEP = "dep";
private static final String TAG_DEP_LAT = "lat";
private static final String TAG_DEP_LON = "lon";
// data JSONArray
JSONArray data = null;
// Hashmap for ListView
ArrayList<HashMap<String, String>> contactList;
// Hashmap for ListView
ArrayList<Double> ct;
//final Handler handler;
private GoogleMap mMap;
public static final LatLng dest(int i){
final double latitude = -34.6 * i;
final double longitude = 34.23 * i;
return new LatLng(latitude, longitude);
}
public double latt = -15.48169437461;
public double lng = -15.48169437461;
public ArrayList<Integer> dLat;
public String dlat;
public String dlon;
public String alat;
public String alon;
public boolean wait = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_map);
contactList = new ArrayList<HashMap<String, String>>();
ct = new ArrayList<Double>();
//ListView lv = getListView();
//create markers
new Getdata().execute();
}
}
/**
* Async task class to get json by making HTTP call
* */
private class Getdata extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// Showing progress dialog
pDialog = new ProgressDialog(MyMapActivity.this);
pDialog.setMessage("Please wait...");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected Void doInBackground(Void... arg0) {
// Creating service handler class instance
HTTPHandler sh = new HTTPHandler();
// Making a request to url and getting response
String jsonStr = sh.makeServiceCall(url, HTTPHandler.GET);
Log.d("Response: ", "> " + jsonStr);
boolean limit = false;
int j = 0;
if (jsonStr != null || limit == false) {
j++;
//if (j > 20)limit = true;
try {
JSONObject jsonObj = new JSONObject(jsonStr);
// Getting JSON Array node
data = jsonObj.getJSONArray(TAG_data);
// looping through All data
for (int i = 0; i < data.length(); i++) {
JSONObject c = data.getJSONObject(i);
// departure node is JSON Object
JSONObject dep = c.getJSONObject(TAG_DEP);
//String dtime = dep.getString(TAG_DEP_TIME);
String dlat = dep.getString(TAG_DEP_LAT);
String dlon = dep.getString(TAG_DEP_LON);
// arrival node is JSON Object
JSONObject arr = c.getJSONObject(TAG_ARR);
// tmp hashmap for single contact
HashMap<String, String> contact = new HashMap<String, String>();
contact.put(TAG_DEP_LAT, dlat );
contact.put(TAG_DEP_LON,dlon);
// adding contact to contact list
contactList.add(contact);
if (i== data.length()){
wait = false;
}
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
Log.e("ServiceHandler", "Couldn't get any data from the url");
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
// Dismiss the progress dialog
if (pDialog.isShowing())
pDialog.dismiss();
// use plane api for latlon
mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
List<Marker> markers = new ArrayList<Marker>();
for (int i = 0; i < 1 ; i++)
{
// Now parse it in double
double latitude = Double.parseDouble(dlat);
double longitude = Double.parseDouble(dlon);
//double latitude = 34 + i;
//double longitude = 56 + i;
Marker marker = mMap.addMarker(new MarkerOptions()
.position(new LatLng(latitude, longitude))
//.position(new LatLng(latitude, longitude))
.title("Hello world")
.icon(BitmapDescriptorFactory.fromResource(R.drawable.planemarker)));
markers.add(marker);
}
//setListAdapter(adapter);
}
}
}
Here is the Messages i receive: 这是我收到的消息:
02-17 14:58:06.635: D/dalvikvm(23289): GC_FOR_ALLOC freed 54K, 24% free 23518K/30936K, paused 24ms, total 24ms
02-17 14:58:06.645: I/dalvikvm-heap(23289): Grow heap (frag case) to 30.616MB for 4194320-byte allocation
02-17 14:58:07.726: D/dalvikvm(23289): GC_FOR_ALLOC freed 4204K, 23% free 23921K/30932K, paused 33ms, total 33ms
02-17 14:58:07.736: I/dalvikvm-heap(23289): Grow heap (frag case) to 31.010MB for 4194320-byte allocation
02-17 14:58:08.517: D/dalvikvm(23289): GC_FOR_ALLOC freed 4293K, 23% free 23831K/30932K, paused 29ms, total 30ms
02-17 14:58:08.527: I/dalvikvm-heap(23289): Grow heap (frag case) to 30.922MB for 4194320-byte allocation
02-17 14:58:09.227: D/dalvikvm(23289): GC_FOR_ALLOC freed 4194K, 23% free 23868K/30932K, paused 27ms, total 27ms
02-17 14:58:09.237: I/dalvikvm-heap(23289): Grow heap (frag case) to 30.958MB for 4194320-byte allocation
02-17 14:58:09.968: D/dalvikvm(23289): GC_FOR_ALLOC freed 4149K, 23% free 23884K/30932K, paused 25ms, total 26ms
02-17 14:58:09.968: I/dalvikvm-heap(23289): Grow heap (frag case) to 30.973MB for 4194320-byte allocation
02-17 14:58:10.118: D/dalvikvm(23289): GC_FOR_ALLOC freed 4377K, 24% free 23626K/30932K, paused 25ms, total 25ms
02-17 14:58:10.128: I/dalvikvm-heap(23289): Grow heap (frag case) to 30.721MB for 4194320-byte allocation
02-17 14:58:10.439: D/dalvikvm(23289): GC_FOR_ALLOC freed 4508K, 24% free 23642K/30932K, paused 24ms, total 25ms
02-17 14:58:13.532: D/dalvikvm(23289): GC_FOR_ALLOC freed 2705K, 24% free 23782K/30932K, paused 26ms, total 27ms
02-17 14:58:25.974: D/dalvikvm(23289): GC_FOR_ALLOC freed 1949K, 20% free 24954K/30932K, paused 37ms, total 38ms
02-17 14:58:32.340: I/dalvikvm(23289): threadid=3: reacting to signal 3
02-17 14:58:32.430: I/dalvikvm(23289): Wrote stack traces to '/data/anr/traces.txt'
02-17 14:58:39.787: D/dalvikvm(23289): GC_FOR_ALLOC freed 1959K, 17% free 26506K/31692K, paused 51ms, total 51ms
02-17 14:58:54.081: D/dalvikvm(23289): GC_FOR_ALLOC freed 2235K, 17% free 28302K/33764K, paused 67ms, total 69ms
02-17 14:59:12.779: D/AndroidRuntime(23289): Shutting down VM
02-17 14:59:12.779: W/dalvikvm(23289): threadid=1: thread exiting with uncaught exception (group=0x41890898)
02-17 14:59:12.829: E/AndroidRuntime(23289): FATAL EXCEPTION: main
02-17 14:59:12.829: E/AndroidRuntime(23289): java.lang.NullPointerException
02-17 14:59:12.829: E/AndroidRuntime(23289): at java.lang.StringToReal.parseDouble(StringToReal.java:244)
02-17 14:59:12.829: E/AndroidRuntime(23289): at java.lang.Double.parseDouble(Double.java:295)
02-17 14:59:12.829: E/AndroidRuntime(23289): at com.fly.plane.MyMapActivity$Getdata.onPostExecute(MyMapActivity.java:222)
02-17 14:59:12.829: E/AndroidRuntime(23289): at com.fly.plane.MyMapActivity$Getdata.onPostExecute(MyMapActivity.java:1)
02-17 14:59:12.829: E/AndroidRuntime(23289): at android.os.AsyncTask.finish(AsyncTask.java:631)
02-17 14:59:12.829: E/AndroidRuntime(23289): at android.os.AsyncTask.access$600(AsyncTask.java:177)
02-17 14:59:12.829: E/AndroidRuntime(23289): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
02-17 14:59:12.829: E/AndroidRuntime(23289): at android.os.Handler.dispatchMessage(Handler.java:99)
02-17 14:59:12.829: E/AndroidRuntime(23289): at android.os.Looper.loop(Looper.java:137)
02-17 14:59:12.829: E/AndroidRuntime(23289): at android.app.ActivityThread.main(ActivityThread.java:5419)
02-17 14:59:12.829: E/AndroidRuntime(23289): at java.lang.reflect.Method.invokeNative(Native Method)
02-17 14:59:12.829: E/AndroidRuntime(23289): at java.lang.reflect.Method.invoke(Method.java:525)
02-17 14:59:12.829: E/AndroidRuntime(23289): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
02-17 14:59:12.829: E/AndroidRuntime(23289): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
02-17 14:59:12.829: E/AndroidRuntime(23289): at dalvik.system.NativeStart.main(Native Method)
I think I have figured out 我想我已经知道了
double latitude = Double.parseDouble(dlat);
double longitude = Double.parseDouble(dlon);
Seem to cause the issue, as if i change them to be a set value, it works fine. 似乎引起问题,好像我将它们更改为设定值一样,效果很好。
Any help would be appreciated, ive spent a few days on this and cant figure out why it doesn't work! 我会花上几天的时间,无法弄清为什么它不起作用,对我的帮助不胜感激!
Cheers Phil. 干杯菲尔。
inside your doInBackground method you recreate your dlat
and dlong
strings. 在doInBackground方法中,您可以重新创建dlat
和dlong
字符串。 they have nothing to do with the global dlat
and dlong
variables you created in the top of the code. 它们与您在代码顶部创建的全局dlat
和dlong
变量无关。
String dlat = dep.getString(TAG_DEP_LAT);
String dlon = dep.getString(TAG_DEP_LON);
but inside your onPostExecute
you try to access the global variables you created in the beginning but it looks like you never initialized them. 但是在onPostExecute
内部,您尝试访问在开始时创建的全局变量,但看起来好像从未初始化过它们。
double latitude = Double.parseDouble(dlat);
double longitude = Double.parseDouble(dlon);
thats why you get a nullpointer. 那就是为什么你得到一个空指针。
edit: quick fix - try replacing (within the doInBackground
method) 编辑:快速修复-尝试替换(在doInBackground
方法内)
String dlat = dep.getString(TAG_DEP_LAT);
String dlon = dep.getString(TAG_DEP_LON);
by 通过
dlat = dep.getString(TAG_DEP_LAT);
dlon = dep.getString(TAG_DEP_LON);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.