Функция/скрипт/библиотека для получения названия страны на основе широты и долготы без онлайн-APIS

Я ищу библиотеку/скрипт/функцию или что-то еще для следующей проблемы. У меня есть приложение, которое извлекает широту и долготу из 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.

Спасибо

Не думаю, что вам повезет с этим. Проблема в том, что эти максимальные координаты дают вам ограничивающий прямоугольник, но точки в одной стране вполне могут быть внутри ограничивающего прямоугольника для другой. И что? Угадай работу? Посмотрите, например, на Боливию, Парагвай и Бразилию. Внутри ограничивающих прямоугольников обоих двух других есть точки каждого. Как бы вы выбрали? Вам потребуется гораздо больше информации об их границах, чем просто максимальные экстенты.

Scott Sauyet 06.04.2022 20:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам не нужна библиотека, вам нужен карта. Желательно векторную карту, потому что простая растровая не поможет. Ограничительные рамки стран хороши, но их достаточно, чтобы отфильтровать невозможные результаты (нет необходимости тестировать Аргентину, если вы находитесь в Европе).

Вы можете сделать с картой Уровень ВМАП 0 (карта всего мира легко находится), она разделена на 4 большие зоны для всего мира. Все это занимает около 400 МБ, неплохо хранить его в базе данных, а не использовать напрямую шейп-файлы. Возможно, вы сможете сэкономить много места, удалив ненужные данные (реки, леса, озера, города и т. д.) и сохранив границы ТОЛЬКО стран.

Как только вы сделаете это и подготовите свою программу, вам нужно будет решить проблему: «Имея сотни полигонов с географической привязкой и географическое положение, в каком полигоне я нахожусь?» Когда это будет сделано, вы получите название страны в виде простой записи метаданных полигона. Вы можете легко получить необходимые данные до 20 МБ.

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

ПРИМЕЧАНИЕ. Уровень VMAP 0 (также известный как «VMAP0») не имеет хорошей точности. Возможно, вам придется расширить полигоны и, возможно, вернуть несколько названий стран, когда позиция близка к границе. Например, может быть довольно сложно вернуть действительное имя, если вы находитесь в Монако, Лихтенштейне или Андорре... Слишком мало для такой грубой карты, как VMAP0.

Для этих расширений полигонов вам мая нужна картографическая библиотека. Другое решение — постоянно расширять свою позицию до круга (радиус не менее 1 секунды), получать 8 точек по периметру + центр (С, СВ, В, ЮВ, Ю, ЮЗ, З, СЗ, центр) и смотреть, какие имена возвращаются. во время выполнения немного больше загружает процессор, чем расширение полигонов (это можно/нужно делать в автономном режиме, и вы должны хранить расширенные полигоны непосредственно в базе данных), но это может избавить вас от получения приличной картографической библиотеки и изучения того, как ее использовать.

Не забывайте: обработка карты — это автономный процесс, выполняется один и ТОЛЬКО раз. Как только вы получите данные, сохраните их в любой базе данных, которая вам нравится (SQlite должен подойти, даже простой структурированный файл может подойти, если вы не боитесь загружать его в оперативную память).

Другие вопросы по теме

Как оценить временную сложность генерации строковых перестановок с использованием дерева рекурсии
Как найти координату, чтобы минимизировать расстояние до Манхэттена за линейное время?
В тесте на простоту я не понимаю, почему мы увеличиваем i на 6 (i = i + 6)? и условия оператора if в блоке цикла for?
Я хочу sympy gcdex(ax + by = c Это линейное диофантово уравнение.)
Алгоритм Swift: как получить строку, включающую все подстроки, без повторения
Как проверить, содержит ли список Python элементы другого списка. Дубликаты не игнорируются
Ускорить обработку 32-битных чисел в комбинациях (k из n)
В массиве чисел найдите наибольший продукт с определенным кратным
Преобразование целого числа в логический список с 3 элементами (Java)
Лучший способ отслеживать значения нескольких вводов текста, чтобы убедиться, что все они верны в словесной игре JavaScript/React