如何从 google 距离矩阵 Api 在 Java 中获取距离

How to get distance from google distance matrix Api in Java

我正在尝试使用 google 距离矩阵 api 查找两地之间的距离和时间 在我得到这个数据之前一切都很好

{
   "destination_addresses" : [
      "Some Address"
   ],
   "origin_addresses" : [ "Some other address" ],
   "rows" : [
      {
         "elements" : [
            {
               "distance" : {
                  "text" : "13.1 km",
                  "value" : 13133
               },
               "duration" : {
                  "text" : "33 mins",
                  "value" : 1961
               },
               "status" : "OK"
            }
         ]
      }
   ],
   "status" : "OK"
}

我尝试使用 Json 库提取距离并尝试了很多答案,但没有得到预期的结果,有什么帮助吗??

如果您想解析 json,您可以使用 Java 中的 json 库,例如 Jackson,Gson Json simple。 第二种方式(我会推荐)你可以根据 json 来自 API 的请求和响应创建你自己的 Java 请求和响应 bean,并在 http 请求中使用它们,你可以从中找到完整的例子here

package com.apartmentnotification.client;

import com.apartmentnotification.model.DirectionResponse;
import java.io.IOException;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.WebTarget;

public class ApartmentClient {

private static final String BASE_URI = "https://maps.googleapis.com/maps/api";
private static final String API_KEY = "AIzaSyCXnwOwrv_Kt7bkbO5vXtpPelu08yp-3iY";

/**
 * end point for read distanceMatrix
 */
private WebTarget distanceMatrix;

public ApartmentClient() {
    Client client = LazySingleton.getClient();
    distanceMatrix = client.target(BASE_URI + "/distancematrix");

}

public DirectionResponse getDirectionInfo(String origins, String destionations) throws IOException {
    return distanceMatrix.path("/json")
            .queryParam("units", "imperial")
            .queryParam("origins", origins)
            .queryParam("destinations", destionations)
            .queryParam("key", API_KEY)
            .request()
            .get()
            .readEntity(DirectionResponse.class);
}

public static void main(String[] args) throws IOException {
    ApartmentClient wc = new ApartmentClient();
    DirectionResponse direction = wc.getDirectionInfo("Vaidavas 6/3", "Domina Shopping");
    System.out.println("Duration in hours :"+direction.getRows().get(0).getElements().get(0).getDuration().getText());
    System.out.println("Distance  in metr : "+direction.getRows().get(0).getElements().get(0).getDistance().getValue());
}

}

希望对您有所帮助。

好吧,这是关于如何使用两个地方之间的 google 距离矩阵 api 计算距离和时间的完整答案。 如果您不使用 Maven,那么您必须在 classpath

中设置这些 jar

pom.xml

<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.9.0</version>
</dependency>
  <!-- https://mvnrepository.com/artifact/com.squareup.okio/okio -->
<dependency>
    <groupId>com.squareup.okio</groupId>
    <artifactId>okio</artifactId>
    <version>1.12.0</version>
</dependency>
  <!-- https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple -->
<dependency>
    <groupId>com.googlecode.json-simple</groupId>
    <artifactId>json-simple</artifactId>
    <version>1.1.1</version>
</dependency>

  <!-- https://mvnrepository.com/artifact/com.google.api-client/google-api-client -->
<dependency>
    <groupId>com.google.api-client</groupId>
    <artifactId>google-api-client</artifactId>
    <version>1.23.0</version>
</dependency>

这是一个class发送http请求并获取json格式的数据

 package google.distance.api;

import java.io.IOException;

import org.springframework.stereotype.Component;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

@Component
public class DistanceTime {



    private static final String API_KEY="YOUR KEY";
    OkHttpClient client = new OkHttpClient();


public String calculate(String source ,String destination) throws IOException {
String url="https://maps.googleapis.com/maps/api/distancematrix/json?origins="+source+"&destinations="+destination+"&key="+ API_KEY;
            Request request = new Request.Builder()
                .url(url)
                .build();

            Response response = client.newCall(request).execute();
            return response.body().string();
          }


}

因为我正在使用 Spring ,所以这里是我的控制器方法来获取数据

private DistanceTime distance;

     @Autowired
    public void setDistance(DistanceTime distance) {
    this.distance = distance;
}


    public ModelAndView Api(@RequestParam("picking_up") String source,@RequestParam("dropping_off") String destination,@RequestParam("pick_up_date") String time) {
            try {
                  //method of DistanceTime Class
                String response=distance.calculate(source,destination);

            System.out.println(response);
            }

            catch(Exception e) {
                System.out.println("Exception Occurred");
            }

            return new ModelAndView("home");

        }  

现在困难的部分正在迭代 JSON 数据以获得距离和时间 在上面的方法中,我在变量响应中得到 json 数据,所以这里是从中提取距离和时间的代码 响应类似于

{
   "destination_addresses" : [
      "Private"
   ],
   "origin_addresses" : [ "Private" ],
   "rows" : [
      {
         "elements" : [
            {
               "distance" : {
                  "text" : "1,052 km",
                  "value" : 1051911
               },
               "duration" : {
                  "text" : "17 hours 10 mins",
                  "value" : 61785
               },
               "status" : "OK"
            }
         ]
      }
   ],
   "status" : "OK"
}



 JSONParser parser = new JSONParser();
        try {

         Object obj = parser.parse(response);
         JSONObject jsonobj=(JSONObject)obj;

         JSONArray dist=(JSONArray)jsonobj.get("rows");
         JSONObject obj2 = (JSONObject)dist.get(0);
         JSONArray disting=(JSONArray)obj2.get("elements");
         JSONObject obj3 = (JSONObject)disting.get(0);
         JSONObject obj4=(JSONObject)obj3.get("distance");
         JSONObject obj5=(JSONObject)obj3.get("duration");
         System.out.println(obj4.get("text"));
         System.out.println(obj5.get("text"));

    }
catch(Exception e) {
    e.printStackTrace();
}