【问题标题】:How to use Google Maps Distance Matrix JAVA API to obtain closest distance between source and multiple destinations如何使用谷歌地图距离矩阵 JAVA API 获取源和多个目的地之间的最近距离
【发布时间】:2016-11-12 09:04:41
【问题描述】:

我在我的 Java 项目中添加了 Google Maps API Java Client 的依赖项。我有一组起始距离、目的地距离以及 GeoApiContext 等:

GeoApiContext context = new GeoApiContext().setApiKey(MY_API_KEY);
String[] destinationAddress = {"40.7127837,-74.0059413", "33.9533487,-117.3961564", "38.6270025,-90.19940419999999"};
String[] originAddress = {"12.8445,80.1523"};

我想获得这些点之间的(飞机?)距离。我知道我们可以发送一个简单的 HTTP 请求,例如
https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=40.6655101,-73.89188969999998&destinations=40.690515%73.6334271&key=YOUR_API_KEY
但我想使用 JAVA Google Maps API。我试图做DistanceMatrixApiRequest s = DistanceMatrixApi.getDistanceMatrix(context, originAddress, destinationAddress); 但没有getArrivalTimesgetDistanceMatrix 或无论如何发送请求。我很困扰。请帮忙。谢谢

【问题讨论】:

  • 距离矩阵不返回直线(“如乌鸦飞翔”,大圆圈)距离,因为那些使用Haversine公式。
  • 是的,谢谢,不久前我意识到并编写了代码。但是,我是如何得到的,比如从这些地方开车的距离。 API 让我很困惑
  • edit你的问题请澄清一下。
  • 如何使用 JAVA API?所以我写了哪几行代码来取回一个距离矩阵?

标签: java google-maps google-distancematrix-api


【解决方案1】:

试试这个:

private static final String API_KEY = "YOUR_API_KEY";
private static final GeoApiContext context = new GeoApiContext().setApiKey(API_KEY);


public DistanceMatrix estimateRouteTime(DateTime time, Boolean isForCalculateArrivalTime, DirectionsApi.RouteRestriction routeRestriction, LatLng departure, LatLng... arrivals) {
    try {
        DistanceMatrixApiRequest req = DistanceMatrixApi.newRequest(context);
        if (isForCalculateArrivalTime) {
            req.departureTime(time);
        } else {
            req.arrivalTime(time);
        }
        if (routeRestriction == null) {
            routeRestriction = DirectionsApi.RouteRestriction.TOLLS;
        }
        DistanceMatrix trix = req.origins(departure)
                .destinations(arrivals)
                .mode(TravelMode.DRIVING)
                .avoid(routeRestriction)
                .language("fr-FR")
                .await();
        return trix;

    } catch (ApiException e) {
        System.out.println(e.getMessage());
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
    return null;
}

DistanceMatrix 响应对象是这样的:

{
   "destination_addresses" : [ "San Francisco, Californie, États-Unis" ],
   "origin_addresses" : [ "Seattle, Washington, États-Unis" ],
   "rows" : [
      {
         "elements" : [
            {
               "distance" : {
                  "text" : "1 300 km",
                  "value" : 1299878
               },
               "duration" : {
                  "text" : "12 heures 32 minutes",
                  "value" : 45146
               },
               "status" : "OK"
            }
         ]
      }
   ],
   "status" : "OK"
}

【讨论】:

    【解决方案2】:

    这是关于如何使用谷歌距离矩阵 api 计算两个地方之间的距离和时间的完整答案。 如果你没有使用 maven,那么你必须在你的类路径中设置这些 jars

    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>
    

    这是一个发送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,所以这是我的 Controller 获取数据的方法

    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();
    }
    

    【讨论】:

      【解决方案3】:

      代码截图如下:

      GeoApiContext context = new GeoApiContext().setApiKey(MY_API_KEY).setQueryRateLimit(QPS);
          try {
              DistanceMatrixApiRequest req = DistanceMatrixApi.newRequest(context); 
              DistanceMatrix trix = req.origins("Vancouver BC","Seattle")
                      .destinations("San Francisco","Victoria BC")
                      .mode(TravelMode.DRIVING)
                      .avoid(RouteRestriction.HIGHWAYS)
                      .language("fr-FR")
                      .await();
              //Do something with result here
              // ....
          } catch(ApiException e){
              output += this.printError(e);
          } catch(Exception e){
              System.out.println(e.getMessage());
          }   
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-11
        • 1970-01-01
        • 2011-09-21
        • 2014-08-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多