PolyLine不在路上:它从一个点直接到另一个点

输出是我的地图包含多个点来点击用户的位置,他从那里通过polyLine没有在道路上显示,但显示从一个标记到另一个标记的直线我希望我的pollyline在道路转弯时穿过马路它也应该转向

dataholder = FirebaseDatabase.getInstance().getReference("UserLocation"); Log.d("onMapReady", "iam here"); dataholder.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { Log.d("data",String.valueOf(dataSnapshot.getValue())); System.out.println(dataSnapshot.getValue()); for (DataSnapshot a : dataSnapshot.getChildren()) { MapData mapData = a.getValue(MapData.class); arrayList.add(mapData); lati.add(arrayList.get(i).getLatituide()); longit.add(arrayList.get(i).getLongitude()); Log.d("mapi","i am in loop"); mMap = googleMap; Double lat = Double.parseDouble(lati.get(i)); Double longi = Double.parseDouble(longit.get(i)); sydney = new LatLng(longi, lat); points.add(sydney); MarkerOptions mop = new MarkerOptions(); mop.position(sydney); mop.title("check"); mMap.addMarker(mop); Log.d("latitude", String.valueOf(lat)); Log.d("longitude", String.valueOf(longi)); // Add a marker in Sydney and move the camera mMap.addMarker(new MarkerOptions().position(sydney).title("check")); mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); i++; } line.addAll(points).width(5).color(Color.RED); line.geodesic(true); mMap.addPolyline(line); mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { Toast.makeText(getApplicationContext(),marker.getTitle().toString(),Toast.LENGTH_LONG).show(); return false; } }); 

尝试使用Google Maps Roads API部分Snap to Road

返回给定GPS坐标集的最佳拟合道路几何。 该服务最多可以沿着路线收集100个GPS点,并返回一组类似的数据,其中的点被捕捉到车辆行驶的最可能的道路上。

Google Maps Roads API Snap to Road示例中的数据类似:

 public class MainActivity extends AppCompatActivity implements OnMapReadyCallback { private GoogleMap mGoogleMap; private MapFragment mapFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mapFragment = (MapFragment) getFragmentManager() .findFragmentById(R.id.map_fragment); mapFragment.getMapAsync(this); } @Override public void onMapReady(GoogleMap googleMap) { mGoogleMap = googleMap; List sourcePoints = new ArrayList<>(); sourcePoints.add(new LatLng(-35.27801,149.12958)); sourcePoints.add(new LatLng(-35.28032,149.12907)); sourcePoints.add(new LatLng(-35.28099,149.12929)); sourcePoints.add(new LatLng(-35.28144,149.12984)); sourcePoints.add(new LatLng(-35.28194,149.13003)); sourcePoints.add(new LatLng(-35.28282,149.12956)); sourcePoints.add(new LatLng(-35.28302,149.12881)); sourcePoints.add(new LatLng(-35.28473,149.12836)); PolylineOptions polyLineOptions = new PolylineOptions(); polyLineOptions.addAll(sourcePoints); polyLineOptions.width(5); polyLineOptions.color(Color.BLUE); mGoogleMap.addPolyline(polyLineOptions); mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(sourcePoints.get(0), 15)); List snappedPoints = new ArrayList<>(); new GetSnappedPointsAsyncTask().execute(sourcePoints, null, snappedPoints); } private String buildRequestUrl(List trackPoints) { StringBuilder url = new StringBuilder(); url.append("https://roads.googleapis.com/v1/snapToRoads?path="); for (LatLng trackPoint : trackPoints) { url.append(String.format("%8.5f", trackPoint.latitude)); url.append(","); url.append(String.format("%8.5f", trackPoint.longitude)); url.append("|"); } url.delete(url.length() - 1, url.length()); url.append("&interpolate=true"); url.append(String.format("&key=%s", ); return url.toString(); } private class GetSnappedPointsAsyncTask extends AsyncTask, Void, List> { protected void onPreExecute() { super.onPreExecute(); } protected List doInBackground(List... params) { List snappedPoints = new ArrayList<>(); HttpURLConnection connection = null; BufferedReader reader = null; try { URL url = new URL(buildRequestUrl(params[0])); connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.connect(); InputStream stream = connection.getInputStream(); reader = new BufferedReader(new InputStreamReader(stream)); StringBuilder jsonStringBuilder = new StringBuilder(); StringBuffer buffer = new StringBuffer(); String line = ""; while ((line = reader.readLine()) != null) { buffer.append(line+"\n"); jsonStringBuilder.append(line); jsonStringBuilder.append("\n"); } JSONObject jsonObject = new JSONObject(jsonStringBuilder.toString()); JSONArray snappedPointsArr = jsonObject.getJSONArray("snappedPoints"); for (int i = 0; i < snappedPointsArr.length(); i++) { JSONObject snappedPointLocation = ((JSONObject) (snappedPointsArr.get(i))).getJSONObject("location"); double lattitude = snappedPointLocation.getDouble("latitude"); double longitude = snappedPointLocation.getDouble("longitude"); snappedPoints.add(new LatLng(lattitude, longitude)); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } finally { if (connection != null) { connection.disconnect(); } try { if (reader != null) { reader.close(); } } catch (IOException e) { e.printStackTrace(); } } return snappedPoints; } @Override protected void onPostExecute(List result) { super.onPostExecute(result); PolylineOptions polyLineOptions = new PolylineOptions(); polyLineOptions.addAll(result); polyLineOptions.width(5); polyLineOptions.color(Color.RED); mGoogleMap.addPolyline(polyLineOptions); LatLngBounds.Builder builder = new LatLngBounds.Builder(); builder.include(result.get(0)); builder.include(result.get(result.size()-1)); LatLngBounds bounds = builder.build(); mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 10)); } } } 

并且不要忘记在Google API控制台中为您的项目添加Google Maps Roads API支持(选择您的项目,而不是选择Dashboard,而不是按“+ ENABLE APIS AND SERVICES”按钮,而不是在左侧“Filter by”选择“映射“,然后按”Google Maps Roads API“,最后按”ENABLE“按钮)。

你应该得到类似的东西:

陷阱点折线

其中:蓝色折线 – 用于源点,红色折线 – 用于捕捉点。

请记住,每个用户(IP)每天限制100个GPS点数和2500个请求,每秒10个请求。 此外,您还需要更优雅的解决方案来实现快速点JSON下载。