瓦片数据分片算法与规则

    现在的网络地图大多采取TMS(瓦片地图服务)的存储方式,是用REST接口支持的URL参数(地理参数)来描述空间瓦片存储方式,并通过URL的get方法访问到这些瓦片的。比如GoogleMaps瓦片数据请求URL的规则为http://xxxx:port/WebServiceName?x=X&y=Y&z=Z,其中Z为缩放级别,X为瓦片的衡中做参考点坐标。


      假设地图投影为平面,缩放级别从17(完全缩小)到0(最大比例)。当放大因子为17时,整个地球在一个tile中显示,此时x=0 ,y=0;放大因子为16时,地球被分为2x2部分,这时0<=x<=1 且0<=y<=1。每放大一次,每个tile被分为4个部分。因此,当放大因子为z时,显示的水平和垂直tile个数为2^(17-z)。实际上GoogleMaps在显示时使用了墨卡托投影,因此上述的算法需要进行修改。在墨卡托投影中,两条纬线间的距离不一定相等,所以纬度对应的titley会依据它的垂直位置。

以下代码为从tile的纬度位置计算的tile的垂直个数

Collapse

        

private intgetMercatorLatitude(double lati)
        {
            double maxlat =Math.PI;
            double lat = lati;
            if (lat > 90)lat = lat - 180;
            if (lat < -90)lat = lat + 180;
            // conversiondegre=>radians
            // 转换度数到弧度
            double phi =Math.PI * lat / 180;
            double res;
            //double temp =Math.Tan(Math.PI / 4 + phi / 2);
            //res =Math.Log(temp);
            //下面这一句是上面的合并
            res = 0.5 *Math.Log((1 + Math.Sin(phi)) / (1 - Math.Sin(phi)));
            double maxTileY =Math.Pow(2, zoom);
            int result =(int)(((1 - res / maxlat) / 2) * (maxTileY));
            return (result);
        }

  

覆盖地带:理论上,纬度范围应该是-90度到90度,但事实上,由于墨卡托投影使得两级无穷大,覆盖的地带小于-90 到 90。

本系统中以平面映射简化转化,具体如下:单位瓦片的跨度 span= res* this.tileSize.w ,用分辩率乘以瓦片大小,可以得到单位瓦片的对应坐标的跨度:

瓦片行列号:

X=Round((bounds.left-x)/spanX)
Y=Round((y-bounds.top)/spanY)

这里(x,y)是参考点坐标,选择了单位瓦片的左上角与参考点的偏移量再除以单位瓦片的跨度,然后进行四舍五入取整,就可以得到瓦片行列号,可见,瓦片行列号与瓦片的地理坐标是一一对应的关系。所以,这也被用来做为瓦片的地理编码。

在TMS中,我们可以根据网络地图的URL参数的排列方式,重写URL,就可以做到访问指定的网络地图的静态PNG瓦片了  

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。

http://blog.csdn.net/a511596982/article/details/8046626


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值