zoukankan      html  css  js  c++  java
  • MashupGoogle Map API与饭否API的整合应用

    http://www.cssrain.cn/article.asp?id=1370

    Mashup--Google Map API与饭否API的整合应用

    这是一个通过JS 整合两个API 的混搭小应用。

    先预览这个应用:http://www.playgoogle.com/demo/fanfou/default.htm

    1.前提

    (1), 什么是Mashup??
    http://baike.baidu.com/view/241257.htm
    (2)你必须对Google map API 比较了解。饭否的API 比较简单,在这个应用中,主要是是用了他开放的JSON数据。同时,你要知道什么是JSONP ,用来做跨域的访问。另外由于本文的代码书写风格,你必须知道什么是闭包.

    2.引入GOOGLE MAP API

    通过一个script标签引入google map api
    < script type="text/javascript"
    src="http://ditu.google.com/maps?file=api&v=2& key=ABQIAAAAOYVY-acpvTnhAhwAg94W7RQULNflpX8UqGwTaVYnmUlH28s8DBSBksAirhcPKVRiRFkFe4FWR65TaA">
    < /script>
    注意,key后面的字符串是根据域名在google 的网站上获取的,如果你要在自己的网站上使用,你需要用域名去获取一下API 密钥。
    密钥地址:http://code.google.com/intl/zh-CN/apis/maps/signup.html

    3.初始化MAP

    通常,在body的onload事件里面去初始化地图,我是在KARRY.init函数里面初始化的。把地图的中心默认设置为中国洛阳。
    map = new GMap2(document.getElementById('map'));
    map.setCenter(new GLatLng(34.68491,112.47605), 6);
    map.addControl(new GLargeMapControl());
    map.addControl(new GOverviewMapControl());
    map.addControl(new GMapTypeControl());

    4.搜索关键词

    我在 KARRY.JS 的顶部设置了一个默认的关键词 var keyword = "红酒"; 在初始化地图之后,立即去搜索饭否上包含该关键词的内容:
    在scratchJson()这个方法中(由于采用了闭包,这个方法是私有方法。)这个方法在立即执行的同时会设置一个定时器,每隔600秒会重新执行一次。也就是10分钟后会重新搜索饭否的数据,看是否有更新。
    var s = document.createElement('script');
    s.type = 'text/javascript';
    s.src = 'http://api.fanfou.com/search/public_timeline.json?q='+keyword +'&' + Math.random() + '&count=30&callback=KARRY.callBack';
    document.getElementsByTagName('head')[0].appendChild(s);
    这里用到了JSONP,其实就是在页面上载入了一段饭否的js,同时有一个回调函数,callback=KARRY.callBack,也就是当数据载入完成之后,会立即执行KARRY.callBack函数。很显然,这个回调函数主要的目的是对载入的数据进行解析。

    5.解析数据

    要解析数据,首先要知道别人给的数据是什么格式:

    [{"created_at":"Mon Jun 08 11:44:51 +0000 2009",
    "id":"P5kJHLcHDbQ",
    "text":"内容",
    "source":"\u7f51\u9875",
    "truncated":false,
    "in_reply_to_status_id":"",
    "in_reply_to_user_id":"",
    "favorited":false,
    "in_reply_to_screen_name":"",
    "user":
    {"id":"karryzhang",
    "name":"karryzhang",
    "screen_name":"karryzhang",
    "location":null,
    "location_en":null,
    "description":"",
    "profile_image_url":"http:\/\/avatar.fanfou.com\/s0\/00\/e0\/g6.jpg?1244277109",
    "url":"http:\/\/fanfou.com\/karryzhang",
    "protected":false,
    "followers_count":1
    },
    "photo_url":""
    }]
    
    饭否搜索返回的JSON 就是上面那个数组的形式,进行重复。
    既然是数组,那就循环去读数据,然后逐条解析,获取需要的内容就行了。
    由于数据要在地图上一条一条的显示,而不是一次都显示出来,
    这里就需要另外一个定时器,每隔10秒往下读一条数据了。
    var p = 0;
    if(innerInterval!=null){
    clearInterval(innerInterval);
    }
    innerInterval = setInterval(function(){
    if (/海外/.exec(j[p].user.location)){
    map.setZoom(3);
    } else {
    map.setZoom(curlevel);
    }
    //弹出框
    map.openInfoWindowHtml(getPoint(j[p].user.location), parseDataToHTML(j[p]));
    counter.innerHTML = j.length - p;
    p++;
    if(p==j.length){
    clearInterval(innerInterval);
    return;
    }},10000);
    
    注意里面调用的两个私有方法:getPoint(j[p].user.location) parseDataToHTML(j[p]),
    getPoint前面一个是通过地址名获取对应的经纬度。parseDataToHTML是把内容拼装成DOM,
    插入到对应的框中。 在页面上你可以看到,最开始引入了一个
    < script type="text/javascript" src="karry/geocode.js">< /script>
    就是用来做地址解析的。也就是先把具体地址和其对应的经纬度存在一个文件里。
    用的时候根据具体地址获取经纬度就可以了。
    我写过一个专门获取经纬度的工具:经纬度查询工具
    地址如下:http://www.playgoogle.com/googlemap/tool1.html

    6.获取饭否上的热门关键词

    在初始化地图,搜索了默认关键词的同时,就通过getHotWords()方法开始获取热门关键词了.
    饭否热词也是一个JSON格式的数据,路径:http://api.fanfou.com/trends.json同样的,还是通过JSONP,
    把它通过< script>标签载入到页面中来,载入完成后通过回调函数来格式化数据,拼装成DOM格式,让其出现在右侧。

    7.点击热词或者点击搜索按钮的处理

    在右侧的热门关键词和搜索按钮上都绑定了一个事件,KARRY.setKeyWord(),功能其实很简单,重新设置关键词,并清除当前的定时器,重新执行第四步,搜索关键词。

    if(keyword==str){
    alert("当前显示的是"+keyword+"相关的内容");
    return;
    }
    keyword = str;
    if(!interval){
    clearInterval(interval);
    }
    if(!innerInterval){
    clearInterval(innerInterval);
    }
    scratchJson();
    interval = setInterval(scratchJson, 600000);
    alert("正在从饭否上获取有关"+keyword+"的信息,请稍后");
    

    8.总结

    这个应用的原理很简单。我通过获取饭否的API中的热词,在用户点击热词之后,会把热词作为关键词去载入饭否API中的公开搜索,搜索出包含该关键词的内容。再解析内容,根据用户的地址,在google map找到对应的经纬度并把内容展示出来,这里使用了setInterval 来定时获取。


    查看这个应用的地址:http://www.playgoogle.com/demo/fanfou/default.htm

  • 相关阅读:
    【BZOJ1029】[JSOI2007] 建筑抢修(堆优化贪心)
    【CF799B】T-shirt buying(一道很水的小根堆)
    【BZOJ1076】[SCOI2008] 奖励关(状压DP)
    【BZOJ1087】[SCOI2005] 互不侵犯King(状压DP)
    【BZOJ3209】花神的数论题(数位DP)
    【BZOJ1833】[ZJOI2010] count 数字计数(数位DP)
    【洛谷】CYJian的水题大赛 解题报告
    【洛谷3959】宝藏(随机算法乱搞)
    【洛谷2709】小B的询问(莫队模板题)
    【洛谷2403】[SDOI2010] 所驼门王的宝藏(Tarjan+dfs遍历)
  • 原文地址:https://www.cnblogs.com/aaa6818162/p/1523124.html
Copyright © 2011-2022 走看看