[转]层行列和经纬度坐标之间的相互转化方法(谷歌地图)

Posted rainbow70626

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[转]层行列和经纬度坐标之间的相互转化方法(谷歌地图)相关的知识,希望对你有一定的参考价值。

谷歌地图层行列是以左上角为原点,瓦片编号是向右和向下,没有负数。

谷歌是从左上角经纬度(-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)计算出谷歌各层瓦片编号。

技术图片

————————————————
原文链接:层行列和经纬度坐标之间的相互转化方法(谷歌地图)

以上是关于[转]层行列和经纬度坐标之间的相互转化方法(谷歌地图)的主要内容,如果未能解决你的问题,请参考以下文章

百度坐标转化细节

将经纬度坐标转化为xy坐标有啥好处

GPS经纬度坐标如何转化为图上坐标

如何利用arcgis将CAD中的规划文件坐标转化为经纬度坐标?

经纬度转化的地球坐标转成unity的坐标

[转]地球坐标 火星坐标 百度坐标 相互转换