2017-11-16 6 views
0

the out put is Meine Karte enthält mehrere Punkte, um den Ort des Benutzers aus dem er die PolyLine passiert tippen nicht auf den Straßen gezeigt, sondern zeigt eine direkte Linie von einem Marker zu anderen i mein pollyline über die Straße, wie die Straßen gehen wollen verwandelt es auchPolyLine ist nicht auf den Straßen: es geht direkt von einem Punkt zum anderen

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; 
     } 
    }); 
+0

https://www.androidtutorialpoint.com/intermediate/google-maps-draw-path-two-points-using-google-directions-google-map-android-api-v2/ versuchen Sie dieses Tutorial für Zeichenpfad auf der Straße –

Antwort

3

Versuchen für einen bestimmten Satz Google Maps Roads API Teil verwenden Snap to Road die

kehrt die best-fit-Straßengeometrie drehen sollte von GPS-Koordinaten. Dieser Service nimmt bis zu 100 GPS-Punkte auf, die entlang einer Route gesammelt wurden, und gibt einen ähnlichen Datensatz zurück, wobei die Punkte auf die wahrscheinlichsten Straßen gerastert sind, mit denen das Fahrzeug unterwegs war.

Etwas, dass für Daten von Google Maps API Roads Snap to Straßen Beispiel:

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<LatLng> 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<LatLng> snappedPoints = new ArrayList<>(); 
     new GetSnappedPointsAsyncTask().execute(sourcePoints, null, snappedPoints); 
    } 


    private String buildRequestUrl(List<LatLng> 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", <your_Google_Maps_API_key>); 

     return url.toString(); 
    } 


    private class GetSnappedPointsAsyncTask extends AsyncTask<List<LatLng>, Void, List<LatLng>> { 

     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 

     protected List<LatLng> doInBackground(List<LatLng>... params) { 

      List<LatLng> 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<LatLng> 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)); 

     } 
    } 

} 

Und vergessen Sie nicht Google Maps Roads API-Unterstützung für Ihr Projekt in Google APIs Console (wählen Sie Ihr Projekt hinzuzufügen, als wählen Sie Dashboard, dann drücken Sie "+ APIS AND SERVICES" -Taste, als auf der linken Seite "Filtern nach" wählen Sie "Karten", drücken Sie "Google Maps Roads API" und drücken Sie schließlich auf "AKTIVIEREN").

Snapped points polyline

wo: - für Quellpunkte, rot Linienzug - für gerissenen Punkte blau Linienzug

Sie sollten so etwas bekommen.

Denken Sie daran, es gibt ein Limit von 100 GPS-Punkten und 2500 Anfragen pro Tag pro Benutzer (IP) und 10 Anfragen pro Sekunde. Und auch Sie brauchen eine elegantere Lösung für Schnappschüsse JSON Download.

+0

Im Neuling wirst du bitte meinen Code ändern –

+0

@RanaArslan [Hier] (https://stackoverflow.com/a/40735203/5359331) ist ein Beispiel für jemanden, der es benutzt. –

+0

@RanaArslan Es wird einige Zeit dauern. –

Verwandte Themen