Проверьте, содержит ли маршрут определенные координаты или нет - PullRequest
0 голосов
/ 26 мая 2018

В настоящее время я разрабатываю приложение, в котором я хочу узнать, содержит ли маршрут определенный набор координат длинной длины.Вот мой код:

public class PathActivity extends FragmentActivity implements OnMapReadyCallback, RoutingListener {

    private GoogleMap mMap;
    FetchLocation fetchLocation;

    LatLng start;
    LatLng end;
    ProgressDialog pd;
    List<Polyline> polylines;
    private static final int[] COLORS = new int[]{R.color.gradient_dark_pink};

    FirebaseFirestore firestore;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_path);

        //Receiving Object From Intent
        Intent rcv = getIntent();
        fetchLocation = (FetchLocation) rcv.getSerializableExtra("keyFetchLocationObject2");

        pd = new ProgressDialog(this);
        pd.setMessage("Please Wait...");

        firestore = FirebaseFirestore.getInstance();

        fetchAllTrafficLights();

        polylines = new ArrayList<>();

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

       pd.show();

       //Making a Path
        start = new LatLng(fetchLocation.latitude, fetchLocation.longitude);
        end = new LatLng(fetchLocation.destinationLatitude, fetchLocation.destinationLongitude);
        Routing routing = new Routing.Builder()
                .travelMode(Routing.TravelMode.DRIVING)
                .withListener(this)
                .alternativeRoutes(false)
                .waypoints(start, end)
                .build();

        routing.execute();
    }

    @Override
    public void onRoutingFailure(RouteException e)
    {
        Toast.makeText(this, "Error: " + e.getMessage(), Toast.LENGTH_LONG).show();
        pd.dismiss();
    }

    @Override
    public void onRoutingStart() {

    }

    @Override
    public void onRoutingSuccess(ArrayList<Route> route, int shortestRouteIndex)
    {
        pd.dismiss();

        mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(start, 16));

        if(polylines.size()>0) {
            for (Polyline poly : polylines) {
                poly.remove();
            }
        }

        polylines = new ArrayList<>();
        //add route(s) to the map.
        for (int i = 0; i <route.size(); i++)
        {
            //In case of more than 5 alternative routes
            int colorIndex = i % COLORS.length;

            PolylineOptions polyOptions = new PolylineOptions();
            polyOptions.color(getResources().getColor(COLORS[colorIndex]));
            polyOptions.width(10 + i * 3);
            polyOptions.addAll(route.get(i).getPoints());
            Polyline polyline = mMap.addPolyline(polyOptions);
            polylines.add(polyline);

            Toast.makeText(getApplicationContext(),"Route "+ (i+1) +": distance - "+ route.get(i).getDistanceValue()+": duration - "+ route.get(i).getDurationValue(),Toast.LENGTH_SHORT).show();

            // Start marker
            MarkerOptions options = new MarkerOptions();
            options.position(start);
            options.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker_start_blue));
            mMap.addMarker(options);

            // End marker
            options = new MarkerOptions();
            options.position(end);
            options.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker_end_green));
            mMap.addMarker(options);


        }

    }

    @Override
    public void onRoutingCancelled() {

    }

    public void fetchAllTrafficLights()
    {
        pd.show();
        firestore.collection("Controller").get().addOnCompleteListener(this, new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(Task<QuerySnapshot> task)
            {
                if(task.isSuccessful())
                {
                    for(QueryDocumentSnapshot documentSnapshot : task.getResult())
                    {
                        Log.i("Hello", documentSnapshot.get("controllerLatitude").toString() + "   " + documentSnapshot.get("controllerLongitude").toString());
                        pd.dismiss();
                    }
                }
            }
        })
                .addOnFailureListener(this, new OnFailureListener()
                {
                    @Override
                    public void onFailure(Exception e)
                    {
                        Toast.makeText(PathActivity.this, "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show();
                        pd.dismiss();
                    }
                });
    }
}

Я использую библиотеку github: https://github.com/jd-alexander/Google-Directions-Android, чтобы нарисовать маршрут между двумя точками.Скоординированные данные уже сохранены в базе данных пожарного депо и успешно получены, как показано в журнале.Теперь я хочу проверить, находятся ли последние точки, выбранные из базы данных, в пути или нет.Например.Если мы переместимся из точки A в D, я хочу проверить, есть ли точки B, C на маршруте или нет.Я также хочу знать, всегда ли API Google Места на карте дает одинаковые координаты маршрута между двумя точками.Вот мой объект:

public class FetchLocation implements Serializable
{
    public double latitude;
    public double longitude;
    public double destinationLatitude;
    public double destinationLongitude;

    public FetchLocation()
    {

    }

    public FetchLocation(double latitude, double longitude, double destinationLatitude, double destinationLongitude) {
        this.latitude = latitude;
        this.longitude = longitude;
        this.destinationLatitude = destinationLatitude;
        this.destinationLongitude = destinationLongitude;
    }

    @Override
    public String toString() {
        return "FetchLocation{" +
                "latitude=" + latitude +
                ", longitude=" + longitude +
                ", destinationLatitude=" + destinationLatitude +
                ", destinationLongitude=" + destinationLongitude +
                '}';
    }
}

Пользовательский источник в течение долгого времени извлекается в предыдущем действии, используя автозаполнение google place- https://developers.google.com/places/android-sdk/autocomplete и устанавливается в объекте, который передается в это действие.

Кто-нибудь, пожалуйста, помогите !!

1 Ответ

0 голосов
/ 27 мая 2018

Взгляните на PolyUtil.isLocationOnPath(LatLng point, java.util.List<LatLng> polyline, boolean geodesic, double tolerance) метод Библиотека утилит API Карт Google Android .Вам нужно получить путь полилинии от A до D и проверить каждую точку из списка (B и C) с помощью isLocationOnPath(), если она лежит на пути AD.Примерно так:

for (LatLng point : pointsBandCList) {
    if (PolyUtil.isLocationOnPath(point, polylineFromAtoD.getPoints(), true, 100)) {
        // "point" laying on A to D path

        ...
    }
}

где 100 - это допуск (в метрах).Вы можете настроить его для своей задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...