【高德地图API】汇润做爱地图技术大揭秘
昨日收到了高德地图微信公众号的消息推送,说有【一大波免费情趣用品正在袭来】,点进去看了一眼,说一个电商公司(估计是卖情趣用品的)用高德云图制作了一张可以标记做爱地点与详情的地图。这不就是中国版的I just made love麽?
滑到屏幕底下,看了看阅读量,哇塞,居然有4万3!!!说明实在是有很多人关注做爱地图啊。本着研究地图的心情(绝对不是为了什么价值300的智能情趣用品!),我也就点击了【阅读原文】……
好吧,为了证明我真的不是为了奖品,我会一边写活动步骤,一边揭秘其中的LBS技术。


----------------------------------------------------------------------------------------
一、说明页面
1、浏览器定位
进入说明页面,即跳出一个定位允许的弹窗。
在微信里的webview页面是如何定位的呢,答案肯定是“浏览器定位”啦。

浏览器定位代码:
function mapInit () {
mapObj = new AMap.Map('iCenter');
mapObj.plugin('AMap.Geolocation', function () {
geolocation = new AMap.Geolocation({
enableHighAccuracy: true,//是否使用高精度定位,默认:true
timeout: 10000, //超过10秒后停止定位,默认:无穷大
maximumAge: 0, //定位结果缓存0毫秒,默认:0
convert: true, //自动偏移坐标,偏移后的坐标为高德坐标,默认:true
showButton: true, //显示定位按钮,默认:true
buttonPosition: 'LB', //定位按钮停靠位置,默认:'LB',左下角
buttonOffset: new AMap.Pixel(10, 20),//定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20)
showMarker: true, //定位成功后在定位到的位置显示点标记,默认:true
showCircle: true, //定位成功后用圆圈表示定位精度范围,默认:true
panToLocation: true, //定位成功后将定位到的位置作为地图中心点,默认:true
zoomToAccuracy:true //定位成功后调整地图视野范围使定位位置及精度范围视野内可见,默认:false
});
mapObj.addControl(geolocation);
AMap.event.addListener(geolocation, 'complete', onComplete);//返回定位信息
AMap.event.addListener(geolocation, 'error', onError); //返回定位出错信息
});
geolocation.getCurrentPosition(); //启动定位
};
2、提升用户体验
因为浏览器定位需要时间,如果进入地图界面后,再使用浏览器定位,会让用户感觉要等待很久。
不信大家可以看官方的浏览器定位,速度不会太快的:http://lbs.amap.com/api/javascript-api/example/g/0704-2/
所以为了提高用户体验,让用户感觉没有等待时间,这就需要打开页面立刻定位,但又不能显示出地图。
于是,可以猜到说明页面只是一个覆盖层,是一个“障眼法”。
当用户点击立刻参与的时候,这个层display:none了而已。
3、定位失败策略
浏览器定位当然不可能100%成功。原因是:
1、用户不允许网页使用位置
2、浏览器不支持HTML5中的定位
3、PC浏览器没有手机浏览器定位成功率高,因为手机例如iPhone上可以获取GPS信息
所以,这个活动在定位失败时,会自动定位到深圳一个点。
难道这就是活动里介绍的,“邂逅泷泽萝拉”麽?呵呵,关掉定位就好了啊。
不过我也百度了一下,泷泽萝拉的确是在这个位置这个时间,给该品牌做了带盐,还穿着夜光衣……
还在百度上发现了一个秘密,这女孩儿是92年的……混血……女明星……

