1

使用我的位置纬度经度和 DB 纬度经度计算距离。但总是错误“应用程序 AndroidGoogleMaps(进程 com.androidhive.googlemaps)已意外停止。请重试。”

public class AndroidGoogleMapsActivity extends MapActivity {

public int mm[][]= new int[100][100];
double[][] rtdist= new double[50][2]; 
double[][] okdist= new double[50][2]; 
public  GeoPoint[] endpp = new GeoPoint[100]; 
private static String KEY_SUCCESS = "success";
private MyLocationOverlay mylayer;
private MapController mapController;
private MapView mapView;
protected GeoPoint geoPoint;

   @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    findViews();
    setupMap();
}

private void findViews() {
        mapView = (MapView) findViewById(R.id.mapView);
        mapController = mapView.getController();
        mapView.setBuiltInZoomControls(true);           
}

private void setupMap() {
 List<Overlay> overlays = mapView.getOverlays();
    mylayer = new MyLocationOverlay(this, mapView);
    mylayer.runOnFirstFix(new Runnable() {
        public void run() {
            // Zoom in to current location
            mapView.setTraffic(true);
            mapController.setZoom(17);
            mapController.animateTo(mylayer.getMyLocation());
        }
    });

overlays.add(mylayer);
GeoPoint startpp =  mylayer.getMyLocation();

        String b="SELECT lat,lng FROM markers";
    UserFunctions userFunction = new UserFunctions();
    JSONObject json = userFunction.execqlcmd(b);

    try {
        if (json.getString(KEY_SUCCESS) != null) 
        {
            String res = json.getString(KEY_SUCCESS); 
            if(Integer.parseInt(res) == 1)
            {

                for(int i=0 ; i<100 ; i++) {

                JSONObject json_row = json.getJSONObject("r"+i);

     mm[i][0]=(int)(Double.parseDouble(json_row.getString("c0")) * 1E6) ;
 mm[i][1]=(int)(Double.parseDouble(json_row.getString("c1")) * 1E6) ;
     endpp[i] =new GeoPoint(mm[i][0], mm[i][1] ); 

        MapController mc = mapView.getController();

DistanceCalculator caldist= new DistanceCalculator(6371); 

for(int j = 0;  j < 2; j++)
   {
    rtdist[j][0]=1;
    rtdist[j][1]=caldist.CalculationByDistance(startpp, endpp[j]); 

    //startpp  The location of the phone is
    //endpp DB's lat lng

    //To judge the results of this array is in line with the distance required by the user
  if(rtdist[j][1]<=50)
    {
    okdist[j][0]=rtdist[j][0]; //The amount of store 
    okdist[j][0]=rtdist[j][1]; //Store the distance
    } 

    }

    mc.animateTo(geoPoint);  
    mc.setZoom(15);
    mapView.invalidate(); 

        List<Overlay> mapOverlays = mapView.getOverlays();

    Drawable drawable = this.getResources().getDrawable(R.drawable.mark_red);
    AddItemizedOverlay itemizedOverlay = 
    new AddItemizedOverlay(drawable, this);

    OverlayItem overlayitem = new OverlayItem(geoPoint, "Hello", "Sample Overlay   item");
    itemizedOverlay.addOverlay(overlayitem);

    mapOverlays.add(itemizedOverlay);


    }}}}
    catch (JSONException e) {
        e.printStackTrace();
    }

 }

     @Override
 protected void onResume() {
 // TODO Auto-generated method stub
 super.onResume();
 mylayer.enableMyLocation();
 }
 @Override
 protected void onPause() {
 // TODO Auto-generated method stub
 super.onPause();
 mylayer.disableMyLocation();
 }

@Override
protected boolean isRouteDisplayed() {
    return false;
}
    public class DistanceCalculator {  

       private double Radius;  

       // R = earth's radius (mean radius = 6,371km)  
       // Constructor  
       DistanceCalculator(double R) {  
          Radius = R;  
       }  


    public double CalculationByDistance(GeoPoint startpp, GeoPoint endpp) {  
          double lat1 = startpp.getLatitudeE6()/1E6;  
          double lat2 = endpp.getLatitudeE6()/1E6;  
          double lon1 = startpp.getLongitudeE6()/1E6;  
          double lon2 = endpp.getLongitudeE6()/1E6;  
          double dLat = Math.toRadians(lat2-lat1);  
          double dLon = Math.toRadians(lon2-lon1);  
          double a = Math.sin(dLat/2) * Math.sin(dLat/2) +  
             Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *  
             Math.sin(dLon/2) * Math.sin(dLon/2);  
          double c = 2 * Math.asin(Math.sqrt(a));  
          return Radius * c;  
       } 
  } 
}

日志猫:

