谷歌地图静态地图折线穿过湖泊,河流,山脉

我的程序使用谷歌地图的Web服务指示来查找两点之间的路线。 结果被解析并存储在变量中。
然后,此变量用于撰写Google静态地图url。

解析和URL正常工作。 问题是绘制的“路线”穿过湖泊和山脉。

{ String GPS = "-22.978823,-43.233249"; String link = MAPS_BASE_URL + "center=brazil," + GPS + "&markers=color:blue|brazil," + GPS + "&path=color:0xff0000ff" + "%s" + "&zoom=13&size=1024x1024&sensor=false"; String htmlContent = ""; String direction_URL= ""; URL url = null; String parsedStr = null; Scanner scan = null; origin = GPS; destination ="Maracanã"; try { direction_URL = MAPS_DIRECTIONS_URL; direction_URL += URLEncoder.encode(origin, "UTF-8"); direction_URL += "&destination="; direction_URL += URLEncoder.encode(destination, "UTF-8"); direction_URL += "&key=AIzaSyARNFl6ns__p2OEy3uCrZMGem8KW8pXwAI"; }catch(UnsupportedEncodingException e){ Logger.getLogger(Service.class.getName()).log(Level.SEVERE, null, e); } try { url = new URL(direction_URL); } catch (MalformedURLException ex) { Logger.getLogger(AlertService.class.getName()).log(Level.SEVERE, null, ex); } try { scan = new Scanner(url.openStream()); } catch (IOException ex) { Logger.getLogger(AlertService.class.getName()).log(Level.SEVERE, null, ex); } String str = new String(); while (scan.hasNext()) str += scan.nextLine(); scan.close(); parsedStr = parseJson(str); try { InputStream htmlInputStream = AlertService.class.getResourceAsStream("/resources/gapi.html"); BufferedReader htmlReader = new BufferedReader( new InputStreamReader(htmlInputStream)); String locationsContent = ""; String wilcardContent = ""; Scanner strScanner = new Scanner(parsedStr); while (strScanner.hasNextLine()) { locationsContent = strScanner.nextLine() + "\n"; StringTokenizer st = new StringTokenizer(locationsContent, ";"); if (st.countTokens() == 2) wilcardContent += "|" + st.nextToken().trim() + "," + st.nextToken().trim(); } link = link.replaceFirst("%s", wilcardContent); htmlContent = ""; while (htmlReader.ready()) htmlContent += htmlReader.readLine() + "\n"; htmlContent = htmlContent.replaceAll("%s", link); } catch (FileNotFoundException ex) { Logger.getLogger(Service.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(Service.class.getName()).log(Level.SEVERE, null, ex); } return htmlContent; } 

解析function:

  private String parseJson(String s){ String coordinates = new String (); final JSONObject json = new JSONObject(s); final JSONObject jsonRoute = json.getJSONArray("routes").getJSONObject(0); //Get the leg, only one leg as we don't support waypoints final JSONObject leg = jsonRoute.getJSONArray("legs").getJSONObject(0); //Get the steps for this leg final JSONArray steps = leg.getJSONArray("steps"); //Number of steps for use in for loop final int numSteps = steps.length(); for(int i = 0; i< numSteps; ++i){ final JSONObject step = steps.getJSONObject(i); final JSONObject startLocation = step.getJSONObject("start_location"); final Double startLat = startLocation.getDouble("lat"); final Double startlng = startLocation.getDouble("lng"); final JSONObject endLocation = step.getJSONObject("end_location"); final Double endtLat = endLocation.getDouble("lat"); final Double endtlng = endLocation.getDouble("lng"); coordinates = coordinates.concat(" "); coordinates = coordinates.concat(startLat.toString()); coordinates = coordinates.concat(";" + " "); coordinates = coordinates.concat(startlng.toString()); coordinates = coordinates.concat("\n"); coordinates = coordinates.concat(" "); coordinates = coordinates.concat(endtLat.toString()); coordinates = coordinates.concat(";" + " "); coordinates = coordinates.concat(endtlng.toString()); coordinates = coordinates.concat("\n"); } return coordinates; } 

Json的回应:

https://maps.googleapis.com/maps/api/directions/json?origin=-22.978823,-43.233249&destination=Maracan%C3%A2&key=AIzaSyARNFl6ns__p2OEy3uCrZMGem8KW8pXwAI

最终URL如下所示:

HTTP://maps.google.com/maps/api/staticmap中心=巴西,-22.978823,-43.233249&标记=颜色:蓝|巴西,-22.978823,-43.233249&路径=颜色:0xff0000ff | -22.9783362,-43.2336781 | -22.9772355,-43.23076390000001 | -22.9772355,-43.23076390000001 | -22.9789792,-43.2300162 | -22.9789792,-43.2300162 | -22.9790772,-43.23036 | -22.9790772,-43.23036 | -22.9786979,-43.22698949999999 | -22.9786979,-43.22698949999999 | -22.9771399 ,-43.2196208 | -22.9771399,-43.2196208 | -22.9624962,-43.20396840000001 | -22.9624962,-43.20396840000001 | -22.9583858,-43.2043807 | -22.9583858,-43.2043807 | -22.934896,-43.2094454 | -22.934896,-43.2094454 | -22.9333061, – 43.2096873 | -22.9333061,-43.2096873 | -22.913577,-43.2099889 | -22.913577,-43.2099889 | -22.9106681,-43.2154625 | -22.9106681,-43.2154625 | -22.9101261,-43.2217923 | -22.9101261,-43.2217923 | -22.9114561,-43.2254838 | -22.9114561,-43.2254838 | -22.9135546,-43.2276606&变焦= 13&大小= 1024×1024&传感器=假

您需要在每个步骤的起点和终点之间包含折线路径(它是编码的折线)。

从Web服务响应方向 :

  "steps" : [ { "distance" : { "text" : "0.3 km", "value" : 335 }, "duration" : { "text" : "1 min", "value" : 52 }, "end_location" : { "lat" : -22.9772355, "lng" : -43.23076390000001 }, "html_instructions" : "Head \u003cb\u003enortheast\u003c/b\u003e on \u003cb\u003eR. Marquês de São Vicente\u003c/b\u003e", "polyline" : { "points" : "r}fkCna{fGyBaDMSMSOUMUCMAOOgAEe@Co@?o@?YAWEk@?G" }, "start_location" : { "lat" : -22.9783362, "lng" : -43.2336781 }, "travel_mode" : "DRIVING" }, // ... 

包括所有步骤折线(和编码折线)对我有用

jsfiddle从Web服务响应创建静态映射的URL

我想出了如何在java中解决它。我改编了用户geocozip javascript代码。 就我而言,由于没有提供任何航点,我只需要一条腿。 所以我的解析函数得到了这个:

  List path = new ArrayList(); for(int j = 0; j< numSteps; ++j){ final JSONObject step = steps.getJSONObject(j); final JSONObject polyline = step.getJSONObject("polyline"); final String polylinePoint = polyline.getString("points"); List coordinates = decodePath(polylinePoint); for( int k = 0; k < coordinates.size(); ++k){ path.add(coordinates.get(k)); } } 

还需要重新编码然后放入可读的格式URL。

 String newPath = path.createPolyLine(encodedPath); String locationsContent=""; locationsContent = URLEncoder.encode(newPath, "UTF-8") .replaceAll("\\%40", "@") .replaceAll("\\+", "%20") .replaceAll("\\%21", "!") .replaceAll("\\%27", "'") .replaceAll("\\%28", "(") .replaceAll("\\%29", ")"); 
Interesting Posts