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

时间:2018-09-10 15:19:50

标签: java

我正在访问该API,该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 个答案:

答案 0 :(得分:1)

这有点儿范式转换,但是对于这个问题,我不会使用嵌套的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;
}