Estoy buscando una biblioteca/secuencia de comandos/función o cualquier otra cosa para el próximo problema. Tengo una aplicación que recupera la latitud y la longitud de Gps (Android). Con Lat y Long, quiero devolver el país donde encajan esos 2 valores.
Quiero una biblioteca porque no quiero usar ninguna API de GOOGLE u otros detalles de información de IP, etc.
Lo que probé hasta ahora tengo un archivo con todos los países con las máximas coordenadas de puntos fronterizos. Ejemplo a continuación
{ "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 },Si di a Lat = -51.55 y Long = -60.00... La salida es Argentina, porque es la primera entrada en el arreglo. Pero la respuesta correcta es Islas Malvinas.
Traté de disminuir Lat actual (-51.55) - Isla Malvinas Norte (-51.2407) para llegar a un número por debajo de 0... y hacer muchos bucles for... para obtener el número más cercano a 0. Después de eso, traté de consultar por Long y West
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.log(ln,ol, CountryCoords[property]["country"], ln, ol) return CountryCoords[property]["country"]; } } } } }Pero aquí es donde estoy atascado porque no sé cómo resolver este algoritmo y lo intenté desde ayer, pero me falta el cerebro para resolver esto...
* Piense en que algunos valores están por debajo de 0 y otros están por encima de 0.
Gracias
No necesitas una biblioteca, necesitas un mapa . Un mapa vectorial, preferiblemente, porque uno simple de mapa de bits no será de ninguna ayuda. Los cuadros delimitadores de los países son agradables, pero son suficientes para filtrar resultados imposibles (no es necesario probar Argentina si está en Europa).
Puede hacerlo con un mapa VMAP de nivel 0 (el mapa mundial completo se encuentra fácilmente), está dividido en 4 zonas grandes para todo el mundo. Todo ocupa alrededor de 400 MB, es una buena idea almacenarlo en una base de datos en lugar de usar directamente archivos de forma. Probablemente pueda ahorrar mucho espacio eliminando datos no deseados (ríos, bosques, lagos, pueblos, ...) y manteniendo SOLO los límites de los países.
Una vez que lo hagas y estés preparado para tu programa, tendrás que resolver el problema: "Teniendo cientos de polígonos georreferenciados, y una posición geográfica, ¿en qué polígono estoy?" Una vez hecho esto, obtendrá el nombre del país como una simple entrada de los metadatos del polígono. Puede obtener fácilmente los datos que necesita con menos de 20 MB.
Tal vez necesite una biblioteca matemática en este paso, pero sin un mapa incrustado y disponible, está atascado.
NOTA: el nivel 0 de VMAP (también conocido como "VMAP0") no tiene una buena precisión. Es posible que deba extender polígonos y, tal vez, devolver varios nombres de países cuando la posición esté cerca de un borde. Por ejemplo, puede ser bastante difícil poder devolver un nombre válido si estás en Mónaco, Lichtenstein o Andorra... Demasiado pequeño para un mapa tan tosco como es VMAP0.
Para estas extensiones de polígonos, es posible que necesite una biblioteca cartográfica. Otra solución es extender constantemente su posición a un círculo (radio de al menos 1 segundo), obtener 8 puntos en el perímetro + centro (N, NE, E, SE, S, SW, W, NW, centro) y ver qué nombres son devueltos. Un poco más de CPU en tiempo de ejecución que la extensión de polígonos (esto puede/debe hacerse sin conexión y debe almacenar polígonos extendidos directamente en la base de datos), pero puede evitar que obtenga una biblioteca cartográfica decente y aprenda a usarla.
No lo olvide: el procesamiento de mapas es un proceso fuera de línea, hecho una y ÚNICA vez. Una vez que obtenga los datos, guárdelos en cualquier base de datos que desee (SQlite debería estar bien, incluso un archivo estructurado simple podría estar bien si no tiene miedo de cargarlo en la RAM).