为了账号安全,请及时绑定邮箱和手机立即绑定

如何遍历 Java 中的每个纬度/经度

如何遍历 Java 中的每个纬度/经度

慕姐4208626 2021-09-12 16:13:07
我正在访问这个给我全球天气的 API:https://callforcode.weather.com/doc/v3-global-weather-notification-headlines/但是,它需要 lat/lng 作为输入参数,我需要整个世界的数据。我想我可以遍历每个纬度经度,每 2 个纬度和 2 个经度,给我一个世界上的点,每约 120 英里,大约 100 度北/南,这应该给我 16,200 个 API 调用中的所有数据((360/2) * (180/2))。我怎样才能在 Java 中有效地做到这一点?我想到了这样的东西;但是有没有更好的方法来做到这一点?for(int i = 0; i < 360; i+2){  var la = i;  for(int x = 0 x < 180; x+2) {    var ln = x;    //call api with lat = i, lng = x;  }}
查看完整描述

1 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

这在某种程度上是一种范式转变,但我不会对这个问题使用嵌套的 for 循环。在许多情况下,您正在考虑对整个结果集进行迭代,通常可以在不损失太多或任何有效性的情况下大幅削减覆盖率。缓存、修剪、确定优先级……这些是您需要的:不是 for 循环。

  1. 完全切开部分 - 也许你可以忽略海洋,也许你可以忽略南极和北极(因为那里的人无论如何都有更好的方法来检查天气)

  2. 根据人口密度更改搜索频率。也许加拿大北部不需要像洛杉矶或芝加哥那样彻底检查。

  3. 依靠低使用率区域的缓存 - 大概您可以跟踪实际使用的区域,然后可以更频繁地刷新这些部分。

所以你最终得到的是某种加权缓存系统,它考虑了人口密度、使用模式和其他优先级,以确定要检查的纬度/经度坐标以及检查频率。高级代码可能如下所示:

void executeUpdateSweep(List<CoordinateCacheItem> cacheItems)

{

    for(CoordinateCacheItem item : cacheItems)

    {

        if(shouldRefreshCache(item))

        {

            //call api with lat = item.y , lng = item.x

        }

    }

}


boolean shouldRefreshCache(item)

{

    long ageWeight = calculateAgeWeight(item);//how long since last update?

    long basePopulationWeight = item.getBasePopulationWeight();//how many people (users and non-users) live here?

    long usageWeight = calculateUsageWeight(item);//how much is this item requested?


    return ageWeight + basePopulationWeight + usageWeight > someArbitraryThreshold;

}


查看完整回答
反对 回复 2021-09-12
  • 1 回答
  • 0 关注
  • 169 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信