Путь рисования на карте google на основе lat lang

Я хочу нарисовать путь на карте google.

В основном, я отслеживаю локализацию пользователя после определенного интервала времени. когда пользователь достигает какого-то адресата, мне нужно нарисовать путь, который он следил, чтобы добраться до этого пункта назначения.

Он работает нормально, но проблема в том, что он показывает путь зигзага. См. Изображение ниже.

Что я хочу:

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

Что я пробовал

я искал и нашел эту ссылку, в которой мы можем передать до 8 баллов, чтобы получить указания. Какой максимальный лимит разрешен для нерабочих пользователей Карты Google. Есть ли другой способ достичь этого. потому что у меня так много точек для рисования на карте.

код для рисования полилиний

private void drawPath() {
        if (mMap != null)
            mMap.clear();
        int count = 0;
        LatLng prev = null;
        String[] mProjection = {LocTable.COLUMN_ID, LocTable.COLUMN_LONGITUDE, LocTable.COLUMN_LATITUDE};
        String mSelectionClause = LocTable.COLUMN_ID + "> ?";
        String[] mSelectionArgs = {"0"};
        String mSortOrder = LocTable.COLUMN_ID;

        Cursor mCursor = getContentResolver().query(
                LocContentProvider.CONTENT_URI,   // The content URI of the words table
                mProjection,                        // The columns to return for each row
                mSelectionClause,                    // Selection criteria
                mSelectionArgs,                     // Selection criteria
                mSortOrder); 


        if(mCursor != null && mCursor.getCount()!=0) {

            Log.i("cursor", "Count: " + mCursor.getCount() + "|Column count: " + mCursor.getColumnCount());
            if (mCursor.moveToFirst()) {
                do {
                    if (mMap != null) {

                        float lon = mCursor.getFloat(1);
                        float lat = mCursor.getFloat(2);
                        LatLng current = new LatLng(lat, lon);

                        markerPoints.add(current);
                        if (count == 0){
                            prev = current;
                        }
                        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(current, 19);
                        mMap.animateCamera(cameraUpdate);
                        mMap.addPolyline((new PolylineOptions())
                                .add(prev, current).width(6).color(Color.BLUE)
                                .visible(true));
                        prev=current;
                        count++;
                    }
                } while (mCursor.moveToNext());
            }

            mCursor.close();
        }
    }

спасибо за помощь. image

Ответ 1

Я согласен с ответом antonio. Проблема не в том, что вы используете функцию рисования. Вы просто рисуете путь, независимо от того, какое устройство дает вам местоположение. Проблема в том, что ваше устройство не дает точное местоположение.

Позвольте мне дать вам краткое описание функциональности местоположения.

Существует три типа провайдера, предоставляющих местоположение в устройстве.

1 провайдер GPS.

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

Дополнительный пакет для провайдера местоположения GPS может содержать следующие пары ключ/значение:

- количество спутников, используемых для получения исправления

2 Сетевой провайдер.

Этот провайдер определяет местоположение на основе доступности точек сотовой связи и точек доступа WiFi. Результаты извлекаются с помощью сетевого поиска.

3 Пассивный провайдер.

Этот провайдер может использоваться для пассивного получения обновлений местоположения, когда другие приложения или службы запрашивают их, даже не запрашивая местонахождение. Этот провайдер будет возвращать местоположения, созданные другими поставщиками. Вы можете запросить метод getProvider(), чтобы определить источник обновления местоположения. Требуется разрешение ACCESS_FINE_LOCATION, хотя, если GPS не включен, этот провайдер может возвращать только грубые исправления.

Ссылка:

Диспетчер местоположений Android

Поставщики местоположений Android - поставщик GPS или сети?

В соответствии с моим опытом я могу сказать, что GPS Provider дает вам точные местоположение сравнивается с Network Provider, но требует открытой среды, GPS provider не дает точное расположение внутри здания.

getAccuracy().

Возвращает константу, описывающую горизонтальную точность этого провайдера. Если поставщик возвращает более тонкое зерно или точное местоположение, возвращается ACCURACY_FINE, в противном случае, если местоположение приблизительное, возвращается ACCURACY_COARSE.

Этот метод вернет точное значение при изменении местоположения от поставщика GPS, иначе оно вернет приблизительное или 0 значение.

Ссылка: Location.getAccuracy()

Решение:

Рекомендуется использовать Google Client. Пример примера.

Ответ 2

Проблема заключается не в вашей функции рисования, а в методе, который вы используете, чтобы получить точки вашего пути, используя полученное местоположение.

Вам нужно учитывать два фактора:

  • Прежде всего, точность принимаемого местоположения. Вы можете получить точность, используя метод Location.getAccuracy() (документация). Точность измеряется в метрах, поэтому чем ниже, тем лучше.
  • С другой стороны, вы можете захотеть добавить новое место в свою полилинию, только если ваше новое местоположение находится дальше, чем заданное расстояние до вашего последнего добавленного местоположения.

Пример объединения обоих соображений:

private static final float MINIMUM_ACCURACY = 10; // If the accuracy of the measurement is worse than 10 meters, we will not take the location into account
private static final float MINIMUM_DISTANCE_BETWEEN_POINTS = 20; // If the user hasn't moved at least 20 meters, we will not take the location into account
private Location lastLocationloc;

// ...

public void onLocationChanged(Location mylocation) {
    if (mylocation.getAccuracy() < MINIMUM_ACCURACY) {
        if (lastLocationloc == null || lastLocationloc.distanceTo(mylocation) > MINIMUM_DISTANCE_BETWEEN_POINTS) {
            // Add the new location to your polyline

            lastLocationloc = mylocation;
        }
    }
}

Ответ 3

Вы заглянули в новый Roads Api? Он рассчитает точность и вернет самые разумные значения для вывода строки. Он также обеспечивает ограничение скорости на текущей дороге.

Ответ 4

Добавление в ответ @antonio. Вы можете указать приоритет и смещение следующим образом. Это позволит вам получить максимально возможную точность.

    private int mInterval =5;
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10;
    private static final float MIN_ACCURACY = 10;
    private Location lastKnownLocation;

            @Override
            public void onConnected(Bundle bundle) {

                locationRequest = LocationRequest.create();
                locationRequest.setInterval(mInterval * 1000); // milliseconds
                locationRequest.setFastestInterval(mInterval * 1000);
                locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
                locationRequest.setSmallestDisplacement(MIN_DISTANCE_CHANGE_FOR_UPDATES);//distance change
                int permissionCheck = ContextCompat.checkSelfPermission(appContext, Manifest.permission.ACCESS_COARSE_LOCATION);
                if (permissionCheck!= PackageManager.PERMISSION_DENIED)
                {    LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient,
 locationRequest, this);
                }
            }

Теперь в методе onLocationChanged выполните согласно предложению.

@Override
    public void onLocationChanged(Location location) {
        if (location.getAccuracy() < MIN_ACCURACY ) {
            if (lastKnownLocation == null || lastKnownLocation.distanceTo(location) > MIN_DISTANCE_CHANGE_FOR_UPDATES) {

                lastKnownLocation = location;
            }
        }
    }

ПРИМЕЧАНИЕ.

При поиске местоположения из NetworkProvider, который быстрее, даже если устройство статично принимаемое местоположение в определенные промежутки времени меняется. Вышеупомянутая логика даст нам возможность избежать нерелевантные значения и отслеживать/обрабатывать действительные.

Подробные сведения о поставщике профайлеров Api