谷歌方向API:在安卓上获取当前位置的当前步骤JSON对象

3

我正在使用谷歌的Directions API。 现在我想确定用户当前位置的当前步骤。

这里是谷歌网站上的一个例子:

{
  "status": "OK",
  "geocoded_waypoints" : [
     {
        "geocoder_status" : "OK",
        "place_id" : "ChIJ7cv00DwsDogRAMDACa2m4K8",
        "types" : [ "locality", "political" ]
     },
     {
        "geocoder_status" : "OK",
        "place_id" : "ChIJ69Pk6jdlyIcRDqM1KDY3Fpg",
        "types" : [ "locality", "political" ]
     },
     {
        "geocoder_status" : "OK",
        "place_id" : "ChIJgdL4flSKrYcRnTpP0XQSojM",
        "types" : [ "locality", "political" ]
     },
     {
        "geocoder_status" : "OK",
        "place_id" : "ChIJE9on3F3HwoAR9AhGJW_fL-I",
        "types" : [ "locality", "political" ]
     }
  ],
  "routes": [ {
    "summary": "I-40 W",
    "legs": [ {
      "steps": [ {
        "travel_mode": "DRIVING",
        "start_location": {
          "lat": 41.8507300,
          "lng": -87.6512600
        },
        "end_location": {
          "lat": 41.8525800,
          "lng": -87.6514100
        },
        "polyline": {
          "points": "a~l~Fjk~uOwHJy@P"
        },
        "duration": {
          "value": 19,
          "text": "1 min"
        },
        "html_instructions": "Head \u003cb\u003enorth\u003c/b\u003e on \u003cb\u003eS
        Morgan St\u003c/b\u003e toward \u003cb\u003eW Cermak Rd\u003c/b\u003e",
        "distance": {
          "value": 207,
          "text": "0.1 mi"
        }
      },
      ...
      ... additional steps of this leg
    ...
    ... additional legs of this route
      "duration": {
        "value": 74384,
        "text": "20 hours 40 mins"
      },
      "distance": {
        "value": 2137146,
        "text": "1,328 mi"
      },
      "start_location": {
        "lat": 35.4675602,
        "lng": -97.5164276
      },
      "end_location": {
        "lat": 34.0522342,
        "lng": -118.2436849
      },
      "start_address": "Oklahoma City, OK, USA",
      "end_address": "Los Angeles, CA, USA"
    } ],
    "copyrights": "Map data ©2010 Google, Sanborn",
    "overview_polyline": {
      "points": "a~l~Fjk~uOnzh@vlbBtc~@tsE`vnApw{A`dw@~w\\|tNtqf@l{Yd_Fblh@rxo@b}@xxSfytA
      blk@xxaBeJxlcBb~t@zbh@jc|Bx}C`rv@rw|@rlhA~dVzeo@vrSnc}Axf]fjz@xfFbw~@dz{A~d{A|zOxbrBbdUvpo@`
      cFp~xBc`Hk@nurDznmFfwMbwz@bbl@lq~@loPpxq@bw_@v|{CbtY~jGqeMb{iF|n\\~mbDzeVh_Wr|Efc\\x`Ij{kE}mAb
      ~uF{cNd}xBjp]fulBiwJpgg@|kHntyArpb@bijCk_Kv~eGyqTj_|@`uV`k|DcsNdwxAott@r}q@_gc@nu`CnvHx`k@dse
      @j|p@zpiAp|gEicy@`omFvaErfo@igQxnlApqGze~AsyRzrjAb__@ftyB}pIlo_BflmA~yQftNboWzoAlzp@mz`@|}_
      @fda@jakEitAn{fB_a]lexClshBtmqAdmY_hLxiZd~XtaBndgC"
    },
    "warnings": [ ],
    "waypoint_order": [ 0, 1 ],
    "bounds": {
      "southwest": {
        "lat": 34.0523600,
        "lng": -118.2435600
      },
      "northeast": {
        "lat": 41.8781100,
        "lng": -87.6297900
      }
    }
  } ]
}

我以为可以使用 start_location 字段来确定当前位置和 start_location 之间的距离,但我想这是错误的。 有人有有效的解决方法吗? 任何帮助都将不胜感激。

1个回答

4
你需要解码"polyline"部分中的"points"标签(来自文档:

polyline包含一个单一的points对象,它保存了该步骤的编码折线表示。这条折线是该步骤的近似(平滑)路径。

有关Google Maps中折线编码的更多信息,例如可以在此处找到),从"legs"数组中的每个步骤和线路中获取。
"legs": [ {
  "steps": [ {
    ...
    "polyline": {
      "points": "a~l~Fjk~uOwHJy@P"         <--- need to decode this string
    },
    ...
  } ]
}]

例如,通过 Maps SDK for Android Utility Library 中的 PolyUtil.decode() 方法,您可以获取每个步骤的 LatLngs 序列。接下来,您需要创建一个循环遍历所有步骤,并通过调用PolyUtil.isLocationOnPath() 方法查找包含当前位置坐标点的步骤。类似于以下内容:

JSONObject jsonObject = new JSONObject(jsonStringBuilder.toString());
JSONArray legsArr = jsonObject.getJSONArray("legs");

// for each leg
for (int i = 0; i < legsArr.length(); i++) {
    // get array of steps
    JSONArray stepsArr = legsArr.getJSONObject(i).getJSONArray("steps");
    // for each step
    for (int j = 0; j < stepsArr.length(); j++) {
        // get step
        JSONObject step = stepsArr.getJSONObject(j);
        JSONObject polyline = step.getJSONObject("polyline");
        String encodedPoints = polyline.getString("points");
        // decode encoded path to list of points LatLng
        List<LatLng> decodedPoints = PolyUtil.decode(encodedPoints);
        if (PolyUtil.isLocationOnPath(currentLocation, decodedPoints, true, 100)) {
            // your currentLocation is on the step of route
            // constant 100 - is tolerance in meters
        }
    }
 }

如果你需要确定当前位置所在的确切段落,而不是整个步骤,你需要通过循环遍历步骤中的所有段落:

...
// decode encoded path to list of points LatLng
List<LatLng> decodedPoints = PolyUtil.decode(encodedPoints);
List<LatLng> segment = new ArrayList(2);
for (int k = 0; k < decodedPoints.size() - 1; k++) {
     segment.clear();
     segment.add(decodedPoints.get(k));
     segment.add(decodedPoints.get(k+1));
     if (PolyUtil.isLocationOnPath(currentLocation, segment, true, 100)) {
           // your currentLocation is on the segment of step
     }
}

注意!这只是一种方法描述,而不是完全的可用代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接