二、地图页面
1、添加覆盖物
当用户允许位置使用,并且定位成功的话,就会自动定位到用户的地点。
这时会显示周围有哪些marker,这里的marker都是分男女的,是2种不同的marker,通过更改图片url即可实现。
覆盖物代码:
//实例化点标记
function addMarker(){
marker = new AMap.Marker({
icon:"marker-female.png", //换图片即可实现男女marker喔
position:new AMap.LngLat(110.405467,39.927761)
});
marker.setMap(mapObj); //在地图上添加点
}
覆盖物的添加逻辑,用到的是云图的多边形检索,将多边形设置为当前屏幕可视范围。
获取可视区域,用mapObj.getBounds()。然后得到西南角(左下角)和东北角(右上角)。
用2点即可构建一个矩形,是不是超级方便!!可视区域云检索代码:
//多边形检索函数
function cloudSearch() {
var curView = mapObj.getBounds(); //获取可视区域
mapObj.clearMap();
var arr = new Array();
//绘制多边形
arr.push(curView.getSouthWest()); //获取左下角
arr.push(curView.getNorthEast()); //获取右上角
var search;
//加载CloudDataSearch服务插件
mapObj.plugin(["AMap.CloudDataSearch"], function() {
search = new AMap.CloudDataSearch('【您的云图tableid】'); //构造云数据检索类
AMap.event.addListener(search, "complete", cloudSearch_CallBack); //查询成功时的回调函数
AMap.event.addListener(search, "error", errorInfo); //查询失败时的回调函数
search.searchInPolygon(arr); //多边形检索,自动变成矩形。
});
}
2、覆盖物动画
点击地图上的男女图标,都会跳动一下。这里用到的是覆盖物动画。代码:
function cartoon(){
marker.setAnimation('AMAP_ANIMATION_BOUNCE'); //设置点标记的动画效果,此处为弹跳效果
}
延时2秒关闭覆盖物动画,代码:
function closeCartoon(){
marker.setAnimation('AMAP_ANIMATION_NONE'); //关闭动画
}
setTimout(closeCartoon(),2000); //延时2秒关闭动画
3、地图事件
当屏幕扩大,覆盖物会增加;地图经过的地方,marker都会被保留,不会重复渲染。
这里给地图添加拖拽结束事件,当拖拽结束,就进行当前可视区域的云检索。地图事件代码:
//地图移动结束,进行云检索
AMap.event.addListener(mapObj,'moveend',function(){
cloudSearch();
});
如图:

4、麻点图
当地图越缩越小,图标达到一定数量后,就会密密麻麻看不见。
于是,麻点图派上了用场。

