Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Как получить погодные данные от ближайшей погодной станции?

#java #android #weather


Добрый день! Подскажите, пожалуйста. Есть список погодных станций с заданными координатами
широты и долготы:


KJKL
KY
Julian Carroll Airport
37.6
-83.32
http://weather.noaa.gov/weather/current/KJKL.html
http://weather.gov/xml/current_obs/KJKL.rss
http://weather.gov/xml/current_obs/KJKL.xml



KLEX
KY
Lexington, Blue Grass Airport
38.05
-84.6
http://weather.noaa.gov/weather/current/KLEX.html
http://weather.gov/xml/current_obs/KLEX.rss
http://weather.gov/xml/current_obs/KLEX.xml


...


и т.д. Их около полтысячи. Как мне определить ближайшую станцию по отношению к Андроид
устройству?  Я знаю, как сделать парсинг погоды, определить местонахождние для устройства(по
формуле), сравнить с конкретной станцией. Но их там полтысячи! То есть нужно автоматически
определить ближайшую станцию. 
    


Ответы

Ответ 1



Вам нужно: Получить координаты устройства. Создать список/массив для хранения квадратного корня из суммы квадратов координат каждой станции по обеим осям относительно вашего положения. Отсортируйте полученный список от большего к меньшему. Теперь у вас в списке первый элемент - ближайшая станция.

Ответ 2



Давненько я решал очень похожую задачу, на определения ближайшей точки по гео:координатам, относительно своего device, но я находил именно расстояние. Возможно в android есть иные реализации, но я просто не работал в этом направлении а пока вот: class Solution { public static double distance(String longA, String latA, String longB, String latB) // Растояние м-у 2-я точками зная их координаты { double longARad = Double.parseDouble(longA) * Math.PI / 180d; double latARad = Double.parseDouble(latA) * Math.PI / 180d; double longBRad = Double.parseDouble(longB) * Math.PI / 180d; double latBRad = Double.parseDouble(latB) * Math.PI / 180d; double x = (longBRad - longARad) * Math.cos((latARad + latBRad) / 2d); double y = latBRad - latARad; return Math.sqrt(x*x + y*y) * 6371; // Умножаем на ср. показатель радиуса Земли, для перевода в метрическую систему. } public static void main(String args[]) { String bestStation = null; double bestDist = Double.MAX_VALUE; for (int i = 0; i < N; i++) { double distance = distance(longitude1, latitude1, longitude2, latitude2); // используем метод distance if (distance < bestDist) // находим ближайшую станцию { bestDist = distance; bestStation = station[i]; } } System.out.println(bestStation ); } } Я загружал сюда, больше 5000 адресов, причем мне приходилось, ещё форматировать предварительно адрес из БД, так как у меня не было чистых значений как в Вашем примере, а просто String с кучей лишних значений и работало отлично и очень быстро.

Комментариев нет:

Отправить комментарий