Я ищу библиотеку/скрипт/функцию или что-то еще для следующей проблемы. У меня есть приложение, которое извлекает широту и долготу из GPS (Android). С помощью Lat и Long я хочу вернуть страну, в которую подходят эти два значения.
Мне нужна библиотека, потому что я не хочу использовать какой-либо GOOGLE API или другую информацию об ip-информации и т. д.
Что я пробовал до сих пор У меня есть файл со всеми странами с максимальными координатами пограничных точек. Пример ниже
{
"country": "Argentina",
"north": -21.7813,
"south": -55.0613,
"west": -73.583,
"east": -53.5918
},
{
"country": "Falkland Islands",
"north": -51.2407,
"south": -52.3605,
"west": -61.3452,
"east": -57.7125
},
Если я дал Lat = -51,55 и Long = -60,00 ... Выход - Аргентина, потому что это первая запись в массиве. Но правильный ответ — Фолклендские острова.
Я попытался уменьшить фактическую широту (-51.55) - север Фолклендского острова (- 51.2407), чтобы достичь числа меньше 0... и сделать много циклов for..., чтобы получить ближайшее число к 0. После этого я попытался проверить Лонга и Уэста.
for (const property in Object.entries(CountryCoords)) {
if (CountryCoords[property]["south"] <= lat && lat <= CountryCoords[property]["north"]) {
var ln = (CountryCoords[property]["north"] - lat); // 0
if (ln < 5) {
if (CountryCoords[property]["west"] <= long && long <= CountryCoords[property]["east"]) {
var ol = CountryCoords[property]["east"] - long;
if (ol < 5) {
// console.info(ln,ol, CountryCoords[property]["country"], ln, ol)
return CountryCoords[property]["country"];
}
}
}
}
}
Но вот где я застрял, потому что я не знаю, как решить этот алгоритм, и я пытался со вчерашнего дня, но у меня не хватает мозгов, чтобы решить это...
* Подумайте о том, что некоторые значения меньше 0, а другие больше 0.
Спасибо
Вам не нужна библиотека, вам нужен карта. Желательно векторную карту, потому что простая растровая не поможет. Ограничительные рамки стран хороши, но их достаточно, чтобы отфильтровать невозможные результаты (нет необходимости тестировать Аргентину, если вы находитесь в Европе).
Вы можете сделать с картой Уровень ВМАП 0 (карта всего мира легко находится), она разделена на 4 большие зоны для всего мира. Все это занимает около 400 МБ, неплохо хранить его в базе данных, а не использовать напрямую шейп-файлы. Возможно, вы сможете сэкономить много места, удалив ненужные данные (реки, леса, озера, города и т. д.) и сохранив границы ТОЛЬКО стран.
Как только вы сделаете это и подготовите свою программу, вам нужно будет решить проблему: «Имея сотни полигонов с географической привязкой и географическое положение, в каком полигоне я нахожусь?» Когда это будет сделано, вы получите название страны в виде простой записи метаданных полигона. Вы можете легко получить необходимые данные до 20 МБ.
Возможно, на этом этапе вам понадобится математическая библиотека, но без встроенной доступной карты вы застряли.
ПРИМЕЧАНИЕ. Уровень VMAP 0 (также известный как «VMAP0») не имеет хорошей точности. Возможно, вам придется расширить полигоны и, возможно, вернуть несколько названий стран, когда позиция близка к границе. Например, может быть довольно сложно вернуть действительное имя, если вы находитесь в Монако, Лихтенштейне или Андорре... Слишком мало для такой грубой карты, как VMAP0.
Для этих расширений полигонов вам мая нужна картографическая библиотека. Другое решение — постоянно расширять свою позицию до круга (радиус не менее 1 секунды), получать 8 точек по периметру + центр (С, СВ, В, ЮВ, Ю, ЮЗ, З, СЗ, центр) и смотреть, какие имена возвращаются. во время выполнения немного больше загружает процессор, чем расширение полигонов (это можно/нужно делать в автономном режиме, и вы должны хранить расширенные полигоны непосредственно в базе данных), но это может избавить вас от получения приличной картографической библиотеки и изучения того, как ее использовать.
Не забывайте: обработка карты — это автономный процесс, выполняется один и ТОЛЬКО раз. Как только вы получите данные, сохраните их в любой базе данных, которая вам нравится (SQlite должен подойти, даже простой структурированный файл может подойти, если вы не боитесь загружать его в оперативную память).
Не думаю, что вам повезет с этим. Проблема в том, что эти максимальные координаты дают вам ограничивающий прямоугольник, но точки в одной стране вполне могут быть внутри ограничивающего прямоугольника для другой. И что? Угадай работу? Посмотрите, например, на Боливию, Парагвай и Бразилию. Внутри ограничивающих прямоугольников обоих двух других есть точки каждого. Как бы вы выбрали? Вам потребуется гораздо больше информации об их границах, чем просто максимальные экстенты.