#android #distance #latitude-longitude
#Android #расстояние #широта-долгота
Вопрос:
Следующий код вычисляет расстояние между двумя географическими точками и возвращает массив расстояний
public static double[] getDistance() {
double[] distance=new double[20];
Intent intent=new Intent();
double latitude[]=intent.getDoubleArrayExtra("latitude");
double longitude[]=intent.getDoubleArrayExtra("longitude");
Log.v(TAG, "got latitude array");
double getlat=intent.getDoubleExtra("geoLat", 0.0);
double getlng=intent.getDoubleExtra("geoLng", 0.0);
Log.v(TAG, "got location");
for(int i=0;i<20;i ) {
distance[i]=gps2m((float)getlat, (float)getlng, (float)latitude[i], (float)longitude[i]);
}
return distance;
}
и gps2m равен
private static double gps2m(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);
Log.v(TAG, "returning distance");
return 6366000*tt;
}
}
и активность отображает расстояние следующим образом
public class CalculateDistance extends Activity{
double Latitude;
private String tag="CalculateDistance";
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.distance_phone_no);
Intent intent= getIntent();
int value= intent.getIntExtra("clickedid",0);//item id when clicked on listview
Log.v(tag, "" value);
double latitude[]=GetLatAndLng.getDistance();
Log.v(tag, "got distanc array");
for(int i=0;i<20;i )
if(i==value)
Latitude=latitude[i];
TextView tv=(TextView)findViewById(R.id.text11);
tv.setText("" Latitude);
}
}
это выдает исключение NullPointer в строке, которая вызывает это, цикл for в методе getDistance для вычисления расстояния.
Помогите мне, где что-то идет не так? Или любой другой метод для вычисления расстояния… Мне нужна помощь!!! Заранее спасибо!!!
Комментарии:
1. как это может
intent.getDoubleArrayExtra
сработать, еслиintent = new Intent()
??2. Возможно, вы также захотите взглянуть на статический
Location.distanceBetween
метод. Не нужно заново изобретать колесо. 🙂3. ооо!! хорошая мысль @Sherif!! меняем его на GetIntent();
4. @ MH можете ли вы дать мне некоторую идею для метода distanceto или distancebetween
Ответ №1:
вот настраиваемый фрагмент, надеюсь, это поможет
import static java.lang.Math.acos;
import static java.lang.Math.cos;
import static java.lang.Math.sin;
import static java.lang.Math.toRadians;
public static long getDistanceMeters(double lat1, double lng1, double lat2, double lng2) {
double l1 = toRadians(lat1);
double l2 = toRadians(lat2);
double g1 = toRadians(lng1);
double g2 = toRadians(lng2);
double dist = acos(sin(l1) * sin(l2) cos(l1) * cos(l2) * cos(g1 - g2));
if(dist < 0) {
dist = dist Math.PI;
}
return Math.round(dist * 6378100);
}