地图是由于一块一块瓦片(  tile)组成的,每个瓦片都是一张图片,将图片拼接再一起就是一张地图。

1、以Google地图为例

http://mt0.google.com/vt/lyrs=m@174000000&hl=zh-CN&src=app&s=Galileo&s=&x=13721&y=6696&z=14
mt:是0-7之间的任意数字,可以理解成服务器编号
lh:地图上显示的语言
x,y,z:分别是瓦片X(行),Y(列),Z(缩放)

Google有提供JavaScript地图 SDK。SDK会根据X,Y,Z去获取图片,我们需要根据X,Y,Z返回图片即可。图片地址:file:///C:/Users/Administrator/Desktop/GoogleMap/tiles/9/417/223.png,其中9表示Z, 417表示X,223表示Y(https://mt0.google.com/vt/lyrs=m@174000000&hl=zh-CN&src=app&s=Galileo&s=&x=417&y=223&z=9),在下载图片时可以将图片按tiles/tiles/9/417/223.png的目录结构作为图片的保存路径。

2.Java瓦片计算算法

经纬度与瓦片相互转换

public static void main(String[] args) {
        //根据经纬度和缩放计算出瓦片X,Y(Google map)
        toxy();
        //根据经纬度和缩放计算出瓦片X,Y(TMS)
        totilexy();
        //根绝瓦片X,Y,Z计算出经纬度
        tolonlat();
    }

    public static void toxy() {
        int zoom = 14;
        double vlong = 121.49308;
        double vlat = 31.18903;
        double tilex = long2tile(vlong, zoom);
        double tiley = lat2tile(vlat, zoom);

        System.out.println("GMap tilex=" + tilex + "\ttiley=" + tiley);
    }

    public static void totilexy() {

        int zoom = 14;
        double vlong = 121.49308;
        double vlat = 31.18903;

        double tilex = long2tileX(vlong, zoom);
        double tiley = lat2tileY(vlat, zoom);

        System.out.println("TMS tilex=" + tilex + "\ttiley=" + tiley);
    }

    public static void tolonlat() {

        int vzoom = 14;
        double xlong = 13721;
        double ylat = 6696;

        double rXlong = tile2long(xlong, vzoom);
        double rYlat = tile2lat(ylat, vzoom);

        System.out.println("Gmap: xlong=" + xlong + "\tylat=" + ylat + "\t Result: rXlong=" + rXlong + "\trYlat=" + rYlat);
    }

    public static double tile2long(double x, int z) {
        return (x / Math.pow(2, z) * 360 - 180);
    }

    public static double tile2lat(double y, int z) {
        double n = Math.PI - 2 * Math.PI * y / Math.pow(2, z);
        return (180 / Math.PI * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n))));
    }

    public static double long2tileX(double lon, int zoom1) {
        double tt = lon;
        return (Math.floor((tt + 180) / 360 * Math.pow(2, zoom1)));
    }

    public static double lat2tileY(double lat, int zoom2) {
        return ((1 << zoom2) - (Math.floor((1 - Math.log(Math.tan(lat * Math.PI / 180) + 1 / Math.cos(lat * Math.PI / 180)) / Math.PI) / 2 * Math.pow(2, zoom2))) - 1);
    }

    public static double long2tile(double lon, int zoom1) {
        double tt = lon;
        return (Math.floor((tt + 180) / 360 * Math.pow(2, zoom1)));
    }

    public static double lat2tile(double lat, int zoom2) {
        return (Math.floor((1 - Math.log(Math.tan(lat * Math.PI / 180) + 1 / Math.cos(lat * Math.PI / 180)) / Math.PI) / 2 * Math.pow(2, zoom2)));
    }

3.其他相关资料

最后修改:2022 年 09 月 05 日
如果觉得我的文章对你有用,请随意赞赏