2017-08-21 1 views
0

Ich arbeite an einer App, die eine Google-Karte und eine Polylinie hat, um eine Route anzugeben. Was ich will, ist, dass wenn der Benutzer die Karte öffnet, wird automatisch eine Markierung auf den nächsten Punkt zwischen dem Benutzer und der Polylinie gesetzt.Holen Sie sich den nächstgelegenen Punkt von ArrayList <LatLng>

Ich habe bereits eine Funktion eingerichtet, die den nächsten Punkt vom Benutzer zur Polylinie bringt. Wenn der Abstand < 600 ist, wird an dieser Stelle ein Marker gesetzt. Aber was ich will, ist, alle Koordinaten zu nehmen (der Polylinie), die < 600 Meter vom Benutzer sind und wählen Sie die nächstgelegene ... dies ist mein Code

Linienzug Arraylist:

public ArrayList<LatLng> polylineList(){ 

    ArrayList<LatLng> coords = new ArrayList<LatLng>(); 

    coords.add(new LatLng(25.71687391423798,-100.3730825815284)); 
    coords.add(new LatLng(25.71682182829175,-100.3733097782636)); 
    coords.add(new LatLng(25.71678126641878, -100.374090669652)); 
    coords.add(new LatLng(25.71683201122758, -100.3731781269444)); 
    coords.add(new LatLng(25.72018196813817, -100.3735084186905)); 
    coords.add(new LatLng(25.72031604576068, -100.3736959395207)); 
    coords.add(new LatLng(25.71998332400039, -100.3762802484946)); 
    coords.add(new LatLng(25.71994816609866, -100.3764646004368)); 
    coords.add(new LatLng(25.72208094229626, -100.3773901496331)); 
    coords.add(new LatLng(25.72139701948525, -100.3784182403878)); 
    coords.add(new LatLng(25.72088085424743, -100.3792655793197)); 
    coords.add(new LatLng(25.7211341509678, -100.3796660319109)); 
    coords.add(new LatLng(25.72119368137114, -100.3807655073227)); 
    coords.add(new LatLng(25.72102639768713, -100.3811907891904)); 
    coords.add(new LatLng(25.72079498457438, -100.3810006195533)); 
    coords.add(new LatLng(25.720670392499, -100.3799969462212)); 
    coords.add(new LatLng(25.72062014771428, -100.3798718252661)); 
    coords.add(new LatLng(25.71970136267208, -100.3812225396649)); 
    coords.add(new LatLng(25.71935874972525, -100.3814558417726)); 
    coords.add(new LatLng(25.71758071083912, -100.3839700351668)); 
    coords.add(new LatLng(25.71722347802044, -100.3838886540422)); 
    coords.add(new LatLng(25.71531766471047, -100.3815788239292)); 
    coords.add(new LatLng(25.71564916096481, -100.3804237189767)); 
    coords.add(new LatLng(25.7159267510913, -100.3800793191019)); 
    coords.add(new LatLng(25.71627234185268, -100.3795543063391)); 
    coords.add(new LatLng(25.71665021282444, -100.3790150094068)); 

Rückkehr Koordinaten; }

Dann bekomme ich den Standort des Benutzers und evaluiere die Koordinaten mit jedem ArrayList Index mit der HAVERSINE-Formel, wenn die Entfernung < 600 ist, wird es eine Markierung zeichnen.

for (int i = 0; i < polylineList().size(); i++) { 
        Double latit = polylineList.get(i).latitude; 
        Double longit = polylineList.get(i).longitude; 
        LatLng newLatLng = new LatLng(latit, longit); 
        Double distance = distanceHaversine(userlatit, latit, userlongit, longit); 
        if (distance < 600) { 
         drawMarker(newLatLng); 
        } 
       } 

dies richtig funktioniert, aber es eine Menge von Markierungen in den Koordinaten zieht die < 600 Meter vom Standort des Benutzers sind. Was ich will, ist einen Marker nur am nächsten Punkt der Polylinie zu zeichnen. Eine Art von bewerten alle Koordinaten, die < 600 vom Benutzer sind und wählen Sie dann am nächsten. Schätze jede Hilfe.

Antwort

0

Mindestabstand von Benutzer zu Verfügung stehenden Punkte zu finden, erhalten die latlng mit min Abstand zugeordnet und , dass durch die Verwendung für Karte

private int minDistance = 0; 
    private LatLng closestLatLng = null; 
    for (int i = 0; i < polylineList().size(); i++) { 
         Double latit = polylineList.get(i).latitude; 
         Double longit = polylineList.get(i).longitude; 
         LatLng newLatLng = new LatLng(latit, longit); 
         Double distance = distanceHaversine(userlatit, latit, userlongit, longit); 
         if (distance < minDistance) { 
          closestLatLng = newLatLng; 
          minDistance = distance; 
         } 
        } 
    if(closestLatLng !=null && minDistance < 600){ 
     drawMarker(closestLatLng); 
    } 
+0

danke für deine antwort, ich verstehe nicht warum: if (distance

0

Es gibt Map Utils-Klasse ziehen, dass Sie Standort finden können, die zu bestimmten ist Abstand von der aktuellen Position auf Linienzug

if (PolyUtil.isLocationOnPath(start, points, true, 10)) { 
     // do your stuf here 
} 

Start hier ist Ihre aktuelle Position, Punkte ist Array von Polylinienpunkte und letzte Parameter ist für Bereich (Entfernung) von Ihrem Weg in Meter.

Dazu müssen Sie diese Abhängigkeit in Ihre Größe hinzufügen.

compile 'com.google.maps.android:android-maps-utils:0.5+' 

hoffe das hilft dir.

+0

danke für dein anwswer. Dies wird alle Punkte innerhalb von 10 Metern Entfernung bekommen, aber was ist, wenn ich viele Punkte bei 10 Metern habe ... ich möchte nur den nächsten vom Benutzer finden .... –

Verwandte Themen