2014-03-26 15 views
0

我一個計步器程序的工作像下面如何計算android中的步行距離?

enter image description here

到目前爲止,我發現像下面的一些解決方案:

private void GetDistance(GeoPoint src, GeoPoint dest) { 

    StringBuilder urlString = new StringBuilder(); 
    urlString.append("http://maps.googleapis.com/maps/api/directions/json?"); 
    urlString.append("origin=");//from 
    urlString.append(Double.toString((double)src.getLatitudeE6()/1E6)); 
    urlString.append(","); 
    urlString.append(Double.toString((double)src.getLongitudeE6()/1E6)); 
    urlString.append("&destination=");//to 
    urlString.append(Double.toString((double)dest.getLatitudeE6()/1E6)); 
    urlString.append(","); 
    urlString.append(Double.toString((double)dest.getLongitudeE6()/1E6)); 
    urlString.append("&mode=walking&sensor=true"); 
    Log.d("xxx","URL="+urlString.toString()); 

    // get the JSON And parse it to get the directions data. 
    HttpURLConnection urlConnection= null; 
    URL url = null; 

    url = new URL(urlString.toString()); 
    urlConnection=(HttpURLConnection)url.openConnection(); 
    urlConnection.setRequestMethod("GET"); 
    urlConnection.setDoOutput(true); 
    urlConnection.setDoInput(true); 
    urlConnection.connect(); 

    InputStream inStream = urlConnection.getInputStream(); 
    BufferedReader bReader = new BufferedReader(new InputStreamReader(inStream)); 

    String temp, response = ""; 
    while((temp = bReader.readLine()) != null){ 
     //Parse data 
     response += temp; 
    } 
    //Close the reader, stream & connection 
    bReader.close(); 
    inStream.close(); 
    urlConnection.disconnect(); 

    //Sortout JSONresponse 
    JSONObject object = (JSONObject) new JSONTokener(response).nextValue(); 
    JSONArray array = object.getJSONArray("routes"); 
     //Log.d("JSON","array: "+array.toString()); 

    //Routes is a combination of objects and arrays 
    JSONObject routes = array.getJSONObject(0); 
     //Log.d("JSON","routes: "+routes.toString()); 

    String summary = routes.getString("summary"); 
     //Log.d("JSON","summary: "+summary); 

    JSONArray legs = routes.getJSONArray("legs"); 
     //Log.d("JSON","legs: "+legs.toString()); 

    JSONObject steps = legs.getJSONObject(0); 
      //Log.d("JSON","steps: "+steps.toString()); 

    JSONObject distance = steps.getJSONObject("distance"); 
     //Log.d("JSON","distance: "+distance.toString()); 

      String sDistance = distance.getString("text"); 
      int iDistance = distance.getInt("value"); 

} 

我決定用GPS的方式來實現。 但是,實現這一點的「常用方法」是什麼?它只是在30秒內獲得gps lat,lan,然後計算差異? 例如獲取GPS數據的間隔時間有多長。

感謝您的幫助

回答

2

,而不是調用谷歌的API,你可以使用這種方法來計算距離。

public double getDistance(double lat1, double lon1, double lat2, double lon2) { 
    double latA = Math.toRadians(lat1); 
    double lonA = Math.toRadians(lon1); 
    double latB = Math.toRadians(lat2); 
    double lonB = Math.toRadians(lon2); 
    double cosAng = (Math.cos(latA) * Math.cos(latB) * Math.cos(lonB-lonA)) + 
       (Math.sin(latA) * Math.sin(latB)); 
    double ang = Math.acos(cosAng); 
    double dist = ang *6371; 
    return dist; 
} 

這將減少一個API調用並快速找到兩個位置之間的距離。

+0

我應該多頻繁地獲取GPS數據? – user782104

+0

30秒是最好的一個。你可以設定哪一個適合你。只有當你得到新的位置更新時,你需要計算距離。 –

2

執行此功能

getDistanceFromLatLonInKm(lat1,lon1,lat2,lon2) { 
var R = 6371; // Radius of the earth in km 
var dLat = deg2rad(lat2-lat1); // deg2rad below 
var dLon = deg2rad(lon2-lon1); 
var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * 
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 
return d; 
} 

function deg2rad(deg) { 
return deg * (Math.PI/180) 
}