2013-04-05 101 views
3

我正在尝试制作一个应用程序,它将用户的当前位置的纬度和经度作为参考。并且瞬间计数,以km为单位的用户旅行距离。Android:如何使用GPS测量距离

“currentLat”和“currentLon”是当前用户的纬度和经度。但我不知道放入“endLat”和“ednLon”的经度和纬度。

对不起,我的英语不好。

在此先感谢。

///////////////////////////////////

我做它的应用程序,但现在只有一个小问题。 当我第一次开始程序,我得到价值5536,当我重新启动程序,我得到正常值0.0

再次抱歉我的英语不好。 :)

和球员,感谢帮助我,你是最好的:)

public class Gps extends Activity { 

TextView display; 


    double currentLon=0 ; 
    double currentLat=0 ; 
    double lastLon = 0; 
    double lastLat = 0; 
    double distance; 




public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_test); 




    display = (TextView) findViewById(R.id.info); 

    LocationManager lm =(LocationManager) getSystemService(LOCATION_SERVICE); 
       lm.requestLocationUpdates(lm.GPS_PROVIDER, 0,0, Loclist); 
       Location loc = lm.getLastKnownLocation(lm.GPS_PROVIDER); 

       if(loc==null){ 
        display.setText("No GPS location found"); 
        } 
        else{ 
         //set Current latitude and longitude 
         currentLon=loc.getLongitude(); 
         currentLat=loc.getLatitude(); 

         } 
       //Set the last latitude and longitude 
       lastLat=currentLat; 
       lastLon=currentLon ; 


} 



LocationListener Loclist = new LocationListener(){ 




@Override 
public void onLocationChanged(Location location) { 
    // TODO Auto-generated method stub 

    //start location manager 
    LocationManager lm =(LocationManager) getSystemService(LOCATION_SERVICE); 

     //Get last location 
    Location loc = lm.getLastKnownLocation(lm.GPS_PROVIDER); 

    //Request new location 
     lm.requestLocationUpdates(lm.GPS_PROVIDER, 0,0, Loclist); 

     //Get new location 
     Location loc2 = lm.getLastKnownLocation(lm.GPS_PROVIDER); 

     //get the current lat and long 
    currentLat = loc.getLatitude(); 
    currentLon = loc.getLongitude(); 


    Location locationA = new Location("point A"); 
     locationA.setLatitude(lastLat); 
     locationA.setLongitude(lastLon); 

    Location locationB = new Location("point B"); 
     locationB.setLatitude(currentLat); 
     locationB.setLongitude(currentLon); 

     double distanceMeters = locationA.distanceTo(locationB); 

     double distanceKm = distanceMeters/1000f; 

     display.setText(String.format("%.2f Km",distanceKm)); 

     } 



@Override 
public void onProviderDisabled(String provider) { 
    // TODO Auto-generated method stub 

} 



@Override 
public void onProviderEnabled(String provider) { 
    // TODO Auto-generated method stub 

} 



@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 
    // TODO Auto-generated method stub 



} 

}; 

} 
+0

这里有什么错误? – 2013-04-05 07:40:26

+0

顺便说一句,你的方法发送相同的位置,所以距离总是会返回0米。 – Carnal 2013-04-05 07:44:53

回答

1

但是我不知道放入“endLat”和“ednLon”的经纬度。

endLat,endLon是一个令人困惑的名字:

你应该有lastLat,lastLon:拉特,LON在onGpsUpdate先前接收的呼叫,保存到你的如distanceCalculator.lastLat 其中distanceCalculator是物体在那里你存储lastLat和lastLon

那么你应该有curLat,curLon:当前的纬度,经度在onGPSUpdate

交付然后计算从(lastLat,lastLon)距离 - >(curLat,curLon) 并更新您的distanceCalculator.lastLat和lastLon。

3

既然你有两个地点,你为什么不考虑使用distanceTo

float distanceMeters = location1.distanceTo(location2); 
float distanceKm = distanceMeters/1000f; 
+0

location1是用户的位置,但是什么将location2.This是我最大的问题 – 2013-04-05 08:01:10

+0

@Carnal这不是问题,没有在这个问题的8个修订。对于一个没有被问到的问题,谁做了赞成?你是否赞成自己(有一点帮助)? – AlexWien 2013-04-05 13:10:14

0

Link

var R = 6371; // Radius of the earth in km 
var dLat = (lat2-lat1).toRad(); // Javascript functions in radians 
var dLon = (lon2-lon1).toRad(); 
var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
     Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) * 
     Math.sin(dLon/2) * Math.sin(dLon/2); 
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
var d = R * c; // Distance in km. 
+0

这不是问题,也不是这个问题的8个修订版本。对于一个没有被问到的问题,谁做了赞成?你是否赞成自己(有一点帮助)? – AlexWien 2013-04-05 13:09:45