【高德地图API】汇润做爱地图技术大揭秘

原文:【高德地图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!!!好高的分数,我从来没玩出来过……桑心……

 

时间: 2024-10-18 13:51:21

【高德地图API】汇润做爱地图技术大揭秘的相关文章

【高德地图API】从零开始学高德JS API(七)——定位方式大揭秘

原文:[高德地图API]从零开始学高德JS API(七)--定位方式大揭秘 摘要:关于定位,分为GPS定位和网络定位2种.GPS定位,精度较高,可达到10米,但室内不可用,且超级费电.网络定位,分为wifi定位和基站定位,都是通过获取wifi或者基站信息,然后查询对应的wifi或者基站位置数据库,得到的定位地点.定位数据库可以不断完善不断补充,所以,越定位越准确.本文详细描述了,如果使用高德JS API来实现位置定位.城市定位的方法,包含了IP定位,浏览器定位,检索定位等多种网络定位方法.当然,

【高德地图API】从零开始学高德JS API(一)地图展现——仙剑地图,麻点图,街景,室内图

原文:[高德地图API]从零开始学高德JS API(一)地图展现--仙剑地图,麻点图,街景,室内图 摘要:关于地图的显示,我想大家最关心的就是麻点图,自定义底图的解决方案了吧.在过去,marker大于500之后,浏览器开始逐渐卡死,大家都开始寻找解决方案,比如聚合marker啊,比如麻点图啊.聚合marker里面还有一些复杂的算法,而麻点图,最让大家头疼的,就是如何生成麻点图,如何切图,如何把图片贴到地图上,还有如何定位图片的位置吧.以前那么复杂的一系列操作,居然让云图的可视化操作一下子解决了.

【高德地图API】从零开始学高德JS API(二)地图控件与插件——测距、圆形编辑器、鼠标工具、地图类型切换、鹰眼鱼骨

原文:[高德地图API]从零开始学高德JS API(二)地图控件与插件--测距.圆形编辑器.鼠标工具.地图类型切换.鹰眼鱼骨 摘要:无论是控件还是插件,都是在一级API接口的基础上,进行二次开发,封装的一系列更加便于开发者使用,减少开发者工作量的二级API接口.除了官方通用的鱼骨.鹰眼控件,还有大量官方开发的地图插件,类似谷歌的lib.当然本文还会介绍自定义插件的使用.   -------------------------------------------------------------

asp.net-调用百度地图API创建一个自定义地图实现区分内外环

问题描述 调用百度地图API创建一个自定义地图实现区分内外环 我现在想做一个根据输入的地址,来区分城市的内外环.该怎么做,百度地图API好像没有直接可调用的接口 解决方案 这个需要自己去判断的.没办法直接根据坐标判断. 解决方案二: 你收集好每个城市的内外环的百度地图经纬度采样点放入数据库,然后依据用户输入的地址解析得到的经纬度和数据库对比得到是内或者外环 内外环数据采样点只能人工收集..

【百度地图API】如何自定义地图图层?实例:制作麻点图(自定义图层+热区)

原文:[百度地图API]如何自定义地图图层?实例:制作麻点图(自定义图层+热区) 摘要:自定义地图图层的用途十分广泛.常见的应用,比如制作魔兽地图和清华校园地图(使用切图工具即可轻松实现).今天我们来学习,当地图上有大量标注,比如600万个的时候,我们如何用"麻点图"来实现标注的展示. -----------------------------------------------------------------------------------------------------

【百度地图API】多家地图API内存消耗对比测验(带源码)

原文:[百度地图API]多家地图API内存消耗对比测验(带源码) 任务描述: 啊,美妙的春节结束了.酸奶小妹和妈妈的山西平遥之旅也宣告成功!距离平遥古城7km,有一个同样身为"世界文化遗产"的寺庙,叫做"双林寺".双林寺的精致.纯木质结构.保存完好等特点,让我不由得为之一振.这让我想到了,万事万物都需要对比,"取其精华,去其糟粕". 双林寺如是,API也如是.这不,上班第一天,我就迫不及待地做起了API性能测试. 如何实现: 使用不同家的API,

【百度地图API】如何在地图上添加标注?——另有:坐标拾取工具+打车费用接口介绍

原文:[百度地图API]如何在地图上添加标注?--另有:坐标拾取工具+打车费用接口介绍 摘要: 在这篇文章中,你将学会,如何利用百度地图API进行标注.如何使用API新增的打车费用接口. ------------------------------------------------------------------------------------------------------- 哇,好久没有上来了.主要是因为最近工作繁忙,加上休息时间被各种排练.社团活动占满,导致木有更新此博客.

android-最新版Android百度地图Api中zoomToSpan没有用?求大神解决。。。

问题描述 最新版Android百度地图Api中zoomToSpan没有用?求大神解决... 代码如下: /** * 在百度地图上显示搜索的结果; */ private void showSearchResultInBaiduMap() { MyOverlayManager overlay = new MyOverlayManager(mBaiduMap); mBaiduMap.setOnMarkerClickListener(overlay); overlay.addToMap(); overl

百度地图api如何实现拖动地图的时候标记也跟着拖动

问题描述 百度地图api如何实现拖动地图的时候标记也跟着拖动 类似qq定位里面拖动地图!标记也跟着移动!然后获取标记的经纬度!有没有代码看看