有什么方法可以在 google 方向 api 中获取从源到目的地的一系列地理点?
Is there any method to get a series of geopoints from source to destination in google directions api?
我想要的是获取从源到目的地的地理点,点之间的距离可以是1米。我认为多段线也是通过连接源和目标之间的地理点来制作的。我不知道的是我们可以得到这些地理点数吗?
确实,您可以在路线 API 中获取构成路线的 LatLng 列表。如果检查 documentation 的响应格式,您会看到每条路线中都有 legs[]
数组,轮流每条腿有 steps[]
数组,最后每一步都有 polyline
属性。根据文档
polyline contains a single points object that holds an encoded polyline representation of the step. This polyline is an approximate (smoothed) path of the step.
我们的想法是获得响应,将其解析为 JSON 对象并通过路段和步长为路线创建循环。您应该解码步骤的每条折线 属性 并将生成的 LatLng 添加到您的列表中。
解码折线有多种选择:
您可以按照encoded polyline文档
中描述的算法编写自己的解码函数
您可以使用 Google Maps Android API Utility Library,它具有 encode/decode 折线的实用函数
最后,您可以使用 Java client library for Google Maps Web services,它也实现了 encoded/decoded 折线算法。
Google 地图 Web 服务的 Java 客户端库可能是实现它的最简单方法。代码片段可能如下
//Define list to get all latlng for the route
List<LatLng> path = new ArrayList();
//Execute Directions API request
GeoApiContext context = new GeoApiContext.Builder()
.apiKey("YOUR_API_KEY")
.build();
DirectionsApiRequest req = DirectionsApi.getDirections(context, "41.385064,2.173403", "40.416775,-3.70379");
try {
DirectionsResult res = req.await();
//Loop through legs and steps to get encoded polylines of each step
if (res.routes != null && res.routes.length > 0) {
DirectionsRoute route = res.routes[0];
if (route.legs !=null) {
for(int i=0; i<route.legs.length; i++) {
DirectionsLeg leg = route.legs[i];
if (leg.steps != null) {
for (int j=0; j<leg.steps.length;j++){
DirectionsStep step = leg.steps[j];
if (step.steps != null && step.steps.length >0) {
for (int k=0; k<step.steps.length;k++){
DirectionsStep step1 = step.steps[k];
EncodedPolyline points1 = step1.polyline;
if (points1 != null) {
//Decode polyline and add points to list of route coordinates
List<com.google.maps.model.LatLng> coords1 = points1.decodePath();
for (com.google.maps.model.LatLng coord1 : coords1) {
path.add(new LatLng(coord1.lat, coord1.lng));
}
}
}
} else {
EncodedPolyline points = step.polyline;
if (points != null) {
//Decode polyline and add points to list of route coordinates
List<com.google.maps.model.LatLng> coords = points.decodePath();
for (com.google.maps.model.LatLng coord : coords) {
path.add(new LatLng(coord.lat, coord.lng));
}
}
}
}
}
}
}
}
} catch(Exception ex) {
Log.e(TAG, ex.getLocalizedMessage());
}
//Draw the polyline
if (path.size() > 0) {
PolylineOptions opts = new PolylineOptions().addAll(path).color(Color.BLUE).width(5);
mMap.addPolyline(opts);
}
您可以从 https://github.com/xomena-so/so47492459
下载完整的示例项目
别忘了用你的替换 API 键。
希望对您有所帮助!
我想要的是获取从源到目的地的地理点,点之间的距离可以是1米。我认为多段线也是通过连接源和目标之间的地理点来制作的。我不知道的是我们可以得到这些地理点数吗?
确实,您可以在路线 API 中获取构成路线的 LatLng 列表。如果检查 documentation 的响应格式,您会看到每条路线中都有 legs[]
数组,轮流每条腿有 steps[]
数组,最后每一步都有 polyline
属性。根据文档
polyline contains a single points object that holds an encoded polyline representation of the step. This polyline is an approximate (smoothed) path of the step.
我们的想法是获得响应,将其解析为 JSON 对象并通过路段和步长为路线创建循环。您应该解码步骤的每条折线 属性 并将生成的 LatLng 添加到您的列表中。
解码折线有多种选择:
您可以按照encoded polyline文档
中描述的算法编写自己的解码函数
您可以使用 Google Maps Android API Utility Library,它具有 encode/decode 折线的实用函数
最后,您可以使用 Java client library for Google Maps Web services,它也实现了 encoded/decoded 折线算法。
Google 地图 Web 服务的 Java 客户端库可能是实现它的最简单方法。代码片段可能如下
//Define list to get all latlng for the route
List<LatLng> path = new ArrayList();
//Execute Directions API request
GeoApiContext context = new GeoApiContext.Builder()
.apiKey("YOUR_API_KEY")
.build();
DirectionsApiRequest req = DirectionsApi.getDirections(context, "41.385064,2.173403", "40.416775,-3.70379");
try {
DirectionsResult res = req.await();
//Loop through legs and steps to get encoded polylines of each step
if (res.routes != null && res.routes.length > 0) {
DirectionsRoute route = res.routes[0];
if (route.legs !=null) {
for(int i=0; i<route.legs.length; i++) {
DirectionsLeg leg = route.legs[i];
if (leg.steps != null) {
for (int j=0; j<leg.steps.length;j++){
DirectionsStep step = leg.steps[j];
if (step.steps != null && step.steps.length >0) {
for (int k=0; k<step.steps.length;k++){
DirectionsStep step1 = step.steps[k];
EncodedPolyline points1 = step1.polyline;
if (points1 != null) {
//Decode polyline and add points to list of route coordinates
List<com.google.maps.model.LatLng> coords1 = points1.decodePath();
for (com.google.maps.model.LatLng coord1 : coords1) {
path.add(new LatLng(coord1.lat, coord1.lng));
}
}
}
} else {
EncodedPolyline points = step.polyline;
if (points != null) {
//Decode polyline and add points to list of route coordinates
List<com.google.maps.model.LatLng> coords = points.decodePath();
for (com.google.maps.model.LatLng coord : coords) {
path.add(new LatLng(coord.lat, coord.lng));
}
}
}
}
}
}
}
}
} catch(Exception ex) {
Log.e(TAG, ex.getLocalizedMessage());
}
//Draw the polyline
if (path.size() > 0) {
PolylineOptions opts = new PolylineOptions().addAll(path).color(Color.BLUE).width(5);
mMap.addPolyline(opts);
}
您可以从 https://github.com/xomena-so/so47492459
下载完整的示例项目别忘了用你的替换 API 键。
希望对您有所帮助!