墨卡托坐标与经纬度转换

zoom为地图层级,最小zoom=0,此时瓦片总数量为1

X轴或Y轴的瓦片数量=2^zoom

瓦片总数量=2^zoom*2^zoom

每个瓦片像素为256*256

如:当zoom=2时,X轴Y轴的瓦片数量都为2^zoom=4,瓦片总数量=2^zoom*2^zoom=16,

XY轴的像素长度=4*256=1024

        /*
        * 当zoom=2时
        * X轴或Y轴的瓦片数量=2^zoom=4
        * 每个瓦片的像素为256*256
        * X轴或Y轴的像素长度长度=256*2^zoom=256*4=1024
        *
        * 瓦片总数量=2^zoom*2^zoom=4*4=16
        *
        * 85.05112877980659 => -7.958078640513122E-13(约等于0)
        * 85.05 => 0.03721464739555813
        * 85 => 1.6772247409192573
        * 60 => 297.36923224116083
        * 45 => 368.3584378011699
        * 30 => 422.4770169430887
        * 北纬
        * 0 => 512.0
        * 南纬
        * -30 => 601.5229830569114
        * -45 => 655.6415621988301
        * -60 => 726.6307677588392
        * -85 => 1022.3227752590808
        * -85.05 => 1023.9627853526044
        * -85.05112877980659=>1024.000000000001
        */
        double v = latToPixel(0, 2);//
        double y1 = Math.ceil(v / 256);
        System.out.println("高德1 "+"Y轴坐标="+v+" 瓦片编号y="+y1);
        double v1 = latToPixel2(0, 2);
        double y2=Math.ceil(v1 / 256);
        System.out.println("高德2 "+"Y轴坐标="+v1+" 瓦片编号y="+y2);

//////////////////////////////////////////////////////////////////////////////
    /**
     * 高德地图瓦片坐标与Google Map、Open Street Map相同
     * 纬度到墨卡托像素Y
     */
    public double latToPixel(double lat, int zoom) {
        double siny = Math.sin(lat * Math.PI / 180);
        double y = Math.log((1 + siny) / (1 - siny));
        return (128 << zoom) * (1 - y / (2 * Math.PI));
    }



    /**
     * 高德地图瓦片坐标与Google Map、Open Street Map相同
     * 纬度到墨卡托像素Y
     */
    public double latToPixel2(double lat, int zoom) {
        double v = Math.tan(lat * Math.PI / 180) + 1 / Math.cos(lat * Math.PI / 180);
        double v1 = (1 - Math.log(v) / (Math.PI)) * Math.pow(2, zoom-1)*256;
        return v1;
    }

理解墨卡托投影原理

国内主要地图瓦片坐标系定义及计算原理

墨卡托坐标以及 墨卡托坐标转经纬度

谷歌瓦片像素点与经纬度的对应关系

Slippy map tilenames

猜你喜欢

转载自blog.csdn.net/luoguopeng/article/details/85126769