Android Смещение местоположения в автозаполнении Rect angular Границы - PullRequest
0 голосов
/ 05 мая 2020

Я хочу, чтобы результат автозаполнения отображался только в 1 км от местоположения пользователя. есть способ с RectangularBounds:

setLocationBias(RectangularBounds.newInstance(
new LatLng(-33.880490, 151.184363),
new LatLng(-33.858754, 151.229596)))
  1. Здесь всего 2 точки. Как это сделать прямоугольник angular?

  2. Если широта пользователя, например, 32.0000000, 30.0000000, как я могу сделать RectangularBounds в 1 км вокруг него?

1 Ответ

1 голос
/ 05 мая 2020

Для первого вопроса, если вы посмотрите документы

RectangularBounds newInstance (LatLng юго-запад, LatLng северо-восток)

Прямо angular поскольку он представляет две координаты: юго-запад и северо-восток, это обычно называется ограничивающей рамкой (или сокращается до bbox) и представляет область внутри этих двух координат.

Второй вопрос менее простой, и его больше, чем один из способов сделать это.

Один из подходов - найти метод добавления расстояния к координате, эти методы всегда являются приблизительными. Для этих координат LatLng geographi c вы можете использовать:

public static LatLng getCoordinate(double lat0, double lng0, long dy, long dx) {
    double lat = lat0 + (180 / Math.PI) * (dy / 6378137);
    double lng = lng0 + (180 / Math.PI) * (dx / 6378137) / Math.cos(lat0);
    return new LatLng(lat, lng);
}

, где lat0 и long0 - исходные координаты, а dx и dy - расстояние в метрах (поскольку радиус Земли установлен в метрах 6378137).

И теперь вы можете создать примерную ограничивающую рамку с исходной точкой + - 1000 метров. Предположим, что точка, которую вы установили в качестве начальной точки, находится на широте -33,869622 и долготе 151,206979, bbox будет:

RectangularBounds.newInstance(
    getCoordinate(-33.869622, 151.206979, -1000, -1000),
    getCoordinate(-33.869622, 151.206979, 1000, 1000))

Это bbox, который вы можете использовать для вызова api.

В случае у вас есть переменная экземпляра с именем currentlocation, это будет:

RectangularBounds.newInstance(
    getCoordinate(this.currentlocation.getLatitude(), this.currentlocation.getLongitude(), -1000, -1000),
    getCoordinate(this.currentlocation.getLatitude(), this.currentlocation.getLongitude(), 1000, 1000))

Если вам все еще нужно быть более точным с расстоянием 1 км, и отбросьте точки, которые находятся внутри этого квадрата (bbox), но вне круга радиусом 1 км вы можете отфильтровать результаты, проверив расстояние до исходной точки , прежде чем возвращать результат или отображать его.

Любопытно

Другой способ Я мог бы подумать о том, чтобы изменить проекцию координаты на другую, чтобы упростить вычисления, если вы преобразуете координату в меркатор, добавив 1000 к значению x, это добавит 1 км, а добавление 1000 к y также добавит 1 км, поскольку он использует метров в качестве единицы, но затем вы должны преобразовать обратно в исходную проекцию (работа с широтой и долготой), так как это тот, который использует api, поэтому я не думаю, что он того стоит, но он тоже должен работать.

...