33

2つの場所の間の距離を取得する必要がありますが、写真の青い線のような距離を取得する必要があります. 画像

私は次に試します:

public double getDistance(LatLng LatLng1, LatLng LatLng2) {
    double distance = 0;
    Location locationA = new Location("A");
    locationA.setLatitude(LatLng1.latitude);
    locationA.setLongitude(LatLng1.longitude);
    Location locationB = new Location("B");
    locationB.setLatitude(LatLng2.latitude);
    locationB.setLongitude(LatLng2.longitude);
    distance = locationA.distanceTo(locationB);

    return distance;
}

しかし、私は赤い線の距離を取得します。

4

10 に答える 10

32

Google Maps Directions APIを使用します。HTTP 経由でルート案内をリクエストする必要があります。これは、Android から直接行うことも、独自のサーバーを介して行うこともできます。

たとえば、モントリオールからトロントへの道順:

GET http://maps.googleapis.com/maps/api/directions/json?origin=Toronto&destination=Montreal&sensor=false

最終的に JSON が得られます。ではroutes[].legs[].distance、次のようなオブジェクトを取得します。

     "legs" : [
        {
           "distance" : {
              "text" : "542 km",
              "value" : 542389
           },

応答オブジェクトからポリライン情報を直接取得することもできます。

于 2013-08-19T11:09:43.777 に答える
12

Chris Broadfoot が正しいので、返された JSON を解析するにはroutes[].legs[].distance

"legs" : [
        {
           "distance" : {
              "text" : "542 km",
              "value" : 542389
           }

使用する:

    final JSONObject json = new JSONObject(result);
    JSONArray routeArray = json.getJSONArray("routes");
    JSONObject routes = routeArray.getJSONObject(0);

    JSONArray newTempARr = routes.getJSONArray("legs");
    JSONObject newDisTimeOb = newTempARr.getJSONObject(0);

    JSONObject distOb = newDisTimeOb.getJSONObject("distance");
    JSONObject timeOb = newDisTimeOb.getJSONObject("duration");

    Log.i("Diatance :", distOb.getString("text"));
    Log.i("Time :", timeOb.getString("text"));
于 2013-08-19T09:40:02.150 に答える
4
public String getDistance(final double lat1, final double lon1, final double lat2, final double lon2){
    String parsedDistance;
    String response;

    Thread thread=new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          URL url = new URL("http://maps.googleapis.com/maps/api/directions/json?origin=" + lat1 + "," + lon1 + "&destination=" + lat2 + "," + lon2 + "&sensor=false&units=metric&mode=driving");
          final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
          conn.setRequestMethod("POST");
          InputStream in = new BufferedInputStream(conn.getInputStream());
          response = org.apache.commons.io.IOUtils.toString(in, "UTF-8");

          JSONObject jsonObject = new JSONObject(response);
          JSONArray array = jsonObject.getJSONArray("routes");
          JSONObject routes = array.getJSONObject(0);
          JSONArray legs = routes.getJSONArray("legs");
          JSONObject steps = legs.getJSONObject(0);
          JSONObject distance = steps.getJSONObject("distance");
          parsedDistance=distance.getString("text");
        } catch (ProtocolException e) {
          e.printStackTrace();
        } catch (MalformedURLException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
        } catch (JSONException e) {
          e.printStackTrace();
        }
      }
    });

    thread.start();

    try {
      thread.join();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

    return parsedDistance;
}
于 2017-04-06T15:03:15.347 に答える
0

これを試して:

private double calculateDistance(double fromLong, double fromLat,
            double toLong, double toLat) {
        double d2r = Math.PI / 180;
        double dLong = (toLong - fromLong) * d2r;
        double dLat = (toLat - fromLat) * d2r;
        double a = Math.pow(Math.sin(dLat / 2.0), 2) + Math.cos(fromLat * d2r)
                * Math.cos(toLat * d2r) * Math.pow(Math.sin(dLong / 2.0), 2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        double d = 6367000 * c;
        return Math.round(d);
    }

お役に立てれば。

于 2013-08-19T09:17:29.980 に答える
-1

このコードを試してください

public double CalculationByDistance(LatLng StartP, LatLng EndP) {
    int Radius = 6371;// radius of earth in Km
    double lat1 = StartP.latitude;
    double lat2 = EndP.latitude;
    double lon1 = StartP.longitude;
    double lon2 = EndP.longitude;
    double dLat = Math.toRadians(lat2 - lat1);
    double dLon = Math.toRadians(lon2 - lon1);
    double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
            + Math.cos(Math.toRadians(lat1))
            * Math.cos(Math.toRadians(lat2)) * Math.sin(dLon / 2)
            * Math.sin(dLon / 2);
    double c = 2 * Math.asin(Math.sqrt(a));
    double valueResult = Radius * c;
    double km = valueResult / 1;
    DecimalFormat newFormat = new DecimalFormat("####");
    int kmInDec = Integer.valueOf(newFormat.format(km));
    double meter = valueResult % 1000;
    int meterInDec = Integer.valueOf(newFormat.format(meter));
    Log.i("Radius Value", "" + valueResult + "   KM  " + kmInDec
            + " Meter   " + meterInDec);

    return Radius * c;
}
于 2015-06-01T00:22:04.977 に答える
-1
private String getDistance(double lat2, double lon2){
    Location loc1 = new Location("A");
    loc1.setLatitude("A1");
    loc1.setLongitude("B1");
    Location loc2 = new Location("B");
    loc2.setLatitude(lat2);
    loc2.setLongitude(lon2);
    float distanceInMeters = loc1.distanceTo(loc2);
    float mile = distanceInMeters / 1609.34f;
    String sm = String.format("%.2f", mile);
    return sm;
}
于 2016-04-12T12:35:48.747 に答える
-4

2 地点間の距離を求めるには:

  1. アプリを初めて開いたら、左上のドロップメニューから「あなたのタイムライン」に移動します。

  2. 新しいウィンドウが開いたら、右上のメニューの設定から選択し、[場所を追加] を選択します。

  3. 場所を追加して、ポイント 1、ポイント 2、または覚えやすい名前を付けます。

  4. 場所を追加してフラグを立てたら、Google アプリのメイン ウィンドウに戻ります。

  5. 右下にある矢印の付いた青い円をクリックします。

  6. 新しいウィンドウが開き、上部に "from location" と "distance location" を追加できる 2 つのテキスト フィールドがあることがわかります。

  7. 任意のテキスト フィールドをクリックし、保存した場所をポイント 3 に入力します。

  8. 他のテキスト フィールドをクリックして、次に保存する場所を追加します。

  9. そうすることで、Google マップは 2 つの場所の間の距離を計算し、地図上に青いパスを表示します。

于 2016-05-05T04:19:02.163 に答える