google离线切片加载要点
2016-07-17 16:46
405 查看
google离线切片下载工具:全能电子地图下载器1.95 ,网上可以找到破解工具
google地图采用Web墨卡托投影,其世界坐标范围为【 -20037508, -20037508,20037508, 20037508.34
】,离线地图加载方式与天地图等切片加载方法及流程完全相同,只是个别参数需要调整,
1、google切片的行列号与天地图的行列号是反着的, google的col 为天地图的row
2、切片原点为 【-20037508.3427892,20037508.3427892】
3、谷歌切片为平面投影切片,其 resolution 分辨率为 距离分辨率(单位m),即图片上每个像素代表的实际距离,可以通过简单方法来计算
假想第0级切片为一张256*256的世界地图,其面积为( 20037508+[b] 20037508[/b])*( 20037508+[b] 20037508[/b]),
所以每个像素代表的距离就是 (20037508+ 20037508)/256 = 156543.0339
则每一级切片的距离分辨率为: 156543.0339 / pow(2,level);
有了这些基本参数,后面的的坐标和行列号的转换和其他切片是一样一样的
4、通过坐标找行列号
public function getTileRowColByCoord(pt:Point, rowCol:Object, resolution:Number):void
{
var qRow:Number = Math.abs(pt.y - m_tilePoint.y) / (tileSize * resolution);
var qCol:Number = Math.abs(pt.x - m_tilePoint.x) / (tileSize * resolution);
//向下舍入
rowCol.row = Math.floor(qRow);
rowCol.col = Math.floor(qCol);
}
5、通过行列号找坐标
//通过行列获取地理坐标
public function getCoordByRowCol(row:int, col:int,level:Number):Point
{
var pt:Point = new Point();
m_curResolution = getResolution(level);
var y:Number = Math.abs(m_tilePoint.y - row * (tileSize * m_curResolution));
var x:Number = Math.abs(col * (tileSize * m_curResolution ) + m_tilePoint.x);
pt.x = x;
pt.y = y;
return pt;
}
到此基本就搞定了,只是有点不爽的是用的都是web墨卡托投影坐标,坐标值不是咱们印象中的WGS-84的经度、纬度值,但也有标准的方法来转换
/**
wgs84转为墨卡托坐标(经纬度转墨卡托)
lon : w84经度
lat : w84纬度
*/
public function forwardMercator(lon,lat):Array {
lon = parseFloat(lon);
lat = parseFloat(lat);
var x = lon * 20037508.34 / 180;
var y = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180);
y = y * 20037508.34 / 180;
return [x,y];
};
/**
将墨卡托坐标转为wgs84(墨卡托转经纬度)
x : 墨卡托经度
y : 墨卡托纬度
*/
public function inverseMercator(x, y):Array {
var lon = (x / 20037508.34) * 180;
var lat = (y / 20037508.34) * 180;
lat = 180/Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);
return [lon, lat];
};
推荐几个技术链接参考:
WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理http://blog.sina.com.cn/s/blog_5d25ac4e0102v6kb.html
Google投影说明:http://blog.csdn.net/mygisforum/article/details/8162751
当然还有:http://blog.csdn.net/chaiqi/article/details/8025973
google地图采用Web墨卡托投影,其世界坐标范围为【 -20037508, -20037508,20037508, 20037508.34
】,离线地图加载方式与天地图等切片加载方法及流程完全相同,只是个别参数需要调整,
1、google切片的行列号与天地图的行列号是反着的, google的col 为天地图的row
2、切片原点为 【-20037508.3427892,20037508.3427892】
3、谷歌切片为平面投影切片,其 resolution 分辨率为 距离分辨率(单位m),即图片上每个像素代表的实际距离,可以通过简单方法来计算
假想第0级切片为一张256*256的世界地图,其面积为( 20037508+[b] 20037508[/b])*( 20037508+[b] 20037508[/b]),
所以每个像素代表的距离就是 (20037508+ 20037508)/256 = 156543.0339
则每一级切片的距离分辨率为: 156543.0339 / pow(2,level);
有了这些基本参数,后面的的坐标和行列号的转换和其他切片是一样一样的
4、通过坐标找行列号
public function getTileRowColByCoord(pt:Point, rowCol:Object, resolution:Number):void
{
var qRow:Number = Math.abs(pt.y - m_tilePoint.y) / (tileSize * resolution);
var qCol:Number = Math.abs(pt.x - m_tilePoint.x) / (tileSize * resolution);
//向下舍入
rowCol.row = Math.floor(qRow);
rowCol.col = Math.floor(qCol);
}
5、通过行列号找坐标
//通过行列获取地理坐标
public function getCoordByRowCol(row:int, col:int,level:Number):Point
{
var pt:Point = new Point();
m_curResolution = getResolution(level);
var y:Number = Math.abs(m_tilePoint.y - row * (tileSize * m_curResolution));
var x:Number = Math.abs(col * (tileSize * m_curResolution ) + m_tilePoint.x);
pt.x = x;
pt.y = y;
return pt;
}
到此基本就搞定了,只是有点不爽的是用的都是web墨卡托投影坐标,坐标值不是咱们印象中的WGS-84的经度、纬度值,但也有标准的方法来转换
/**
wgs84转为墨卡托坐标(经纬度转墨卡托)
lon : w84经度
lat : w84纬度
*/
public function forwardMercator(lon,lat):Array {
lon = parseFloat(lon);
lat = parseFloat(lat);
var x = lon * 20037508.34 / 180;
var y = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180);
y = y * 20037508.34 / 180;
return [x,y];
};
/**
将墨卡托坐标转为wgs84(墨卡托转经纬度)
x : 墨卡托经度
y : 墨卡托纬度
*/
public function inverseMercator(x, y):Array {
var lon = (x / 20037508.34) * 180;
var lat = (y / 20037508.34) * 180;
lat = 180/Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);
return [lon, lat];
};
推荐几个技术链接参考:
WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理http://blog.sina.com.cn/s/blog_5d25ac4e0102v6kb.html
Google投影说明:http://blog.csdn.net/mygisforum/article/details/8162751
当然还有:http://blog.csdn.net/chaiqi/article/details/8025973
相关文章推荐
- 百度地图经纬度转换到腾讯地图/Google 对应的经纬度
- Windows下C#的GUI窗口程序中实现调用Google Map的实例
- iOS开发之离线地图核心代码
- 基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标
- 在Google 地图上实现做的标记相连接
- PHP计算百度地图两个GPS坐标之间距离的方法
- sogou地图API用法实例教程
- Android实现带列表的地图POI周边搜索功能
- 使用OpenLayers3 添加地图鼠标右键菜单
- Python和Perl绘制中国北京跑步地图的方法
- iOS 高德地图(-)(基础篇)
- iOS 高德地图(二)(进阶具体使用的细节)
- gps各种地图坐标系转换
- [IOS地图开发系类]1、CLLocationManager 位置定位
- [IOS地图开发系类]2、位置解码CLGeocoder
- [IOS地图开发系类]3、地图视图MKMapview
- [IOS地图开发系类]4、MKMapview上添加MKAnnotationView,标记当前位置
- [IOS地图开发系类]5、改变大头针MKPinAnnotationView的颜色
- 使用CSS3设计地图上的雷达定位提示效果
- 移动互联风口频现,百度高德谁已手握地图关键钥匙