2017-05-31 52 views
2

我試圖計算Google地圖上兩個位置之間的距離。我從EditText, 輸入緯度和經度,但返回值爲零米。代碼中出現了什麼問題,即如何獲得真正的距離?通過輸入緯度和經度計算兩個位置之間的距離EditText

這裏是我的應用程序的圖片:

enter image description here

public class Ma`inActivity extends AppCompatActivity implements OnMapReadyCallback { 
private TextView source; 
private TextView destination; 
private EditText sLatitude1; 
private EditText sLongtiude1; 
private EditText dLatitude2; 
private EditText dLongtiude2; 
private Button button; 

private GoogleMap mMap; 
boolean mapReady = false; 
MarkerOptions elsedaway; 
MarkerOptions Elrob3; 
Location location; 



static final CameraPosition elfayoum = CameraPosition.builder() 
     .target(new LatLng(29.309324, 30.842973)) 
     .zoom(1) 
     .bearing(6) 
     .tilt(45) 
     .build(); 
double lati1; 
double longi1; 
double lati2; 
double longi2; 
TextView textView; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // find text that display distance 
    textView = (TextView) findViewById(R.id.distance); 
    MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map); 
    mapFragment.getMapAsync(this); 
    // find edit text and text view 
    source = (TextView) findViewById(R.id.sourc); 
    destination = (TextView) findViewById(R.id.destination); 
    sLatitude1 = (EditText) findViewById(R.id.lat1); 
    sLongtiude1 = (EditText) findViewById(R.id.long1); 
    dLatitude2 = (EditText) findViewById(R.id.lat2); 
    dLongtiude2 = (EditText) findViewById(R.id.long2); 
    // find button 
    button = (Button) findViewById(R.id.getDistance); 
    // find string from edittext 
    String lat1 = sLatitude1.getText().toString(); 
    // parse string to double 
    lati1 = ParseDouble(lat1); 
    String lon1 = sLongtiude1.getText().toString(); 
    longi1 = ParseDouble(lon1); 
    String lat2 = dLatitude2.getText().toString(); 
    lati2 = ParseDouble(lat2); 
    String lon2 = dLongtiude2.getText().toString(); 
    longi2 = ParseDouble(lon2); 
    Log.i("**lat", lat2); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      double xy1 = distanceBetween(new LatLng(lati1, longi1), new LatLng(lati1, longi2)); 
      String distanceis = fmt(xy1) + "meter"; 
      textView.setText(distanceis); 
     } 

    }); 


} 

// mehtod to parse double from string 

double ParseDouble(String strNumber) { 
    if (strNumber != null && strNumber.length() > 0) { 
     try { 
      return Double.parseDouble(strNumber); 
     } catch (Exception e) { 
      return -1; // or some value to mark this field is wrong. or make a function validates field first ... 
     } 
    } else return 0; 
} 

// get distance 
public static Double distanceBetween(LatLng point1, LatLng point2) { 
    if (point1 == null || point2 == null) { 
     return null; 
    } 
    double vw = SphericalUtil.computeDistanceBetween(point1, point2); 
    Log.i("distance isby utillib ", String.valueOf(vw)); 
    return vw; 
} 

public String fmt(double d) { 

    return String.format("%s", d); 
} 

@Override 
public void onMapReady(GoogleMap googleMap) { 
    mapReady = true; 
    mMap = googleMap; 
    // if(elsedaway!=null){ 
    // mMap.addMarker(elsedaway);}; 
    //  mMap.addMarker(Elrob3); 

mMap.addPolyline(new PolylineOptions().geodesic(true) 
        .add(new LatLng(lati1, longi1)) 
        .add(new LatLng(lati2, lati2)) 
      mMap.addCircle(new CircleOptions() 
        .center(new LatLng(29.291540, 30.601884)) 
        .radius(500044) 
        .strokeColor(Color.GREEN) 
        .fillColor(Color.argb(54, 99, 255, 0))); 
    flyTo(elfayoum); 
} 
+0

有2方法請看:distanceBetween和distanceTo上https://developer.android.com/reference/android/location/Location.html –

回答

2

移動該出拳的代碼到你的onClick,並改正你的價值觀,你的代碼應該是這樣的:

button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
    String lat1 = sLatitude1.getText().toString(); 
    // parse string to double 
    lati1 = ParseDouble(lat1); 
    String lon1 = sLongtiude1.getText().toString(); 
    longi1 = ParseDouble(lon1); 
    String lat2 = dLatitude2.getText().toString(); 
    lati2 = ParseDouble(lat2); 
    String lon2 = dLongtiude2.getText().toString(); 
    longi2 = ParseDouble(lon2); 
      double xy1 = distanceBetween(new LatLng(lati1, longi1), new LatLng(lati2, longi2)); 
      String distanceis = fmt(xy1) + "meter"; 
      textView.setText(distanceis); 
     } 

    }); 
+0

感謝它完成 - 另一個問題 - 我需要添加標記選項的位置,我得到它 和這個我的代碼,但應用程序崩潰 ------ -------------------------------------------------- - elsedaway = new MarkerOptions()。position(new LatLng(lati1,longi1)) .title(「place」)。icon(BitmapDescriptorFactory.fromResource(R.drawable.bubble_mask)); 我把它放在onClick 可以給我一些幫助 – mohammedragabmohammedborik

+0

@mohammedragabmohammedborik最好問問新問題的新問題,你可以提及我,如果我的回答也幫助你,你可以接受它:) – Ibrahim

+0

我接受你的答案:( \t 感謝它完成 - 另一個問題 - 我需要添加標記選項的位置,我得到它,這是我的代碼,但應用程序崩潰------------- --------------------------------------------- elsedaway = new MarkerOptions( ).position(new LatLng(lati1,longi1)).title(「place」)。icon(BitmapDescriptorFactory.fromResource(R. drawable.bubble_mask));我把它放在onClick上可以給我一些幫助 – mohammedragabmohammedborik

1

對於初學者來說,這裏有一個錯誤:

double xy1 = distanceBetween(new LatLng(lati1, longi1), new LatLng(lati1, longi2)); 

您應當使用lati2代替lati1你第二個論點。

並且還將getText()移動到onClick(...)塊內。

button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) 
      { 
       // find string from edittext 
       String lat1 = sLatitude1.getText().toString(); 
       // parse string to double 
       lati1 = ParseDouble(lat1); 
       String lon1 = sLongtiude1.getText().toString(); 
       longi1 = ParseDouble(lon1); 
       String lat2 = dLatitude2.getText().toString(); 
       lati2 = ParseDouble(lat2); 
       String lon2 = dLongtiude2.getText().toString(); 
       longi2 = ParseDouble(lon2); 

       ... 
      } 
     }); 
+0

我改變它給我相同的距離保持距離零 – mohammedragabmohammedborik

+0

還要在'onClick'中移動'getText()'。看我的編輯。 –

+0

感謝它完成 - 另一個問題 - 我需要添加標記選項的位置,我得到它 和這個我的代碼,但應用程序崩潰 ------------------ ---------------------------------------- elsedaway = new MarkerOptions()。position( new LatLng(lati1,longi1)) .title(「place」)。icon(BitmapDescriptorFactory.fromResource(R.drawable.bubble_mask)); 我把它放在onClick 可以給我一些幫助 – mohammedragabmohammedborik

3

link可能會幫助您找到2個LAT長點之間的距離。

Here是hasrsine公式的java實現。

希望這可以幫助

相關問題