Monthly Archives: July 2012

Picking Up The Pieces

前段时间听英国单曲榜时听到了这首歌,觉得还不错,虽然名次不怎样,还是推荐下。

这首歌名字叫:Picking Up The Pieces
演唱者:Paloma Faith(帕洛玛费丝)

不知道怎么,最近超喜欢听英国歌(就是英国乐队或歌手唱的)。

最后再分享下这个MV(720P):http://115.com/file/anrvk6c2#Paloma Faith – Picking Up The Piecesm.mkv

HTML5位置服务( Geolocation API)

HTML5中提供了能够得到当前设备位置的接口Geolocation API,可以使用相关的JavaScript方法获得当前位置的经纬度以及海拔和速度数据。
W3C对此接口的具体解释可以看:http://www.w3.org/TR/geolocation-API/

因为位置是个人隐私信息,所以当需要取得用户位置信息的时候浏览器(系统)将会提示用户,只有在允许的情况下才可以使用;某些移动设备中还需要设置“分享位置”才能使用此服务。

位置的获得原理是通过设备自身的GPS装置(通过GPS卫星定位,误差能在10米以内),Wifi热点(根据你周围的Wifi热点算出你的位置,误差在100米以内),其次是蜂窝网络基站(我们熟悉的GMS,WCDMA,CDMA2000,LTE,此误差在1千米内),最差的是通过IP定位(非常不靠谱)。

支持Geolocation API的浏览器:
Firefox 3.5+
Chrome 5.0+
Safari 5.0+
Opera 10.60+
Internet Explorer 9.0+

支持Geolocation API的移动系统
Android 2.0+
iPhone 3.0+
Opera Mobile 10.1+
Symbian (S60 3rd & 5th generation)
Blackberry OS 6
Maemo

可以看到IE8以下的IE浏览器不支持,也几乎所有的智能手机都支持。

很多朋友反映Android 4.0中出现了无法获取位置信息的问题,我也在网上查询了相关的资料然后做了些测试;以下是产生的原因和解决方案:
1、很多国行的手机已经去掉了Google的原生服务,而基站和wifi定位其实就是依赖Google的基础服务包实现的,网上也有相关安装Google基础服务包的文章。
2、中国大陆墙了很多Google的服务,而定位服务器也是需要发起相关请求的,因为使用的也是Google的服务,所以也有被墙的风险。
第三方浏览器:即使原生的浏览器不能使用定位服务器,并不代表第三方浏览器也不支持,很多浏览器有自己的定位服务接口,比如Firefox、QQ,而且速度可能比你想象的快。
产品解决方案:在很多产品设计中,定位不是核心需求,而是一个景上添花的需求,那么我们可以设置一个超时,如果实在取得不了位置信息就给用户一个友好的提示。

火星坐标
首先我们了解下偏移的原因:天朝测绘局以国家安全为理由,用法律的形式对所有在天朝发行的地图类产品加了强制性规范,要 求所有地图类产品都必须使用国家测绘局的一种加偏移的算法,对地图的真实坐标进行加偏移处理,之后才可能通过审批准许上市。因此,天朝的所有官方及商用地 图的坐标都是偏移的,这种偏移属于非线性的,偏移量在300至1000米不等,偏移方向也不定。这种加过偏移的地图坐标就是所谓“火星坐标”。
偏移的官方解决方案:国家 Bao Mi 插件,也叫做加密插件或者加偏或者SM模组,其实就是对真实坐标系统进行人为的加偏处理,按照几行代码的算法,将真实的坐标加密成虚假的坐标,而这个加偏 并不是线性的加偏,所以各地的偏移情况都会有所不同。
偏移的民间解决方案:通过百度、google等公司的纠偏接口(好像有些已不能使用);还有就是通过网上流传出来的火星坐标数据库,然后通过简单的线性计算;如果你都觉得麻烦,那就用卫星图展示吧(因为卫星图不是地图,所以天朝相关部门管不了)。

Geolocation API存在于navigator对象中,只包含3个方法:
1、getCurrentPosition
2、watchPosition
3、clearWatch

getCurrentPosition()函数
getCurrentPosition(successCallback, errorCallback[, options])
successCallback 成功时的回调
errorCallback 失败时的回调
options 参数设置,选填

1、successCallback
coords.latitude 纬度
coords.longitude 经度
coords.altitude 高度
coords.accuracy 精确度
coords.altitudeAccuracy 高度的精确度
coords.heading 设备正北顺时针前进的方位
coords.speed 设备外部环境的移动速度(m/s)
timestamp 当位置捕获到时的时间戳

2、errorCallback
message 错误信息
code 错误代码。
0 — UNKNOW_ERROR:表示不包括在其它错误代码中的错误,这里可以在 message 中查找错误信息
1 — PERMISSION_DENIED:表示用户拒绝浏览器获取位置信息的请求
2 — POSITION_UNAVALIABLE:表示网络不可用或者连接不到卫星
3 — TIMEOUT:表示获取超时。必须在options中指定了timeout值时才有可能发生这种错误

3、options
enableHighAccuracy 参数表示是否高精度可用,为Boolean类型,默认为false,如果开启,响应时间会变慢。
timeout 参数表示等待响应的最大时间,默认是0毫秒,表示无穷时间。
maximumAge 表示应用程序的缓存时间。单位毫秒,默认是0,意味着每次请求都是立即去获取一个全新的对象内容。

watchPosition()函数
watchPosition(successCallback, errorCallback[, options])
watchPosition 的三个参数和 getCurrentPosition 完全一样。不同在于它像一个监视器时刻监视用户的位置,只要发生变化,就会触发回调函数。
此函数返回值是一ID,可以使用clearWatch清除此ID相关的事件。

clearWatch()函数
clearWatch(id)
用来清除对用户位置的循环监视。

代码:

if(navigator.geolocation){//判断是否可以使用getCurrentPosition
	navigator.geolocation.getCurrentPosition(
		function(o){//成功时
			var html = 'Latitude: '+o.coords.latitude
			+';Longitude: '+o.coords.longitude
			+';Altitude: '+o.coords.altitude
			+';Accuracy: '+o.coords.accuracy
			+';Alt Accuracy: '+o.coords.altitudeAccuracy
			+';Heading: '+o.coords.heading
			+';Speed: '+o.coords.speed
			+';Timestamp: '+o.timestamp;
			alert(html);
		},
		function(o){//失败时
			var html = 'Code: '+o.code
			+';Message: '+o.message;
			alert(html);
		}
	);
}else{
	alert('not geolocation');
}

示例地址:http://honglei.net/demo/geo.html