标签:class 图层 article 坐标 情况 inf static 维度 blank
谷歌地图层行列是以左上角为原点,瓦片编号是向右和向下,没有负数。
谷歌是从左上角经纬度(-180,90)度开始计算瓦片,在第0级时谷歌将世界地图分为1块,第1级的时候分为4块。
层zoom(z),列col(x),行row(y)
如何在已知层行列情况计算出该瓦片对应的经纬度坐标,和已知经纬度情况下计算该点在不同层级下的瓦片位置,以左上角为原点。
/** * 谷歌下转换经纬度对应的层行列 * * @param lon 经度 * @param lat 维度 * @param zoom 在第zoom层进行转换 * @return */ public static int[] GoogleLonLatToXYZ(double lon, double lat, int zoom) { double n = Math.pow(2, zoom); double tileX = ((lon + 180) / 360) * n; double tileY = (1 - (Math.log(Math.tan(Math.toRadians(lat)) + (1 / Math.cos(Math.toRadians(lat)))) / Math.PI)) / 2 * n; int[] xy = new int[2]; xy[0] = (int) Math.floor(tileX); xy[1] = (int) Math.floor(tileY); return xy; } /** * 层行列转经纬度 * * @param x * @param y * @param z * @return */ public static double[] XYZtoLonlat(int z, int x, int y) { double n = Math.pow(2, z); double lon = x / n * 360.0 - 180.0; double lat = Math.atan(Math.sinh(Math.PI * (1 - 2 * y / n))); lat = lat * 180.0 / Math.PI; double[] lonlat = new double[2]; lonlat[0] = lon; lonlat[1] = lat; return lonlat; }
如果想已左下角为原点的xyz,只需要将y轴反转即可:
int ext = (int) Math.pow(2, z); int changeRow = ext - row - 1;
以北京天安门的地理坐标点(116.407945,39.91349)计算出谷歌各层瓦片编号。
————————————————
原文链接:层行列和经纬度坐标之间的相互转化方法(谷歌地图)
标签:class 图层 article 坐标 情况 inf static 维度 blank
原文地址:https://www.cnblogs.com/rainbow70626/p/12417215.html