整个行星的Openstreetmap矩形网格

问题描述 投票:0回答:1

我试图为整个世界生成矩形网格,固定单元格大小为350米(宽度和高度相等)。

我试图做的:

1)在主循环中迭代范围内的经度[-180; 180]

2)在嵌套循环中迭代范围内的纬度[-85.06; 85.06](Web mercator界限)

3)使用Java GeographicLib Geodesic.WGS84.Direct()增加连接到东(在主循环中)和北(在嵌套循环中)350米的单元格。

Java代码:

double lon_min = -180;
double lon_max = 180;
double lat_min = -85.06;
double lat_max = 85.06;

double lon_max_c = lon_min;
double lon_min_c = lon_min;

int grid_x = 0;
int grid_y = 0;
int cell_id = 0;

while(lon_max_c < lon_max)
{
    double lat_min_c = lat_min;
    double lat_max_c = lat_min;

    lon_min_c = lon_max_c;
    GeodesicData g = Geodesic.WGS84.Direct(lat_min_c, lon_min_c, 90, 350);

    boolean isXlast = g.lon2 > lon_max || (lon_min_c > 0 && g.lon2 < 0);
    lon_max_c = isXlast? lon_max : g.lon2;

    grid_y = 0;

    while(lat_max_c < lat_max)
    {
        lat_min_c = lat_max_c;

        GeodesicData g1 = Geodesic.WGS84.Direct(lat_min_c, lon_min_c, 0, 350);

        boolean isYlast = g1.lat2 > lat_max;
        lat_max_c = isYlast? lat_max : g1.lat2;

        System.out.print("\rid: " +  cell_id + " lon: " + lon_max_c + " lat: " + lat_max_c);

        grid_y = grid_y + 1;
        cell_id = cell_id + 1;
    }
    grid_x = grid_x + 1;
}

结果,产生了约5.3亿个细胞。然而,整个行星的面积是~510M平方公里。因此,细胞总数应该约为40亿。我对测地数学很新,所以有什么不对?我该怎么做才能正确生成这个网格?

grid openstreetmap mercator geodesic-sphere
1个回答
0
投票

整个世界的矩形网格,固定单元格大小为350米(宽度和高度相等)

你想要做的事情是不可能的,因为地球不是一个矩形。请参阅https://en.wikipedia.org/wiki/Map_projection了解更多信息的起点。

虽然对于小区域可以忽略这种影响,但是像“经度范围[-180; 180]”,“纬度范围[-85.06; 85.06]”那样忽略它是不可行的。

© www.soinside.com 2019 - 2024. All rights reserved.