【问题标题】:Distance between points点之间的距离
【发布时间】:2013-10-14 08:30:45
【问题描述】:

我正在尝试创建一个函数,以便根据我所在的位置和其他点返回地图上各个点之间的距离。

但是这样可以得到在数据库第一个点得到的距离。

你能帮帮我吗?

if (cursor.getCount() > 0) {
    if (cursor != null && cursor.moveToFirst()) {       
        lat_s = >cursor.getString(cursor.getColumnIndex("latitude"));
        lng_s = >cursor.getString(cursor.getColumnIndex("longitude"));          
        lat_p = Double.parseDouble(lat_s);
        lng_p = Double.parseDouble(lng_s);          
        double dist = getDistancia(lat, lng, lat_p, lng_p);         
    }       
    @SuppressWarnings("deprecation")        
    SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this,
        R.layout.list_row, cursor, from, to);       
    listView.setAdapter(mAdapter);  
}

返回我距离的函数是:

public double getDistancia(double latitude, double longitude, 
        double latitudePto, double longitudePto){  
    double dlon, dlat, a, distancia;  
    dlon = longitudePto - longitude;  
    dlat = latitudePto - latitude;  
    a = Math.pow(Math.sin(dlat/2),2) + Math.cos(latitude) * 
            Math.cos(latitudePto) * Math.pow(Math.sin(dlon/2),2);  
    distancia = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));  
    return 6378140 * distancia; /* 6378140 is the radius of the Earth in meters*/  
}

【问题讨论】:

标签: java android google-maps


【解决方案1】:

谷歌地图提供了获取两个位置之间距离的 api-

更多详情

https://developers.google.com/maps/documentation/directions/

你也可以用这个-

Location locationA = new Location("point A");  
locationA.setLatitude(mLatitude / 1E6);  
locationA.setLongitude(mLongitude / 1E6);  
Location locationB = new Location("point B");  
locationB.setLatitude(lat / 1E6);  
locationB.setLongitude(lng / 1E6);  
double distance = locationA.distanceTo(locationB);

【讨论】:

  • 我的问题是如何通过“光标”提醒几个点,因为它已经尝试获取一个数组但不能,两点之间的距离已经是,但我是其中之一。
  • 您可以将您的位置经纬度存储在arraylist中,然后将它们循环传递给google api(developers.google.com/maps/documentation/directions)。使用json解析可以一一获取。
【解决方案2】:
【解决方案3】:

不明白这个问题,但这里有一个解决方案:

protected double distanceBetween(float lat_a, float lng_a, float lat_b, float lng_b) {

    float pk = (float) (180 / 3.14169);
    float a1 = lat_a / pk;
    float a2 = lng_a / pk;
    float b1 = lat_b / pk;
    float b2 = lng_b / pk;
    float t1 = FloatMath.cos(a1) * FloatMath.cos(a2) * FloatMath.cos(b1) * FloatMath.cos(b2);
    float t2 = FloatMath.cos(a1) * FloatMath.sin(a2) * FloatMath.cos(b1) * FloatMath.sin(b2);
    float t3 = FloatMath.sin(a1) * FloatMath.sin(b1);
    double tt = Math.acos(t1 + t2 + t3);
    return 6366000 * tt;
}

【讨论】: