Categories

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先进语音搜索功能将登陆iPhone
Google工程师Vic Gundotra(右)和Gummi Hafsteinsson