现在的网络地图大多采取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