Function/Script/Library 在没有在线 APIS 的情况下根据纬度和经度检索国家/地区名称

Function/Script/Library to retrieve country name based on Lat and Long without Online APIS

我正在为下一个问题寻找 library/script/function 或其他任何东西。 我有一个从 Gps (Android) 检索纬度和经度的应用程序。 对于 Lat 和 Long,我想 return 这两个值适合的国家/地区。

我想要一个图书馆,因为我不想使用任何 GOOGLE API 或其他 ip-info 详细信息等

到目前为止我尝试了什么 我有一个包含最大边界点坐标的所有国家/地区的文件。下面的例子

{
   "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 ...输出是 Argentina,因为它是数组中的第一个条目。 但正确答案是福克兰群岛。

我试图减少实际纬度 (-51.55) - 福克兰岛北部 (-51.2407) 以达到 0 以下的数字...并进行大量 for...循环以获得最接近 0 的数字。 之后我尝试检查 Long 和 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"];
          }
        }
      }

    }
  }

但这就是我被卡住的地方,因为我不知道如何解决这个算法,我从昨天开始就尝试过,但我缺乏解决这个问题的大脑...

*考虑一些值小于 0,而其他值大于 0。

谢谢

你不需要图书馆,你需要 地图。最好是矢量图,因为简单的位图不会有任何帮助。国家/地区的边界框很好,但足以过滤掉不可能的结果(如果您在欧洲,则无需测试阿根廷)。

您可以使用 VMAP level 0 地图(整个世界地图很容易找到),它分为 4 个大区域,代表整个世界。整个东西大约有 400 MB,将它存储在数据库中而不是直接使用 shapefile 是个好主意。通过删除不需要的数据(河流、森林、湖泊、城镇……)并仅保留国家边界,您可能可以节省很多 space。

一旦你完成并为你的程序做好准备,你就必须解决这个问题:“有数百个地理参考多边形和一个地理位置,我在哪个多边形中?”。 =33=] 完成此操作后,您将获得国家/地区名称作为多边形元数据的简单条目。 您可以在 20 MB 内轻松获取所需的数据。

也许您在这一步需要一个数学库,但如果没有嵌入的可用地图,您就会陷入困境。

注意:VMAP 级别 0 (a.k.a. "VMAP0") 精度不高。当位置靠近边界时,您可能需要扩展多边形,也许 return 几个国家名称。例如,如果您在摩纳哥、列支敦士登或安道尔,可能很难 return 一个有效的名称...对于像 VMAP0 这样粗糙的地图来说太小了。

对于这些多边形扩展,您可能需要制图库。另一种解决方案是不断将您的位置扩展到一个圆圈(半径至少为 1 秒),在周长 + 中心(N、NE、E、SE、S、SW、W、NW、中心)上获得 8 个点,然后查看哪些名称是 returned。比多边形扩展 CPU 在运行时 更密集 (这 can/should 可以离线完成,您应该将扩展的多边形直接存储在数据库中),但它可以节省您从获得像样的制图库并学习如何使用它。

不要忘记:地图处理是一个离线过程,仅完成一次。获取数据后,将其存储在您喜欢的任何数据库中(SQlite 应该没问题,如果您不担心将其加载到 RAM 中,即使是简单的结构化文件也可以)。