05-13 14:49:44.703: D/dalvikvm(303): GC_FOR_MALLOC freed 4358 objects / 275032 bytes in 316ms
05-13 14:49:44.903: D/dalvikvm(303): GC_FOR_MALLOC freed 10567 objects / 641664 bytes in 58ms
05-13 14:49:45.063: D/dalvikvm(303): GC_FOR_MALLOC freed 4727 objects / 310440 bytes in 45ms
05-13 14:49:45.243: D/dalvikvm(303): GC_FOR_MALLOC freed 6480 objects / 394584 bytes in 48ms
05-13 14:49:45.443: D/dalvikvm(303): GC_FOR_MALLOC freed 7949 objects / 616640 bytes in 51ms
05-13 14:49:45.623: D/dalvikvm(303): GC_FOR_MALLOC freed 6072 objects / 370040 bytes in 51ms
05-13 14:49:45.813: D/dalvikvm(303): GC_FOR_MALLOC freed 4449 objects / 354128 bytes in 62ms
05-13 14:49:45.823: I/dalvikvm-heap(303): Grow heap (frag case) to 3.048MB for 87396-byte allocation
05-13 14:49:45.884: D/dalvikvm(303): GC_FOR_MALLOC freed 45 objects / 2392 bytes in 66ms
05-13 14:49:45.953: D/dalvikvm(303): GC_FOR_MALLOC freed 2 objects / 80 bytes in 67ms
05-13 14:49:45.953: I/dalvikvm-heap(303): Grow heap (frag case) to 3.129MB for 87396-byte allocation
05-13 14:49:46.013: D/dalvikvm(303): GC_FOR_MALLOC freed 0 objects / 0 bytes in 58ms
05-13 14:49:46.273: E/JSON(303): {"tag":"exesqlcmd","success":1,"error":0,"rownum":2,"colnum":2,"r0":{"c0":"23.973728","c1":"121.583641"},"r1":{"c0":"23.973827","c1":"121.585625"}}
05-13 14:49:46.293: D/AndroidRuntime(303): Shutting down VM
05-13 14:49:46.293: W/dalvikvm(303): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
05-13 14:49:46.313: E/AndroidRuntime(303): FATAL EXCEPTION: main
05-13 14:49:46.313: E/AndroidRuntime(303): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.androidhive.googlemaps/com.androidhive.googlemaps.AndroidGoogleMapsActivity}: java.lang.NullPointerException
05-13 14:49:46.313: E/AndroidRuntime(303):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
05-13 14:49:46.313: E/AndroidRuntime(303):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
05-13 14:49:46.313: E/AndroidRuntime(303):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
05-13 14:49:46.313: E/AndroidRuntime(303):  at    android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
05-13 14:49:46.313: E/AndroidRuntime(303):  at android.os.Handler.dispatchMessage(Handler.java:99)
05-13 14:49:46.313: E/AndroidRuntime(303):  at android.os.Looper.loop(Looper.java:123)
05-13 14:49:46.313: E/AndroidRuntime(303):  at android.app.ActivityThread.main(ActivityThread.java:4627)
05-13 14:49:46.313: E/AndroidRuntime(303):  at java.lang.reflect.Method.invokeNative(Native Method)
05-13 14:49:46.313: E/AndroidRuntime(303):  at java.lang.reflect.Method.invoke(Method.java:521)
05-13 14:49:46.313: E/AndroidRuntime(303):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-13 14:49:46.313: E/AndroidRuntime(303):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-13 14:49:46.313: E/AndroidRuntime(303):  at dalvik.system.NativeStart.main(Native Method)
05-13 14:49:46.313: E/AndroidRuntime(303): Caused by: java.lang.NullPointerException
05-13 14:49:46.313: E/AndroidRuntime(303):  at com.androidhive.googlemaps.AndroidGoogleMapsActivity$DistanceCalculator.CalculationByDistance(AndroidGoogleMapsActivity.java:178)
05-13 14:49:46.313: E/AndroidRuntime(303):  at com.androidhive.googlemaps.AndroidGoogleMapsActivity.setupMap(AndroidGoogleMapsActivity.java:106)
05-13 14:49:46.313: E/AndroidRuntime(303):  at com.androidhive.googlemaps.AndroidGoogleMapsActivity.onCreate(AndroidGoogleMapsActivity.java:41)
05-13 14:49:46.313: E/AndroidRuntime(303):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-13 14:49:46.313: E/AndroidRuntime(303):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
05-13 14:49:46.313: E/AndroidRuntime(303):  ... 11 more
4

1 回答 1

0

如果要计算两个地理点之间的距离,则必须在 Location Class 中查看这两种方法

位置类

你可以像这样使用它:

Location locationA = new Location("point A");

locationA.setLatitude(latA);
locationA.setLongitude(lngA);

Location locationB = new Location("point B");

locationB.setLatitude(latB);
LocationB.setLongitude(lngB);

distance = locationA.distanceTo(locationB);
于 2012-05-13T16:53:10.200 回答