Posts Tagged ‘google’
下载google maps地图
最近在写一个iPhone上的程序, 其中用到了google maps, 最简单的做法是在程序中嵌入一个UIWebView然后加载一个网页,在网页中写上一段javascript并包含google maps 地图对象即可, 这样的做法简单但有很大的弊端。 主要是效率以及稳定性的问题, UIWebView似乎是缓存了很多文件, 而又没有开放的接口用于释放清除这些缓存内容,这就导致程序可使用内存越来越小,直至崩溃,尤其是如果要同时使用UIImagePickerController那就更严重。 所以只要自己写maps 显示模块, 基本思路是给定一个中心点 地理坐标也就是经纬度, 然后计算所在图块(Tile Maps)的序号,根据当前放大倍数构建URL 然后在使用多线程下载小图块后显示。
由此思路, 便开始着手找资料, 互联网是个好东西, 只要你细心去找肯定能找到自己想要的内容。 首先就是计算给定经纬度的点所在的图块编号,每个图块由其所在的纵横X,Y序号组成,这里给出几个基本函数可用于计算
根据经纬度计算X,Y序列号, zoom为所需要的放大倍数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | static int LatitudeToYAtZoom( double lat, int zoom ) { double arc = EARTH_CIRCUM / ( 1<<zoom ); double result = DegToRad( lat ); result = sin( result ); result = (result+1) / (1-result ); result = log( result ); result *= EARTH_RADIUS / 2; result = (EARTH_HALF_CIRC - result ) / arc; return (int) round( result ); } static int LongitudeToXAtZoom( double lon, int zoom ) { double arc = EARTH_CIRCUM / ( 1 << zoom ); double result = DegToRad( lon ); result *= EARTH_RADIUS; result += EARTH_HALF_CIRC; result /= arc; return (int) round( result ); } |
你也可以根据图块号计算图块中心所在的经纬度坐标
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | static double YToLatitudeAtZoom ( int y, int zoom ) { double arc = EARTH_CIRCUM / ( 1 << zoom ); double metersY = EARTH_HALF_CIRC - (y * arc ); double a = exp(metersY * 2 / EARTH_RADIUS ); double result = RadToDeg( asin((a-1) / (a+1) ) ); return result; } static double XToLongitudeAtZoom( int x, int zoom ) { double arc = EARTH_CIRCUM / ( 1 << zoom ); double metersX = (x * arc) - EARTH_HALF_CIRC; double result = RadToDeg( metersX / EARTH_RADIUS ); return result; } |
程序中用到的辅助函数,主要是转换弧度与角度的
1 2 3 4 5 6 7 8 | static double RadToDeg( double d ) { return d / PI * 180.0; } static double DegToRad( double rad ) { return rad* PI / 180.0; } |
还有几个重要的常量数据
1 2 3 4 | const double PI = 3.1415926; const double EARTH_RADIUS = 6378137.0; const double EARTH_CIRCUM = EARTH_RADIUS * 2.0 * PI; const double EARTH_HALF_CIRC = EARTH_CIRCUM / 2; |
接下来就是根据计算出的X,Y以及zoom来下载地图图块, google maps 一般的图块url形如 http://mt0.google.com/mt?v=w2.88&hl=en&x=&y=&s=&z=
其中mt0 中的‘0′ 之能是 0 - 3中的任一个数字, x是图块所在横向编号,y是图块所在纵向编号, z就是所需要的放大级数, 在程序下载的时候只需要格式化一下这个url即可
1 2 3 | static int tileServer = 0; //........ NSString* url = [NSString stringWithFormat:@"http://mt%d.google.com/mt?v=w2.88&hl=en&x=%d&y=%d&s=&z=%d", tileServer % 4, X,Y,zoomLevel]; |
注意 zoomLevel一般的范围是1-17。
关于下载的部分,可以根据自己的实际需要来实现, 还有要注意在移动以及放大缩小的时候计算新的图块重新下载绘制, 这里可以使用一些缓存技术以加快显示,带来更好的用户体验。
该文只是简单的介绍了下google maps 图块的原理和使用, 更多的内容欢迎大家一起探讨:)
Google先进语音搜索功能将登陆iPhone
据纽约时报的最新报道,搜索巨头Google将推出先进的语音搜索服务,首先尝鲜此项服务的将是苹果iPhone。通过iPhone和Google语音搜索服务,用户可直接向手机语音发出诸如“珠穆朗玛峰有多高?”的问题,很快既有结果返回。
语音搜索服务是Google潜心多年开发的先进搜索技术,Google语音搜索技术将推出专用免费软件供iPhone用户下载。语音搜索服务工作原理为:将用户提问语转换为数字文件传送至Google服务器,经搜索引擎分析,并在几秒钟内返回答案。

利用iPhone手机的定位功能,Google语音服务可以发挥更为强大的作用,比如用户发问“最近的新巴克咖啡店在哪?”,搜索结果可以直接发送定位地图。
如今的Google语音搜索服务并非尽善尽美,纽约时报称返回结果有时会出现乱码。Google工程师称未来半年左右时间会变得更为稳定。相信这项服务马上也会在Google Android平台手机上实现。

Google工程师Vic Gundotra(右)和Gummi Hafsteinsson