代码:
//加载云图层插件
function addCloudLayer() {
mapObj.plugin('AMap.CloudDataLayer', function () {
var cloudDataLayer = new AMap.CloudDataLayer('【您的云图tableid】'); //实例化云图层类
cloudDataLayer.setMap(mapObj); //叠加云图层到地图
AMap.event.addListener(cloudDataLayer, 'click', function (result) {
cartoon();//marker动画,谈起tip
});
}
5、地址解析
在地图顶部,有个小小的横条,里面有地图中心点的位置信息。这里就是用的地址解析。代码:
var lnglatXY = mapObj.getCenter(); //获取地图中心点
function geocoder() {
var MGeocoder;
//加载地理编码插件
mapObj.plugin(["AMap.Geocoder"], function() {
MGeocoder = new AMap.Geocoder({
radius: 1000,
extensions: "all"
});
//返回地理编码结果
AMap.event.addListener(MGeocoder, "complete", geocoder_CallBack);
//逆地理编码
MGeocoder.getAddress(lnglatXY);
});
}
//回调函数
function geocoder_CallBack(data) {
//返回地址描述
var address = data.regeocode.formattedAddress;
alert(address);
三、内容选择页面
1、云存储
用户选择完毕详情内容,点提交按钮,就发起请求。
这里使用云存储接口,官方说明:http://lbs.amap.com/yuntu/reference/cloudstorage/#yuntureference_creatdata

上图中有“女生,室外”等选项,那么发送请求代码为:
http://yuntuapi.amap.com/datamanage/data/create?key=【用户key】&tableid=【云图tableid】&data=["name":"1","location":"116,39","sex":"female","place":"outside","other":"tt|drag","star":"5","healthy":"130"]
根据选项设计数据库结构:
|
名称 |
说明 |
是否必填 |
||
|
Key |
客户唯一标识 |
是 |
||
|
Tableid |
数据表唯一标识 |
是 |
||
|
data |
数据 |
是 |
||
|
_name |
数据名称(用id号) |
是 |
||
|
_location |
坐标 |
是 |
||
|
_sex |
性别 男:male 女:female |
是 |
||
|
_place |
家:home 酒店:hotel 室外:outdoor 车内:car 船上:boat |
是 |
||
|
_other |
其他准备 至少选1个 |
是 |
||
|
_tt |
安全套 Yes:1 No:0 |
|||
|
_bath |
洗澡 Yes:1 No:0 |
|||
|
_hottea |
热水 Yes:1 No:0 |
|||
|
_drag |
药物 Yes:1 No:0 |
|||
|
_nothing |
什么都没有 Yes:1 No:0 |
|||
|
_stars |
用户打分,满意度 值:5,4,3,2,1 类型:number |
是 |
||
|
_healthy |
幸福指数 计算规则详见5、幸福指数计算 类型:number |
是 |
||
|
_level |
击败百分之多少的人,计算规则详见6、等级计算规则 类型:number |
是 |
||
|
_duihuanma |
兑换码 类型:string |
否 |
||
2、云检索
点击一个marker,谈起tip;点击tip则到详情页面。
这里用的是云检索中的ID检索。

代码:
//根据数据id查询数据详情
function cloudSearch(){
mapObj.clearMap();
var search;
mapObj.plugin(["AMap.CloudDataSearch"], function() {
search = new AMap.CloudDataSearch('【云图tableid】'); //构造云数据检索类
AMap.event.addListener(search, "complete", cloudSearch_CallBack); //查询成功时的回调函数
AMap.event.addListener(search, "error", errorInfo); //查询失败时的回调函数
search.searchById("1"); //根据id查询
});
}
四、得分页面
最后一个得分页面,与LBS没有太多关系。但里面也有几个点可以拿来说一说。
一是分数计算,在内容选择页面发起请求时,根据每个选项的得分不同,就计算好分数,然后云存储时,直接把分数发送出去。
二是中奖规则,中奖规则应该由后台给出,这样可以防止作弊。
三是微博话题,看了看这个活动只有客观选择题,没有主观题,可能是为了规避敏感词的法律风险。所以,把讨论都放在了微博话题里,并设置了微博抽奖。
四是微信分享,微信中的分享必须调起native组件,所以做了一个界面提示用户去点击即可。

五、高分秘籍!!
技术部分已经结束,这里是我玩游戏的心得,算是攻略吧。
我是这样玩的,先选最少的选项。多选里面,每次只选1个,这样很容易确定多选中的分数。
但是药物那个不知道具体分数,好像每次都不太一样。
|
项目 |
分数 |
|
|
其他准备 |
TT |
30 |
|
洗澡 |
10 |
|
|
热水 |
5 |
|
|
药物 |
每次都不太一样 |
|
|
Nothing |
-5 |
|
微博上有人晒分数,居然有个玩家得了134!!!好高的分数,我从来没玩出来过……桑心……

【高德地图API】汇润做爱地图技术大揭秘的更多相关文章
- 【高德地图API】从零开始学高德JS API(七)——定位方式大揭秘
原文:[高德地图API]从零开始学高德JS API(七)——定位方式大揭秘 摘要:关于定位,分为GPS定位和网络定位2种.GPS定位,精度较高,可达到10米,但室内不可用,且超级费电.网络定位,分为w ...
- 【高德地图API】从零开始学高德JS API(一)地图展现——仙剑地图,麻点图,街景,室内图
原文:[高德地图API]从零开始学高德JS API(一)地图展现——仙剑地图,麻点图,街景,室内图 摘要:关于地图的显示,我想大家最关心的就是麻点图,自定义底图的解决方案了吧.在过去,marker大于 ...
- 【高德地图API】从零开始学高德JS API(二)地图控件与插件——测距、圆形编辑器、鼠标工具、地图类型切换、鹰眼鱼骨
原文:[高德地图API]从零开始学高德JS API(二)地图控件与插件——测距.圆形编辑器.鼠标工具.地图类型切换.鹰眼鱼骨 摘要:无论是控件还是插件,都是在一级API接口的基础上,进行二次开发,封装 ...
- 【百度地图API】如何自定义地图图层?实例:制作麻点图(自定义图层+热区)
原文:[百度地图API]如何自定义地图图层?实例:制作麻点图(自定义图层+热区) 摘要:自定义地图图层的用途十分广泛.常见的应用,比如制作魔兽地图和清华校园地图(使用切图工具即可轻松实现).今天我们来 ...
- 【百度地图API】如何利用地图API制作汽车沿道路行驶的动画?——如何获得道路层数据
原文:[百度地图API]如何利用地图API制作汽车沿道路行驶的动画?--如何获得道路层数据 有几个做汽车导航的朋友问我说,他们想在地图上制作一辆车沿着道路行驶的动画.可是,百度地图的道路数据并没有公开 ...
- 【百度地图API】多家地图API内存消耗对比测验(带源码)
原文:[百度地图API]多家地图API内存消耗对比测验(带源码) 任务描述: 啊,美妙的春节结束了.酸奶小妹和妈妈的山西平遥之旅也宣告成功!距离平遥古城7km,有一个同样身为“世界文化遗产”的寺庙,叫 ...
- 【百度地图API】如何在地图上添加标注?——另有:坐标拾取工具+打车费用接口介绍
原文:[百度地图API]如何在地图上添加标注?--另有:坐标拾取工具+打车费用接口介绍 摘要: 在这篇文章中,你将学会,如何利用百度地图API进行标注.如何使用API新增的打车费用接口. ------ ...
- 【百度地图API】多家地图API文件大小对比
原文:[百度地图API]多家地图API文件大小对比 于2011.6.9日更新百度地图API文件大小.同时更新图片. 任务描述: 明天就是元宵佳节啦~这是一个团团圆圆的节日,于是,再次想把各家API聚在 ...
- 百度地图api通过地址显示地图,白名单
百度地图api通过地址显示地图,白名单 http://developer.baidu.com/map/jsdemo.htm#i7_1?qq-pf-to=pcqq.c2c---------------- ...
随机推荐
- iOS 7 新特性
iOS7更新了很多引人注目的功能.用户界面完全重新设计了.iOS7为开发2D,2.5D游戏引入了全新的动画系统.加强多线程,点对点连接,以及许多其他重要的功能让iOS7成为有史以来最有意义的一次发 ...
- C#中的动态特性
众所周知,C#和Java一样,都是一门静态语言.在C# 4.0之前,想要和动态语言(诸如Python.Javascript等)进行方便地互操作是一件不太容易的事情.而C# 4.0为我们带来的dynam ...
- Android开发学习总结(五)——Android应用目录结构分析(转)
一.手动创建android项目 手动创建一个Android项目,命名为HelloWorld,命令如下: android create project -n HelloWorld -t 1 -p E:/ ...
- 如此的相似,不能-------Day84
生活中我们会遇到一些相似事儿,它可能是一个项目,我发现,你失去非常相似,其结果是不,它可以是人.你认为你一直在等待的是他(她),终于可以找到,只需简单地认为.正是这样相似. js和java语言中有不少 ...
- Html5响应式设计与实现广场
由于提出的想法响应式设计,越来越多的网站使用这样的思想.各类大型网站如雨后春笋般涌了出来.例如:小米商城.天猫等. 至于响应式设计的概念等大家能够去百度百度,我这里就不相信解说了.直接为大家带来源代码 ...
- RDIFramework.NET ━ .NET高速信息系统开发框架钜献 V2.9 版本震撼发布
RDIFramework.NET ━ .NET高速信息化系统开发框架钜献 V2.9 版本号震撼公布 全新体验.全新感觉.2015钜献! 继上个版本号"RDIFramework.NET V2 ...
- SICP 习题(1.1,1.2,1.3,1.4)解题总结。
近来在重读SICP,以前读过一次,读了第一二章就没有坚持下去,时间一长就基本忘记了,脑海里什么都不剩,就隐约记得自己曾经读过一本很牛B的书. 这次读希望能够扎实一点,不管能读到哪里,希望可以理解一些东 ...
- JavaWeb框架的基石
JavaWeb框架的基石(一) 初学JavaWeb开发,请远离各种框架,从Servlet开始. Web框架是开发者在使用某种语言编写Web应用服务端是关于架构的最佳实践.很多Web框架 ...
- Gallatin(大陆版)Office365中Exchange Online混合部署功能已经能够使用了
经过測试,Exchange混合部署已经能够使用了 前置条件: 本机至少须要一台Exchange Server 2013作为混合部署server 须要一个公网域名 domian.com,能够和内部域名不 ...
- [程序安装包制作] Advanced Installer 备忘
原文:[程序安装包制作] Advanced Installer 备忘 Product Information - Product Details 这个重点是Product Version.讲这个之前, ...