GIS中墨卡托与WGS 84的瓦片编号计算方法

GIS中墨卡托与WGS 84的瓦片编号计算方法

  在GIS中计算瓦片的编号,墨卡托与WGS 84的计算方法与瓦片行列号是不一样的,为什么会有这样的差异呢?主要是因为我们的墨卡托是投影坐标系,WGS 84是地理坐标系;那么我们首先需要了解什么是什么是地理坐标系,什么是投影坐标系。

什么是地理坐标系?

  地理坐标系 (GCS)使用三维球面来定义地球上的位置。GCS 通常被错误地称为基准,但基准只是 GCS 的一部分。GCS 包括角度测量单位、本初子午线和基准面(基于椭球体)。

  一个点由其经度和纬度值组成。经度和纬度是从地球中心到地球表面上一点的角度。角度通常以度数(或刻度)为单位。下图将世界显示为具有经度和纬度值的地球。

在这里插入图片描述
  在球面系统中,水平线或东西线是等纬度线或平行线。垂直线或南北线是等经线或经线。这些线环绕地球并形成称为经纬网的网格网络。

  两极之间的纬度线称为赤道。它定义了零纬线。零经线称为本初子午线。对于大多数地理坐标系,本初子午线是经过英格兰格林威治的经度。其他国家使用经过伯尔尼、波哥大和巴黎的经线作为本初子午线。标线 (0,0) 的原点由赤道和本初子午线的交点定义。然后将地球分为四个地理象限,这些象限基于来自原点的罗盘方位。南北在赤道上下,东西在本初子午线左右。

  纬度和经度值传统上以十进制度或度、分和秒 (DMS) 测量。纬度值是相对于赤道测量的,范围从南极的 -90° 到北极的 +90°。经度值是相对于本初子午线测量的。它们的范围从西行时的 -180° 到东行时的 180°。如果本初子午线在格林威治,那么位于赤道以南、格林威治以东的澳大利亚的经度值为正,纬度值为负。

  将经度值等同于 X 并将纬度值等同于 Y 可能会有所帮助。在地理坐标系上定义的数据会显示为度数是线性测量单位。这种方法与 Plate Carrée 投影基本相同。

什么是投影坐标系?

  投影坐标系定义在平坦的二维表面上。与地理坐标系不同,投影坐标系在两个维度上具有恒定的长度、角度和面积。投影坐标系始终基于基于球体或椭球体的地理坐标系。

  在投影坐标系中,位置由网格上的 x,y 坐标标识,原点位于网格的中心。每个位置都有两个值将其引用到该中心位置。一个指定它的水平位置,另一个指定它的垂直位置。这两个值称为 x 坐标和 y 坐标。使用这种表示法,原点的坐标是 x = 0 和 y = 0。

  在等间距的水平和垂直线的网格网络上,中心的水平线称为 x 轴,中心的垂直线称为 y 轴。单位在 x 和 y 的整个范围内是一致且等距的。原点上方的水平线和原点右侧的垂直线具有正值;下方或左侧的值为负值。四个象限代表正负 X 和 Y 坐标的四种可能组合。

在地理坐标系中处理数据时,有时将经度值等同于 X 轴,将纬度值等同于 Y 轴是很有用的。
在这里插入图片描述

墨卡托与WGS 84在展示上的区别

墨卡托
在这里插入图片描述
WGS 84
在这里插入图片描述

通过两各坐标系的图片对比,我们可以很轻易的发现,84的地图比墨卡托的地图要扁一点;那么在了解到区别之后我们下面就来分别计算两种瓦片的编号的计算方法。

墨卡托瓦片计算方法

瓦片级别参数是0(缩小)到18(放大)之间的整数。 通常情况下,18是最大值,但有些瓦片服务器可能会超过这个值,下面我们通过一个表格来表示每个级别下的瓦片总数。

级别瓦片范围瓦片数
01*11
12*24
24*416
n 2 n ∗ 2 n 2^n*2^n 2n2n 2 2 n 2^{2n} 22n

下图为墨卡托在第2级下的瓦片编号,格式为“z-x-y”,从图中我们可以看出来,墨卡托的编号是以左上角(0,0)开始的,向右向下递增,且X与Y轴图片数量相等。
在这里插入图片描述
通过以上内容,我们就可以通过经纬度来计算出瓦片的行列号。

计算行列号:

首先我们计算行列号是针对墨卡托投影来进行计算的,所以我们要做的第一件事情就是将经纬度坐标转换为我们的墨卡托坐标,方法如下:

