单位要做微信lbs定位位方案怎么做

微信营销解决方案之LBS精准定位营销_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
微信营销解决方案之LBS精准定位营销
上传于||文档简介
&&微​动​力​微​信​营​销​公​司​开​发​的​L​B​S​精​准​定​位​营​销​是​可​以​设​置​全​国​任​意​地​点​方​圆公​里​使​用​微​信​附​近​的​人​的​用​户​都​将​成​为​企​业​的​潜​在​客​户​,​本​文​通​过​L​B​S​定​义​、​L​B​S​推​送​的​优​势​和​L​B​S​怎​么​做​来​总​结​L​B​S​微​信​营​销​解​决​方​案​的​。
阅读已结束,如果下载本文需要使用
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
你可能喜欢基于LBS的无线定位技术方案研究--《河南科技》2014年17期
基于LBS的无线定位技术方案研究
【摘要】:文章阐述了移动定位服务(LBS)的起源、发展以及关键技术。通过对目前无线定位解决方案的比较和分析,提出了一种基于GpsOne技术的无线定位解决方案,实践表明该方案是可行和高效的。
【作者单位】:
【关键词】:
【基金】:
【分类号】:TN95【正文快照】:
1 LBS的起源与发展LBS是指通过英特网或无线网,采用无线定位,为用户提供空间信息和查询的一种增值业务[1]。LBS归属于移动GIS应用领域,涉及到地理信息服务,通讯、计算机应用,手机等技术,属于一种空间信息和计算机网络之间相互交叉的学科领域。LBS的实现方法有三种:依靠无线网
欢迎:、、)
支持CAJ、PDF文件格式,仅支持PDF格式
【相似文献】
中国期刊全文数据库
张鹏;;[J];通信世界;2009年32期
宋茂忠,许宗泽;[J];厦门大学学报(自然科学版);2002年01期
;[J];广东通信技术;2002年03期
宋茂忠,许宗泽;[J];应用科学学报;2002年04期
王艳燕,李一兵,贾玉晶;[J];信息技术;2004年02期
范馨月,皮亦鸣,周非;[J];全球定位系统;2005年03期
张毅,罗元,汪纪锋,李柱;[J];通信技术;2000年04期
黎海涛,张平;[J];电信科学;2001年09期
谷静,李明远;[J];现代电子技术;2004年01期
刘涓,郑继禹,王玫,林基明;[J];桂林电子工业学院学报;2004年06期
中国重要会议论文全文数据库
张平;鲁昌华;韩江洪;张建军;;[A];2004全国测控、计量与仪器仪表学术年会论文集(下册)[C];2004年
聂颖;张德民;田增山;;[A];现代通信理论与信号处理进展——2003年通信理论与信号处理年会论文集[C];2003年
张彩云;吴哲夫;覃亚丽;;[A];第十六届全国青年通信学术会议论文集(上)[C];2011年
聂颖;张德民;;[A];第九届全国青年通信学术会议论文集[C];2004年
毛勇;;[A];2007中国科协年会——通信与信息发展高层论坛论文集[C];2007年
陈朝;昂志敏;;[A];计算机技术与应用进展·2007——全国第18届计算机技术与应用(CACIS)学术会议论文集[C];2007年
董玉明;李小平;;[A];第八届全国信号与信息处理联合学术会议论文集[C];2009年
黄海;;[A];2009全国计算机网络与通信学术会议论文集[C];2009年
丁煦;韩江洪;刘征宇;潘承毅;;[A];全国第21届计算机技术与应用学术会议(CACIS·2010)暨全国第2届安全关键技术与应用学术会议论文集[C];2010年
曾连荪;金志华;田蔚风;;[A];惯性技术发展动能发展方向研讨会论文集[C];2004年
中国重要报纸全文数据库
闫冰;[N];网络世界;2009年
;[N];中国计算机报;2003年
小北;[N];中国邮政报;2002年
陈晨;[N];文汇报;2004年
海洋 马扬;[N];大众科技报;2007年
本报记者 计育青;[N];中国电子报;2002年
记者 刘冕;[N];北京日报;2006年
本报记者 张兆军;[N];科技日报;2006年
王宇;[N];重庆日报;2003年
;[N];人民邮电;2005年
中国博士学位论文全文数据库
王洁;[D];大连理工大学;2011年
胡佳文;[D];合肥工业大学;2013年
曹轶超;[D];东华大学;2010年
郭喆;[D];华中科技大学;2011年
傅韬;[D];华中科技大学;2011年
田孝华;[D];西安电子科技大学;2003年
尤国红;[D];大连理工大学;2013年
姚金杰;[D];中北大学;2011年
顾清华;[D];西安建筑科技大学;2010年
王浩;[D];华中科技大学;2010年
中国硕士学位论文全文数据库
叶蔚;[D];华南理工大学;2010年
赵超敏;[D];郑州大学;2012年
唐刚;[D];成都理工大学;2011年
张颖;[D];西安邮电学院;2011年
谭凌云;[D];华中科技大学;2012年
陈健;[D];电子科技大学;2011年
苏军峰;[D];北京交通大学;2013年
武霄泳;[D];郑州大学;2013年
李灵玲;[D];北京交通大学;2014年
黄建林;[D];北方工业大学;2010年
&快捷付款方式
&订购知网充值卡
400-819-9993
《中国学术期刊(光盘版)》电子杂志社有限公司
同方知网数字出版技术股份有限公司
地址:北京清华大学 84-48信箱 知识超市公司
出版物经营许可证 新出发京批字第直0595号
订购热线:400-819-82499
服务热线:010--
在线咨询:
传真:010-
京公网安备74号Android使用百度LBS SDK(二)实现定位 - 推酷
Android使用百度LBS SDK(二)实现定位
昨天初步接触了百度的LBS SDK,让应用可以通过MapView显示地图,今天在昨天的代码基础上,实现一下定位功能:
首先看一下效果图吧:
左下角的按钮可以切换模式,分为三种:
普通(LocationMode.NORMAL)、
跟随(LocationMode.FOLLOWING)、
罗盘(PASS),相信用过百度地图的同学对这几个模式不陌生吧。
下面是代码:
分别声明一个MapView和BaiduMap:
private MapView mMapV
private BaiduMap mBaiduM
在SetContentView之前要初始化SDK:
SDKInitializer.initialize(getApplicationContext());
更换定位图标的方法:
mCurrentMarker = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo); // 自定义图标
// mCurrentMarker = // 默认图标
mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker));
定位模式:
private LocationMode mCurrentM
mCurrentMode = LocationMode.NORMAL; // 普通模式
// mCurrentMode = LocationMode.FOLLOWING; // 跟随模式
// mCurrentMode = PASS; // 罗盘模式
mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker));
// 地图初始化
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
// 开启定位图层
mBaiduMap.setMyLocationEnabled(true);
// 定位初始化
mLocClient = new LocationClient(this);
mLocClient.registerLocationListener(myListener);
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);// 打开gps
option.setCoorType(&bd09ll&); // 设置坐标类型
option.setScanSpan(5000);
mLocClient.setLocOption(option);
mLocClient.start();
setScanSpan是定位时间间隔(ms),
setCoorType坐标类型分为三种:
bd09ll百度加密经纬度坐标
bd09百度加密墨卡托坐标
gcj02国测局加密经纬度坐标
定位SDK监听函数:
public class MyLocationListenner implements BDLocationListener {
public void onReceiveLocation(BDLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || mMapView == null)
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(100).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
if (isFirstLoc) {
isFirstLoc =
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.animateMapStatus(u);
public void onReceivePoi(BDLocation poiLocation) {
复写onPause,onResume,onDestory:
protected void onPause() {
mMapView.onPause();
super.onPause();
protected void onResume() {
mMapView.onResume();
super.onResume();
protected void onDestroy() {
// 退出时销毁定位
mLocClient.stop();
// 关闭定位图层
mBaiduMap.setMyLocationEnabled(false);
mMapView.onDestroy();
mMapView =
super.onDestroy();
AndroidManifest.xml中
声明Service,这一步很关键,不写则无法定位:
android:name=&com.baidu.location.f&
android:enabled=&true&
android:process=&:remote& &
&/service&
当然,Key也是不可或缺,而且必须正确的:
&meta-data
android:name=&com.baidu.lbsapi.API_KEY&
android:value=&************************& /&
最后,在AndroidManifest.xml文件中要加入需要的权限:
&!-- For BaiduMap SDK START --&
&permission android:name=&android.permission.BAIDU_LOCATION_SERVICE& &
&/permission&
&uses-permission android:name=&android.permission.BAIDU_LOCATION_SERVICE& &
&/uses-permission&
&uses-permission android:name=&android.permission.ACCESS_NETWORK_STATE& &
&/uses-permission&
&uses-permission android:name=&android.permission.ACCESS_COARSE_LOCATION& &
&/uses-permission&
&uses-permission android:name=&android.permission.INTERNET& &
&/uses-permission&
&uses-permission android:name=&android.permission.ACCESS_MOCK_LOCATION& &
&/uses-permission&
&!-- &uses-permission android:name=&android.permission.WRITE_APN_SETTINGS&&&/uses-permission& --&
&uses-permission android:name=&android.permission.ACCESS_FINE_LOCATION& &
&/uses-permission&
&uses-permission android:name=&com.android.launcher.permission.READ_SETTINGS& /&
&uses-permission android:name=&android.permission.WAKE_LOCK& &
&/uses-permission&
&uses-permission android:name=&android.permission.CHANGE_WIFI_STATE& /&
&uses-permission android:name=&android.permission.ACCESS_WIFI_STATE& /&
&uses-permission android:name=&android.permission.ACCESS_GPS& /&
&uses-permission android:name=&android.permission.READ_PHONE_STATE& /&
&uses-permission android:name=&android.permission.READ_CONTACTS& /&
&uses-permission android:name=&android.permission.CALL_PHONE& /&
&uses-permission android:name=&android.permission.READ_SMS& /&
&uses-permission android:name=&android.permission.SEND_SMS& /&
&!-- SDK1.5需要android.permission.GET_TASKS权限判断本程序是否为当前运行的应用? --&
&uses-permission android:name=&android.permission.GET_TASKS& /&
&uses-permission android:name=&android.permission.CAMERA& &
&/uses-permission&
&uses-permission android:name=&android.permission.RECORD_AUDIO& &
&/uses-permission&
&uses-permission android:name=&android.permission.WRITE_EXTERNAL_STORAGE& &
&/uses-permission&
&uses-permission android:name=&android.permission.RECEIVE_BOOT_COMPLETED& /&
&uses-permission android:name=&android.permission.BROADCAST_STICKY& /&
&uses-permission android:name=&android.permission.WRITE_SETTINGS& /&
&!-- 来电消音 --&
&uses-permission android:name=&android.permission.PROCESS_OUTGOING_CALLS& &
&/uses-permission&
&uses-permission android:name=&android.permission.READ_PHONE_STATE& /&
&uses-permission android:name=&android.permission.MODIFY_AUDIO_SETTINGS& /&
&!-- For BaiduMap SDK END --&
到此就大功告成了。
转载请注明出处:
http://blog.csdn.net/zhoumushui
我的GitHub:
/zhoumushui
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
排版有问题
没有分页内容
视频无法显示
图片无法显示最近会搬一些有关Geohash的文章来这里。嗯。
高能预警:此文属于纪录片记录了博主在知识的海洋里探索的艰辛历程,不是文档、且夹杂着大量的废话和人生感悟,如果时间紧建议您转看其他文章,比如文中的各种以这种颜色标明的原文。
背景:需要实现一个“由近到远列出当前位置周边的所有XX”的功能。
首先想到的是,以当前位置为圆心然后按不同的半径画出若干个同心圆然后再由近到远地列出来,不过马上就否定了这个幼稚的想法。首先以当前位置为圆心的原型不是固定其次…没有其次了这个首先就已经足够了。
然后就想到了按区域划分,也就是把整个区域用矩形划分然后找到当前所在位置的区域、以及该区域周围的8个区域,这些最近的排一次,如果用户还想看更远的,就再找到当前这9个区域外围的16个区域。而如何定位这些区域我想的是直接用区域的中心点坐标来计算。但是这个计算方式也不靠谱那么多区域呢怎么可能挨个算距离啊这不是跟挨个计算具体位置没什么区别了嘛。
之后朋友找到了一个叫做Geohash的方案,这样才算找到了一条正确的道路。
接下来就是初步的了解了下Geohash,但大多是类似的文章且描述的风格都很学术。所以在初步了解之后留下了这么几个问题:
1、Geohash的区域划分是有固定的库还是开发者自行划分?
2、由于用Geohash的字符串检索也会出现距离的问题(比如我在中间方框左上角的点、两个XX一个在中间方框右下角、另一个在左上方框的右下角,很明显我和左上方框的XX距离更近,但是Geohash的字符串相比我和中间方框右下角的XX更相似),于是各种文章里就说没有关系找到当前方框相邻的8个方框然后综合计算距离。那么问题就是:如何确定相邻的8个方框?
3、经纬度如何进行Geohash编码?这个问题其实看到了很多相关文章,除去了一些重复的、页面排版混乱的(比如在新浪博客里罗列整段代码简直让人对这篇文章都无法有任何好感)之后,挑着试了几个,但是总是有各种问题。
4、假如上面两个问题都解决了,我也从9个方框(当前所在方框、和相邻的8个方框)中找到了所有的XX,那么接下来应该是逐个计算XX和我当前位置的距离然后进行排序,那么这个距离如何计算?(这里我先不负责任的想直接计算两点之间距离不就行了么,虽然地球是圆的、有弧度,但是实际需求里相隔太远的XX的距离对于用户来讲其实意义并不大,而且误差我认为也可以接受)
那么接下来就围绕这几个问题进行一番研究。
随后发现了的,看过之后上面的问题至少解决了仨。
1、Geohash编码是根据经纬度获得的,那么这个编码肯定是固定的,按照既定的算法计算即可。
2、这个问题说解决了其实是无耻的偷了个懒,因为看到了提供了用来直接计算这个东西:string $hash = $geohash-&encode(39.6.);。
3、同上一问题,同样提供了方法:array $neighbors = $geohash-&neighbors(substr($hash, 0, 6));
4、而至于问题4,目前还没有找到可以解决问题的方法,后续再说。
既然有现成的了,那就顺着这个思路继续往下找,于是找到了这个,这位老兄提供了一个,效率按他的说法是比PHP高若干倍,不过暂未测试。
找来找去也就@一个开发者的最靠谱,于是找来了他的栗子来测试一下,代码如下:
* Geohash generation class for php - test
* This file copyright (C) 2013 Bruce Chen (/smcz)
* Author: Bruce Chen (weibo: @一个开发者)
require_once('geohash.class.php');
$geohash = new G
//得到这点的hash值
$hash = $geohash-&encode(39.6.);
//取前缀,前缀约长范围越小
$prefix = substr($hash, 0, 6);
//取出相邻八个区域
$neighbors = $geohash-&neighbors($prefix);
array_push($neighbors, $prefix);
print_r($neighbors);
12345678910111213141516171819
&?php/** * Geohash generation class for php - test * * This file copyright (C) 2013 Bruce Chen (/smcz) * * Author: Bruce Chen (weibo: @一个开发者) * */require_once('geohash.class.php');$geohash = new Geohash;//得到这点的hash值$hash = $geohash-&encode(39., 116.);//取前缀,前缀约长范围越小$prefix = substr($hash, 0, 6);//取出相邻八个区域$neighbors = $geohash-&neighbors($prefix);array_push($neighbors, $prefix);print_r($neighbors);
结果如下:
[top] =& wx4eqx
[bottom] =& wx4eqt
[right] =& wx4eqy
[left] =& wx4eqq
[topleft] =& wx4eqr
[topright] =& wx4eqz
[bottomright] =& wx4eqv
[bottomleft] =& wx4eqm
[0] =& wx4eqw
123456789101112
Array(&&&&[top] =& wx4eqx&&&&[bottom] =& wx4eqt&&&&[right] =& wx4eqy&&&&[left] =& wx4eqq&&&&[topleft] =& wx4eqr&&&&[topright] =& wx4eqz&&&&[bottomright] =& wx4eqv&&&&[bottomleft] =& wx4eqm&&&&[0] =& wx4eqw)
那么关于精度的问题,因为目前看到的各种讲解都是把Geohash字符串截取前六位,那么我做了如下测试,同时也是为了验证几个相邻位置的Geohash的字符串确实前几位是一致的。
如下图,取了「理想国际大厦」、「中国化工大厦」、「泰鹏大厦」、「中关村SOHO」四个建筑物的坐标:
然后代码如下:
require_once('geohash.class.php');
$geohash = new G
$hash = $geohash-&encode(39., 116.); // 理想国际大厦
echo "理想国际大厦&br&$hash&br&";
$hash = $geohash-&encode(39., 116.); // 中国化工大厦
echo "中国化工大厦&br&$hash&br&";
$hash = $geohash-&encode(39., 116.); // 中关村SOHO
echo "中关村SOHO&br&$hash&br&";
$hash = $geohash-&encode(39.,116.); // 泰鹏大厦
echo "泰鹏大厦&br&$hash&br&";
1234567891011121314
require_once('geohash.class.php');$geohash = new Geohash;&$hash = $geohash-&encode(39., 116.); // 理想国际大厦echo "理想国际大厦&br&$hash&br&";&$hash = $geohash-&encode(39., 116.); // 中国化工大厦echo "中国化工大厦&br&$hash&br&";&$hash = $geohash-&encode(39., 116.); // 中关村SOHOecho "中关村SOHO&br&$hash&br&";&$hash = $geohash-&encode(39.,116.); // 泰鹏大厦echo "泰鹏大厦&br&$hash&br&";
结果如下:
理想国际大厦
wx4eqwyr5cvvwdqw4
中国化工大厦
wx4eqwvrx16hen07j
中关村SOHO
wx4eqwy64uv0uu66s
wx4eqwv9bszy35040
理想国际大厦wx4eqwyr5cvvwdqw4中国化工大厦wx4eqwvrx16hen07j中关村SOHOwx4eqwy64uv0uu66s泰鹏大厦wx4eqwv9bszy35040
由此可见,在这个0.04平方公里的范围里,计算出的Geohash的前6位是相同的,所以取前6位从精度和数量上都是很合适的。(补充:后来有个文章说,Geohash前六位的区域大概就是1平方公里…)
接下来,Geohash的问题基本解决,剩下的就是上面的“问题4”。
关于这个,继续搜索。那么检索到了如下几篇文章:、和,虽然名字很那个啥并且也不是出于高档社区….
大致扫了眼,这三个文章里提供了三种方法,虽然本质可能是一样的…那么,拿下来测试一下。
首先,在地图上选了两个点:理想国际大厦、首都国际机场T3航站楼,这两点的经纬度分别为:
理想国际大厦:N39.,E116.
首都国际机场T3航站楼:N40.,E116.
这里是用的地图里的百度地图的经纬度数据。截图如下:
接下来在百度地图里,用测距工具看一下百度地图里关于这两点的直线距离是27.1公里,如图:
然后分别用这三个程序进行测试。
// 来自 /article/10961.html
*求两个已知经纬度之间的距离,单位为米
*@param lng1,lng2 经度
*@param lat1,lat2 纬度
*@return float 距离,单位米
function getdistance($lng1,$lat1,$lng2,$lat2){
//将角度转为狐度
$radLat1=deg2rad($lat1);//deg2rad()函数将角度转换为弧度
$radLat2=deg2rad($lat2);
$radLng1=deg2rad($lng1);
$radLng2=deg2rad($lng2);
$a=$radLat1-$radLat2;
$b=$radLng1-$radLng2;
$s=2*asin(sqrt(pow(sin($a/2),2)+cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)))*0;
return $s;
echo getdistance(116., 39., 116., 40.);
// 结果:8,约27.1公里
12345678910111213141516171819202122
&?php// 来自 /article/10961.html/***求两个已知经纬度之间的距离,单位为米*@param lng1,lng2 经度*@param lat1,lat2 纬度*@return float 距离,单位米**/function getdistance($lng1,$lat1,$lng2,$lat2){ //将角度转为狐度 $radLat1=deg2rad($lat1);//deg2rad()函数将角度转换为弧度 $radLat2=deg2rad($lat2); $radLng1=deg2rad($lng1); $radLng2=deg2rad($lng2); $a=$radLat1-$radLat2; $b=$radLng1-$radLng2; $s=2*asin(sqrt(pow(sin($a/2),2)+cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)))**1000; return $s;}echo getdistance(116., 39., 116., 40.);// 结果:8,约27.1公里?&
// 来自 http://my.oschina.net/ekc/blog/84106
* @desc 根据两点间的经纬度计算距离
* @param float $lat 纬度值
* @param float $lng 经度值
function getDistance($lng1, $lat1, $lng2, $lat2)
$earthRadius = 6367000; //approximate radius of earth in meters
Convert these degrees to radians
to work with the formula
$lat1 = ($lat1 * pi() ) / 180;
$lng1 = ($lng1 * pi() ) / 180;
$lat2 = ($lat2 * pi() ) / 180;
$lng2 = ($lng2 * pi() ) / 180;
Haversine formula
http://en.wikipedia.org/wiki/Haversine_formula
calculate the distance
$calcLongitude = $lng2 - $lng1;
$calcLatitude = $lat2 - $lat1;
$stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);
$stepTwo = 2 * asin(min(1, sqrt($stepOne)));
$calculatedDistance = $earthRadius * $stepT
return round($calculatedDistance);
echo getdistance(116., 39., 116., 40.);
// 结果:27081,约27.1公里
123456789101112131415161718192021222324252627282930313233343536373839404142
&?php// 来自 http://my.oschina.net/ekc/blog/84106/*** @desc 根据两点间的经纬度计算距离* @param float $lat 纬度值* @param float $lng 经度值*/function getDistance($lng1, $lat1, $lng2, $lat2){ $earthRadius = 6367000; //approximate radius of earth in meters& /* Convert these degrees to radians to work with the formula */& $lat1 = ($lat1 * pi() ) / 180; $lng1 = ($lng1 * pi() ) / 180;& $lat2 = ($lat2 * pi() ) / 180; $lng2 = ($lng2 * pi() ) / 180;& /* Using the Haversine formula& http://en.wikipedia.org/wiki/Haversine_formula& calculate the distance */& $calcLongitude = $lng2 - $lng1; $calcLatitude = $lat2 - $lat1; $stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2); $stepTwo = 2 * asin(min(1, sqrt($stepOne))); $calculatedDistance = $earthRadius * $stepTwo;& return round($calculatedDistance);}echo getdistance(116., 39., 116., 40.);// 结果:27081,约27.1公里?&
// 来自 http://blog.csdn.net/vincent_czz/article/details/7963740
function rad($d)
return $d * 3.8 / 180.0;
function GetDistance($lng1, $lat1, $lng2, $lat2)
$EARTH_RADIUS = ;
$radLat1 = rad($lat1);
//echo $radLat1;
$radLat2 = rad($lat2);
$a = $radLat1 - $radLat2;
$b = rad($lng1) - rad($lng2);
$s = 2 * asin(sqrt(pow(sin($a/2),2) +
cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)));
$s = $s *$EARTH_RADIUS;
$s = round($s * 1000) / 1000;
return $s;
echo GetDistance(116., 39., 116., 40.);
// 结果:27.129公里
1234567891011121314151617181920212223
&?php// 来自 http://blog.csdn.net/vincent_czz/article/details/7963740function rad($d){ return $d * 3.8 / 180.0;}function GetDistance($lng1, $lat1, $lng2, $lat2){ $EARTH_RADIUS = ; $radLat1 = rad($lat1); //echo $radLat1; $radLat2 = rad($lat2); $a = $radLat1 - $radLat2; $b = rad($lng1) - rad($lng2); $s = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1)*cos($radLat2)*pow(sin($b/2),2))); $s = $s *$EARTH_RADIUS; $s = round($s * 1000) / 1000; return $s;}echo GetDistance(116., 39., 116., 40.);// 结果:27.129公里?&
_(?ω?? ∠)_…好吧,之前测试的时候搞错了经纬度,导致测试结果各不一样…实际上这三个算法的结果都是一样的,而且如果看得懂并究其本质的话应该也是一样的。
至此,上述的4个问题就算都解决掉了。那么接下来就需要根据上述的解决方案和实际需求来制定下数据的存储结构了。
这里主要参考这篇文章,这里面的场景是“列出用户周边的其他用户”,这个场景对于我的需求来说明显是要复杂的,毕竟“周边的其他用户”是会移动的,而我这里的需求“周边的XX”,这个XX是固定住的。
简单的流程如下图:
也就是说:
得到当前位置的经纬度坐标:这个通过手机的定位以及某些地图的API获得(这里没详细琢磨过,也许不用这么麻烦)
由当前位置的经纬度计算得到当前位置的Geohash字符串。
用当前位置的Geohash的前六位(文章里说了,前六位大概就是一平方公里的范围,这个范围我认为是最合适的),找到当前区域周边8个相邻区域的Geohash。
找到这9个区域里所有XX(好吧说明白点,这个XX比如就是商户之类的固定的东西)的信息,信息包含ID、经纬度等。
计算这些XX到用户当前位置的距离。
按距离顺序排序。
这里面涉及的数据结构:
XX的基本信息,如经度、纬度、Geohash值。
每个区域内XX的集合,即存储某个区域内(用Geohash前六位标识)所有的XX。
涉及的存储工具,这里(包括上面的数据结构)和里所提供的基本都一致:
redis string (key-&value) 结构,存储XX的基本信息,比如“XX的ID-&XX的经纬度”。
redis set (集合) 结构,以Geohash前六位作为key,存储该区域下的所有XX的ID。
这里说到了涉及到周边一共9个区域,那么如果用户还想继续往外看,那就要再往外找一圈、即找到当前9个区域外围的16个区域的XX。那么怎么确定这16个区域呢?目前看来倒是也好说。
比如这是当前的检索范围,用户在中间红色的区域内,给用户列出的是红色、和红色周边一共9个区域的XX。然后此时用户想要继续扩大范围,如下图:
也就是用户想要看最外围蓝色(也许你的屏幕看是黑色…)这一圈的XX。那么,至少我目前的想法——肯定还会有更方便的想法——是:
依次对绿色区域的8个区域,找各自的周边8区域,如上图,先找区域1的周边8区域,然后与现有区域的XX做去重过滤的操作:
这样剩下的就是再外围16个区域中5个区域的XX了。然后再依次2-8区域进行相同操作,最后得到完整的数据。
到这里,应该算的上一个完整的方案了。如有遗漏以后补充。
2BContinued.
记录一下:
2016年三月
6789101112
13141516171819
20212223242526
2728293031

我要回帖

更多关于 lbs基站定位软件 的文章

 

随机推荐