how to find the distance between two geopoints?

后端 未结 6 1796
遇见更好的自我
遇见更好的自我 2020-12-06 01:55
double distance;  

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

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

Location locationB = new Locat         


        
相关标签:
6条回答
  • 2020-12-06 02:08

    This is not an answer, but note the signature for the Location constructor is Location(String provider).

    i.e. the String you pass to the constructor should be one of LocationManager.GPS_PROVIDER, LocationManager.NETWORK_PROVIDER or LocationManager.PASSIVE_PROVIDER, not "point A" and "point B".

    0 讨论(0)
  • 2020-12-06 02:11
    double CalculateDistance( double nLat1, double nLon1, double nLat2, double nLon2 )
    {
        double nRadius = 6371; // Earth's radius in Kilometers
        // Get the difference between our two points
        // then convert the difference into radians
    
        double nDLat = ToRad(nLat2 - nLat1);
        double nDLon = ToRad(nLon2 - nLon1);
    
        // Here is the new line
        nLat1 =  ToRad(nLat1);
        nLat2 =  ToRad(nLat2);
    
        double nA = pow ( sin(nDLat/2), 2 ) + cos(nLat1) * cos(nLat2) * pow ( sin(nDLon/2), 2 );
    
        double nC = 2 * atan2( sqrt(nA), sqrt( 1 - nA ));
        double nD = nRadius * nC;
    
        return nD; // Return our calculated distance
    }
    

    http://www.jaimerios.com/?p=39

    0 讨论(0)
  • 2020-12-06 02:13

    Just a quick snippet since I didn't see a complete and simple solution with GeoPoints above:

    public float getDistanceInMiles(GeoPoint p1, GeoPoint p2) {
        double lat1 = ((double)p1.getLatitudeE6()) / 1e6;
        double lng1 = ((double)p1.getLongitudeE6()) / 1e6;
        double lat2 = ((double)p2.getLatitudeE6()) / 1e6;
        double lng2 = ((double)p2.getLongitudeE6()) / 1e6;
        float [] dist = new float[1];
        Location.distanceBetween(lat1, lng1, lat2, lng2, dist);
        return dist[0] * 0.000621371192f;
    }
    

    If you want meters, just return dist[0] directly.

    0 讨论(0)
  • 2020-12-06 02:14

    Try Location.distanceBetween(..)

    Update:

    If you are getting lat/lon from GeoPoint then they are in microdegrees. You must multiply by 1e6.

    0 讨论(0)
  • 2020-12-06 02:20

    As stated above, the Location Class is the way to go. Here is the code I have used :

    Location locationA = new Location("point A");
    
    locationA.setLatitude(pointA.getLatitudeE6() / 1E6);
    locationA.setLongitude(pointA.getLongitudeE6() / 1E6);
    
    Location locationB = new Location("point B");
    
    locationB.setLatitude(pointB.getLatitudeE6() / 1E6);
    locationB.setLongitude(pointB.getLongitudeE6() / 1E6);
    
    double distance = locationA.distanceTo(locationB);
    

    In this example, both pointA and pointB are instances of the GeoPoint class.

    0 讨论(0)
  • 2020-12-06 02:23

    An alternative way to accomplish the above,

        public class Distance {
    
        public static 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;
            //if (unit == "K") {
            //  dist = dist * 1.609344;
            // else if (unit == "N") {
            //dist = dist * 0.8684;
            //}
            return (dist);
        }
    
    
        public static final double PI = 3.14159265;
        public static final double deg2radians = PI/180.0;
    
    
        public static double getDistance(double latitude1, double longitude1, double latitude2,double longitude2) {
    
            double lat1 = latitude1 * deg2radians;
            double lat2 = latitude2 * deg2radians;
            double lon1 = longitude1 * deg2radians;
            double lon2 = longitude2 * deg2radians;
            // Williams gives two formulae;
            // this is the more accurate for close distances.
            // In practice, the two differed only in the 8th or 9th place, for
            // separations as small as 1 degree.
            double radd = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin((lat1 - lat2) / 2),
                    2.0)
                    + Math.cos(lat1)
                    * Math.cos(lat2)
                    * Math.pow(Math.sin((lon1 - lon2) / 2), 2.0)));
    
            return radd;
        }
    
    
    
    
    
        /* ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
        /* :: This function converts decimal degrees to radians : */
        /* ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
        private static double deg2rad(double deg) {
            return (deg * Math.PI / 180.0);
        }
    
        /* ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
        /* :: This function converts radians to decimal degrees : */
        /* ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
        private static double rad2deg(double rad) {
            return (rad * 180.0 / Math.PI);
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题