Xamarin.Forms: более быстрый способ отображения ближайших местоположений без вызова API?

У меня есть простое Xamarin.Forms приложение, которое отображает список ближайших магазинов Walmart на основе моего текущего местоположения.

Допустим, в моей базе данных SQL более 200 строк; каждая строка имеет координаты магазина Walmart в моем штате Техас.

Итак, моя первоначальная логика заключалась в том, чтобы получить расстояние между моим местоположением и всеми более чем 200 местоположениями Walmart, что-то вроде этого:

Datatable walmartTable = GetAllWalmarts();
string distanceUrl = "https://maps.google.com/maps/api/distancematrix/xml?origins=MyLocationX,MyLocationY&destinations={2},{3}&mode=driving";

List<Walmarts> walmartList=new List<Walmarts>();

foreach(DataRow row in walmartTable.Rows)
{
    x_walmart = row["x];
    y_walmart = row["y];
    currentWalmartName = row["name"];
    // Build distanceUrl variable with x_walmart & y_walmart
    // Call distanceUrl API that returns "distance in miles"
    // Add "distance in miles" to an array, something like this: list.add(currentWalmartName, x_walmart, y_walmart, "distance in miles");
    // Go to the next Walmart store
}

Затем, как только walmartList получит расстояние между моим местоположением и всеми 200+ магазинами Walmart, я отобразлю в своем ListView местоположения с расстоянием менее 10 миль.

Итак, мой вопрос: как я могу ограничить количество вызовов API к Google Maps? Прямо сейчас мне нужно было бы запросить Карты Google более 200 раз, а затем отобразить магазины, которые находятся в пределах указанного расстояния (т.е. 10 миль).

Если мое текущее местоположение в Хьюстоне, штат Техас, — 12 Oaks Dr, то зачем мне получать адреса всех магазинов в Техасе? Но я не знаю, как ограничить этот поиск без вызова API Карт Google и получения фактического расстояния.


person fdkgfosfskjdlsjdlkfsf    schedule 10.03.2019    source источник
comment
Предполагая, что вы говорите о расстоянии по прямой, вы можете сделать это непосредственно в запросе SQLite (через SQLite UDF (определяемая пользователем функция), которая выполняет вычисление расстояния latlng), то есть: stackoverflow.com/questions/41409699/ После того, как у вас будет этот отфильтрованный список магазинов, вы можете сделать вызовы карты Google, чтобы получить расстояние / направления движения.   -  person SushiHangover    schedule 10.03.2019
comment
Ваш список магазинов хранится на устройстве или в базе данных сервера? В любом случае, вы можете создать свою собственную функцию расстояния и выполнить геозапрос в базе данных — для этого не нужно полагаться на Google. В качестве альтернативы вы можете выполнить довольно простой запрос, который находит все местоположения в пределах квадрата с центром в вашем текущем местоположении.   -  person Jason    schedule 10.03.2019
comment
@SushiHangover: Если под расстоянием «по прямой» вы подразумеваете расчет расстояния по широте и долготе, то это решение невозможно. У меня есть Walmart, который находится буквально в 3 милях от моего текущего расстояния (с учетом широты и долготы), но мне нужно проехать 10 миль, чтобы добраться туда, потому что нет прямого подъезда к дороге.   -  person fdkgfosfskjdlsjdlkfsf    schedule 10.03.2019
comment
@Jason: список находится в базе данных сервера. Как мне сохранить информацию о расстоянии в БД и как ее рассчитать, не заходя в Google?   -  person fdkgfosfskjdlsjdlkfsf    schedule 10.03.2019
comment
Например, API Google сообщает мне, что расстояние между моим текущим местоположением и Walmart Boulevard Ave составляет 5,48 мили. Как я смогу сохранить (или рассчитать) это расстояние, не полагаясь на Google?   -  person fdkgfosfskjdlsjdlkfsf    schedule 10.03.2019
comment
@fdkgfosfskjdlsjdlkfsf Это то, о чем я говорил, предварительно рассчитайте кратчайшее расстояние, получите ближайшее количество X магазинов, а затем получите фактическое расстояние, если пользователь этого хочет. (так работают приложения для поиска магазинов, в противном случае, да, вам пришлось бы запрашивать у какой-либо службы расстояние до каждого из магазинов, что просто нецелесообразно)   -  person SushiHangover    schedule 10.03.2019
comment
Вычисление расстояния между двумя точками является базовой геометрией. Для последних/длинных вычислений это сложнее, но хорошо документировано в SO и многих других местах в Интернете. Если вы хотите проехать расстояние, вам придется полагаться на службу, чтобы сделать это. Как предлагает Sushi, сначала выполните расчет приблизительного расстояния, чтобы сузить область поиска, а затем используйте API для расчета расстояния до автомобиля.   -  person Jason    schedule 11.03.2019
comment
Если вы храните станции своих магазинов в базе данных MySQL, вы можете выполнить запрос.   -  person Junior Jiang    schedule 11.03.2019