//地球周长一半,单位米
var grithHalf = 20037508.3427892;
//将经纬度转为墨卡托坐标
function lonlat2Mercator(l, b) {
     if (b > 85.051128)
         b = 85.051128;
     if (b < -85.051128)
         b = -85.051128;

     var x = l * grithHalf / 180;
     var y = Math.log(Math.tan((90 + b) * Math.PI / 360)) / (Math.PI / 180);
     y = y * grithHalf / 180;
     return [x, y];
}

//通过经纬度与级别获取瓦片行列号
function deg2num(l, b, zoom) {
	//此级别下瓦片的行列数
	var num = parseInt(Math.pow(2, zoom));
	var cellsize = grithHalf * 2 / num;
	//经纬度转墨卡托
	var np = lonlat2Mercator(l, b);
	var x = parseInt((np[0] + grithHalf) / cellsize);
	x = Math.max(0, x);
	x = Math.min(x, parseInt(Math.pow(2, zoom) - 1));
	var y = parseInt((grithHalf - np[1]) / cellsize);
	y = Math.max(0, y);
	y = Math.min(y, parseInt(Math.pow(2, zoom) - 1));
	return [x, y];
}

下图为运行输出结果,与上图中编号结果一致:

在这里插入图片描述
那么,说完墨卡托投影瓦片的计算方法后,下面我们继续来看84坐标系下的瓦片行列号的计算方法。

WGS 84瓦片计算方法

瓦片级别参数是1(缩小)到18(放大)之间的整数。 通常情况下,18是最大值,但有些瓦片服务器可能会超过这个值,下面我们通过一个表格来表示每个级别下的瓦片总数。

级别瓦片范围瓦片数
12*12
24*28
38*432
n 2 n ∗ 2 n − 1 2^n*2^{n-1} 2n2n1 . . . ... ...

下图为WGS84在第2级下的瓦片编号,格式为“z-x-y”,WGS 84与墨卡托的区别主要在于行与列的瓦片数量上,行数比列数要多一倍。

在这里插入图片描述

相比墨卡托,WGS 84在计算瓦片行列号的时候就不用再去进行坐标转换了,所以我们使用一个方法就可以计算出来。

计算行列号:
//使用经纬度计算瓦片行列号
function deg2num(l, b, zoom) {
    var n = parseInt(Math.pow(2, zoom));
    //计算每个瓦片单元的度数
    var cell = 360 / n;
    var x = parseInt(Math.floor((l + 180) / cell));
    var y = parseInt(Math.floor((b + 180) / cell));

    if (x < 0)
        x = 0;
    if (x >= n)
        x = parseInt(n - 1);

    if (y < 0)
        y = 0;
    if (y >= n)
        y = parseInt(n - 1);

    if (zoom > 1) {
        if (y >= n / 4 * 3)
            y = parseInt((n / 4 * 3) - 1);
        if (y < n / 4)
            y = parseInt(n / 4);
    }
    return [x, y];
}

下图就是我们在调用方法后输出的结果,与上面图片中的编号也能对应上。

在这里插入图片描述
到这里我们计算墨卡托瓦片编号与WGS 84瓦片编号的工作就结束了,如果大家觉得我的方法还有用的话,也请大家能够点赞鼓励一下,您的鼓励是我分享的动力,谢谢各位!

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
WGS84是一种地理坐标系,而墨卡托投影是一种平面坐标系。因此,将WGS84坐标系的经纬度转换为墨卡托坐标系需要进行投影变换。 Java可以使用Proj4j库进行投影变换。以下是一个示例代码: ``` import org.osgeo.proj4j.CoordinateReferenceSystem; import org.osgeo.proj4j.CRSFactory; import org.osgeo.proj4j.ProjCoordinate; public class WGS84ToMercatorConverter { private static final String WGS84 = "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"; private static final String MERCATOR = "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext"; private final CoordinateReferenceSystem wgs84; private final CoordinateReferenceSystem mercator; public WGS84ToMercatorConverter() { CRSFactory crsFactory = new CRSFactory(); wgs84 = crsFactory.createFromParameters("WGS84", WGS84); mercator = crsFactory.createFromParameters("Mercator", MERCATOR); } public ProjCoordinate convert(double longitude, double latitude) { ProjCoordinate wgs84Coordinate = new ProjCoordinate(longitude, latitude); ProjCoordinate mercatorCoordinate = new ProjCoordinate(); mercatorCoordinate.setCoordinateReferenceSystem(mercator); mercatorCoordinate = (ProjCoordinate) wgs84Coordinate.transform(wgs84, mercatorCoordinate); return mercatorCoordinate; } } ``` 在这个示例WGS84坐标系使用了Proj4j库的参数字符串“+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs”,墨卡托坐标系使用了参数字符串“+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext”。 将经度和纬度作为参数传递给convert方法,该方法将返回对应的墨卡托坐标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值