如何使用它们的经度和纬度值计算两个位置之间的距离
在这里我的代码我使用下面的代码来计算两个位置之间的距离,使用他们的经度和纬度。 这是给错误的距离。 有时会变得正确,有时会变得无关距离。
我们从数据库中获取lat1和lng1。
//getting lat2 and lng2 from GPS as below public class MyLocationListener implements LocationListener { @Override public void onLocationChanged(Location loc) { lat2=loc.getLatitude(); lng2=loc.getLongitude(); String Text = "My current location is: " +"Latitud = "+ loc.getLatitude() +"Longitud = " + loc.getLongitude(); //System.out.println("Lat & Lang form Loc"+Text); //Toast.makeText( getApplicationContext(), Text,Toast.LENGTH_SHORT).show(); } @Override public void onProviderDisabled(String provider) { } @Override public void onProviderEnabled(String provider) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } //Calculating distance double earthRadius = 3958.75; double dLat = Math.toRadians(lat1-lat2); double dLng = Math.toRadians(lng1-lng2); double a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(Math.toRadians(lat2)) * Math.cos(Math.toRadians(lat1)) * Math.sin(dLng/2) * Math.sin(dLng/2); double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); double dist = earthRadius * c;
这里以千米(公里)
private double distance(double lat1, double lon1, double lat2, double lon2) { double theta = lon1 - lon2; double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta)); dist = Math.acos(dist); dist = rad2deg(dist); dist = dist * 60 * 1.1515; return (dist); } private double deg2rad(double deg) { return (deg * Math.PI / 180.0); } private double rad2deg(double rad) { return (rad * 180.0 / Math.PI); }
有一个android.location.Location.distanceBetween()
方法,这很好。
Android开发人员文档:位置
试试这个代码。
startPoint.distanceTo(endPoint)函数以米为单位返回这些位置之间的距离。
Location startPoint=new Location("locationA"); startPoint.setLatitude(17.372102); startPoint.setLongitude(78.484196); Location endPoint=new Location("locationA"); endPoint.setLatitude(17.375775); endPoint.setLongitude(78.469218); double distance=startPoint.distanceTo(endPoint);
这里“距离”是我们在米的要求的结果。 我希望它会为Android的工作。
在build.gradle:
compile 'com.google.maps.android:android-maps-utils:0.4'
接着:
public static Double distanceBetween(LatLng point1, LatLng point2) { if (point1 == null || point2 == null) { return null; } return SphericalUtil.computeDistanceBetween(point1, point2); }
如果您有两个位置对象Location loc1
和Location loc2
float distance = loc1.distanceTo(loc2);
如果您有经度和纬度值,则使用static distanceBetween()
函数
float[] results = new float[1]; Location.distanceBetween(startLatitude, startLongitude, endLatitude, endLongitude, results); float distance = results[0];
private String getDistanceOnRoad(double latitude, double longitude, double prelatitute, double prelongitude) { String result_in_kms = ""; String url = "http://maps.google.com/maps/api/directions/xml?origin=" + latitude + "," + longitude + "&destination=" + prelatitute + "," + prelongitude + "&sensor=false&units=metric"; String tag[] = { "text" }; HttpResponse response = null; try { HttpClient httpClient = new DefaultHttpClient(); HttpContext localContext = new BasicHttpContext(); HttpPost httpPost = new HttpPost(url); response = httpClient.execute(httpPost, localContext); InputStream is = response.getEntity().getContent(); DocumentBuilder builder = DocumentBuilderFactory.newInstance() .newDocumentBuilder(); Document doc = builder.parse(is); if (doc != null) { NodeList nl; ArrayList args = new ArrayList(); for (String s : tag) { nl = doc.getElementsByTagName(s); if (nl.getLength() > 0) { Node node = nl.item(nl.getLength() - 1); args.add(node.getTextContent()); } else { args.add(" - "); } } result_in_kms = String.format("%s", args.get(0)); } } catch (Exception e) { e.printStackTrace(); } return result_in_kms; }
你为什么要编写自己计算距离的代码?
检查位置类中的API
private float distanceFrom_in_Km(float lat1, float lng1, float lat2, float lng2) { if (lat1== null || lng1== null || lat2== null || lng2== null) { return null; } double earthRadius = 6371000; //meters double dLat = Math.toRadians(lat2-lat1); double dLng = Math.toRadians(lng2-lng1); double a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.sin(dLng/2) * Math.sin(dLng/2); double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); float dist = (float) (earthRadius * c); return dist; }
你应该使用Haversine距离公式
Haversine公式用于计算地球上两点间的距离。
public void haversine(double lat1, double lon1, double lat2, double lon2) { double Rad = 6372.8; //Earth's Radius In kilometers // TODO Auto-generated method stub double dLat = Math.toRadians(lat2 - lat1); double dLon = Math.toRadians(lon2 - lon1); lat1 = Math.toRadians(lat1); lat2 = Math.toRadians(lat2); double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2); double c = 2 * Math.asin(Math.sqrt(a)); haverdistanceKM = Rad * c; }
- Android Studio 1.2.1.1 – 无法find样式“textViewStyle”
- 无法在优胜美地上运行Android Studio
- 在Android Browser或WebView内部检测
- Android:java.lang.IllegalAccessException尝试使用自定义的“应用程序”类时
- 如何在Android中创build虚线/虚线?
- “未安装以下SDK组件:sys-img-x86-addon-google_apis-google-22和addon-google_apis-google-22”
- 如何在模拟器上安装Android Market应用程序?
- 在Android中模拟低电量和低内存
- 检测用户何时解除软键盘