百度地图API位置偏移的校准算法

百度地图API位置偏移的校准算法

算法语言 软件开发 2年前 (2016-02-17) 浏览: 2295 评论: 0

在开始使用百度地图API进行开发时可能会遇到一件相当奇怪的事情,使用百度定位的经纬度在地图上显示相当不准确,这一问题我在微信开发和安卓开始时都遇到过。第一次使用百度地图api获取位置并在地图上显示是在微信开发的时候,那是不知道具体原因无奈在微信获取的地理位置上加了一个偏移量进行校准,虽能勉强解决,但是不太准确。后来在安卓开始也同样遇到了这个问题,才发现百度地图API定位偏移已经不是一个偶然问题了。 百度地图API定位偏移的原因 以下来自互联网: 一、坐标体系 首先我们要明白,开发者能接触到哪些坐标体系呢? 第一种分类: 1、 GPS,WGS-84,原始坐标体系。一般用国际标准的GPS记录仪记录下来的坐标,都是GPS的坐标。很可惜,在中国,任何一个地图产品都不允许使用GPS坐标,据说是为了保密。GPS坐标形式如图,度分秒形式的经纬度:   2、 GCJ-02,国测局02年发布的坐标体系。又称“火星坐标”。在中国,必须至少使用GCJ-02的坐标体系。比如谷歌,腾讯,高德都在用这个坐标体系。GCJ-02也是国内最广泛使用的坐标体系。 3、 其他坐标体系。一般都是由GCJ-02进过偏移算法得到的。这种体系就根据每个公司的不同,坐标体系都不一样了。比如,百度和搜狗就使用自己的坐标体系,与其他坐标体系不兼容。 第二种分类: 首先明白,所有坐标体系的原点,都是非洲。 1、 经纬度。这个是球面坐标,对于北京来说,就是(116.38817139.935961)这样的坐标。比如腾讯、高德、百度都是这样的经纬度坐标。谷歌是经纬度顺序写反的经纬度坐标。 如果是度分秒坐标,需要进行转换,才能得到这样的经纬度坐标。详见坐标转换。 2、 墨卡托坐标。平面坐标,相当于是直线距离,数字一般都比较大,像这样的。(215362.00021333335 99526.00034912192) 墨卡托坐标,主要用于程序的后台计算。直线距离嘛,加加减减几乎计算方便。 搜狗地图API就是直接使用的墨卡托坐标。 二、坐标转换 在各种web端平台,或者高德、腾讯、百度上取到的坐标,都不是GPS坐标,都是GCJ-02坐标,或者自己的偏移坐标系。 比如,你在谷歌地图API,高德地图API,腾讯地图API上取到的,都是GCJ-02坐标,他们三家都是通用的,也适用于大部分地图API产品,以及他们的地图产品。 例外,百度API上取到的,是BD-09坐标,只适用于百度地图相关产品。 例外,搜狗API上取到的,是搜狗坐标,只适用于搜狗地图相关产品。 例外,谷歌地球,google earth上取到的,是GPS坐标,而且是度分秒形式的经纬度坐标。在国内不允许使用。必须转换为GCJ-02坐标。 1、度分秒坐标转换为经纬度 比如,在GPS记录仪,或者google earth上采集到的是39°31'20.51,那么应该这样换算,31分就是31/60度,20.51秒就是20.51/3600度,结果就是39 + 31/60 + 20.51/3600 度。 2、 GPS转换为GCJ-02坐标 谷歌,高德,腾讯的地图API官网上,都不直接提供这样的坐标转换。如果要得到GCJ-02坐标,最好在他们的地图上直接取点,或者通过地址解析得到。(这个工具我后续会贴出来的。我就爱干这样的事情,哈哈。) 不过,在网上搜到了这样的接口,该接口的type=1就是GPS转到GCJ-02的墨卡托坐标。请大家对接口保密,哈哈。详见: http://map.sogou.com/api/documentation/javascript/api2.5/interface_translate.html#late_intro 3、GCJ-02与BD-09之间互转 国测局GCJ-02坐标体系(谷歌、高德、腾讯),与百度坐标BD-09体系的转换,在CSDN上有很详细的讲解: http://blog.csdn.net/coolypf/article/details/8569813 不过也有更简单的算法,线性算法(lat和lng是经纬度,球面坐标): To_B是转到百度,To_G是转到GCJ-02。 var TO_BLNG = function(lng){return lng+0.0065;}; var TO_BLAT = function(lat){return lat+0.0060;}; var TO_GLNG = function(lng){return lng-0.0065;}; var TO_GLAT = function(lat){return lat-0.0060;}; 4、经纬纬度转成墨卡托 网上也有详细讲解: http://bbs.esrichina-bj.cn/esri/viewthread.php?tid=78245 (大家发现没,高德是api,腾讯和百度是mapapi,说明什么?) 三、坐标偏移 如果您的坐标在转换之后,还有偏移,那么考虑以下几个方面。 A、原始坐标系弄错,比如以为自己是GPS坐标,但其实已经是GCJ-02坐标。 解决方案:请确保采集到的数据是哪个坐标体系,需要转换到哪个坐标系,再进行坐标转换。 B、原始坐标准确度不够 解决方案:如果您是GPS坐标,请确保采集GPS数据时,搜到至少4颗以上的卫星。并且GPS数据准不准,还取决于周围建筑物的高度,越高越不准,因为有遮挡。 如果本来就是GCJ-02坐标,在不同地图放大级别的时候,看到的地方可能不一样。比如你在地图级别4(国家)取到的坐标,放大到地图12级(街道)时,坐标就偏了。请确保在地图最大放大级别时,拾取坐标。 C、度分秒的概念混淆 比如,在google earth上采集到的是39°31'20.51,那么应该这样换算,31分就是31/60度,20.51秒就是20.51/3600度,结果就是39 + 31/60 + 20.51/3600 度。 D、经纬度顺序写反了 有些公司(比如高德,百度,腾讯)是先经度,再纬度,即Point(lng lat)。但谷歌坐标的顺序恰好相反,是(lat lng)。 相关问题的百度解释:http://developer.baidu.com/map/question.htm 百度地图API位置偏移的校准算法 C++算法  

Android(Java)解析有道翻译API-Json数据

Android(Java)解析有道翻译API-Json数据

软件开发 2年前 (2015-08-24) 浏览: 1019 评论: 0

由于百度翻译、有道翻译等翻译服务都开放了自己的API,开发者可以使用它们提供的API很简单就能开发出自己的翻译软件。自己开发的软件可能在功能上不及它们强大,但是翻译的结果是一样的,同时不会内置其它偷跑流量的进程,同时界面也相对简洁,随心所欲地进行修改。 首先在有道API进行申请API ID和KEY后,将下列程序中clientID和clientSecret替换为ID和KEY,通过GET请求获得字符串进行解析。下面是我使用java解析JSON数据的代码: Android(Java)解析有道翻译API-Json数据  

百度人脸识别服务首次对外开放

百度人脸识别服务首次对外开放

算法语言 2年前 (2015-08-08) 浏览: 161 评论: 0

本文由极客人转自:中文科技资讯 Citnews科技资讯网 7月24日,百度研究院深度学习实验室(IDL)宣布,通过APIStore将其自主研发的百度人脸识别技术免费对外开放。 近年来随着移动互联网的飞速发展,互联网+正在渗透到各行各业。对于需要面对面确认身份的业务而言,能否用机器自动做身份认证将成为互联网+落地的关键。深度学习带给人脸识别技术的不断进步,使得机器识别人的身份成为可能。特别是基于深度学习的人脸识别技术,其效果大大超越了传统模式识别的技术方法。在诸如在线开户、移动支付、刷脸登陆等应用场景中,如何利用可靠高效的人脸识别技术来代替传统的人工审核,是当下互联网行业中十分热门的应用方向。 百度深度学习实验室成立于2012年,从成立之初至今在人脸技术上已经积累了大量的数据和技术经验。在此之前,深度学习实验室的人脸识别技术仅仅提供给百度公司内部产品使用,其在百度的众多产品中都得到了应用,比如曾经火爆一时、最高日PV近一亿的PK大咖。该技术帮助百度魔图在App Store所有免费应用综合排名中夺冠,并获得2013中国广告节艾菲奖大中华区金奖。为了进一步推动人脸识别技术在实际场景中的应用,让更多的用户受益,深度学习实验室决定将自己所研发的业内最为领先的人脸识别技术通过APIStore开放出来,对所有开发者免费提供直接针对人脸注册、登陆、身份认证、多人脸比对等细分场景的一站式人脸识别服务。 一个月前,深度学习实验室研发的文字识别技术(OCR)通过APIStore首次对外开放,已经引起了业界的强烈关注。后续,深度学习实验室会根据上述技术的应用情况,逐步开放其它图像识别技术,推动图像识别技术在移动互联网、O2O及其它领域的应用。我们相信,先进的技术,只有得到了更多的应用,才真正实现了价值,同时,技术也只有在实际中得到检验,不断改进,才能够真正促进技术的发展。 APIStore由百度出品,是一个连接服务商与开发者的第三方API分发平台。致力于为开发者提供最全面最便捷的API服务,以及帮助全国的中小企业开放他们的服务,为服务商提升API调用量。截至目前,平台已汇集了国内外应用开发所需的Android/IOS API和SDK等700余个服务,包含设计开发、运维管理、云服务、APP推广、数据服务等多个范畴。 平台首推即用API的创新模式,开发者登录百度账号即可直接在平台上调用服务,且提供统一格式的请求参数、请求示例,尽可能的简化了开发者的工作。目前体验专区中的即用服务全部免费,包括百度首次对外开放的OCR文字识别、人脸识别等百度独家服务。 APIStore官方网站:apistore.baidu.com, 百度人脸识别API地址:http://apistore.baidu.com/apiworks/servicedetail/464.html 关于APIStore APIStore由百度出品,是一个连接服务商与开发者的第三方API分发平台。平台致力于为开发者提供最全面最便捷的API服务,以及帮助服务商开放服务,提升API调用量。目前平台已汇集了国内外应用开发所需的Android/IOS API和SDK等700余个服务,特有百度独家的检索抓取、语音图像、地图翻译等服务。首创即用API模式,使用百度账号即可调用平台内所有即用API,让开发工作如此简单。

PHP实现酒店查询:WEB+SQL数据库+JSON-API

PHP实现酒店查询:WEB+SQL数据库+JSON-API

算法语言 2年前 (2015-07-27) 浏览: 351 评论: 2

项目复述: PROBLEM : HOTEL RESERVATION A hotel chain operating in Miami wishes to offer room reservation services over the internet. They have three hotels in Miami: Lakewood, Bridgewood and Ridgewood. Each hotel has separate weekday and weekend (Saturday and Sunday) rates. There are special rates for rewards customer as a part of loyalty program. Each hotel has a rating assigned to it. Lakewood with a rating of 3 has weekday rates as 110$ for regular customer and 80$ for rewards customer. The weekend rates are 90$ for regular customer and 80$ for a rewards customer. Bridgewood with a rating of 4 has weekday rates as 160$ for regular customer and 110$ for rewards customer. The weekend rates are 60$ for regular customer and 50$ for a rewards customer. Ridgewood with a rating of 5 has weekday rates as 220$ for regular customer and 100$ for rewards customer. The weekend rates are 150$ for regular customer and 40$ for a rewards customer. Write a program to help an online customer find the cheapest hotel. The input to the program will be a range of dates for a regular or rewards customer. The output should be the cheapest available hotel. In case

谈谈网络API

谈谈网络API

极客视点 计算机技术 2年前 (2015-06-27) 浏览: 196 评论: 0

尤其是微信公众平台的流行以来,网络API越来越流行。没有任何技术和资源的互联网爱好者,都可以借助网络上免费、开放的API搭建自己的公众号,而且功能也可以相当强大,比如查天气、查股票、查火车票、聊天讲笑话、查IP、手机归属地……当然,网络API的使用不仅仅局限于微信开发,还可以适用于安卓等移动端软件开发。 很多软件都有天气查询功能,但并不是所有的天气软件开发者“家”里都有天气卫星和地面观测站;很多软件都有根据用户所处位置提供有针对性的服务:比如你想用饿了么点一份快餐,它能根据你的位置找到你附近的餐厅;你用美团买附近电影院的观影票,现在的问题是:你觉得饿了么和美团会开发一套定位加地图的系统吗?现在国内比较知名的地图应用有高德地图和百度地图,两者提供了定位、导航的API和相关开发者SDK和文档。 个人认为,网络开放接口很大一部分程度推动软件应用尤其是移动应用的繁荣。借助天气API,我们可以很简单地实现制作一个查天气的APP,然后辅以百度地图API可以很简单地知道你当前所处地方的天气了。而这些,如果没有诸多的开放平台,没钱没技术的开发者是无法实现的,这也很大地降低了开发者的成本和门槛。 网络上API有免费的,比如地图定位、IP、手机归属地;也有收费的,比如你要为你的网站登录加入短信验证码认证,也有的是在一定使用次数内免费,在使用次数超出免费套餐外的需要收费。 就我所见的,目前互联网免费的网络API很多,大部分是JSON和webservice,还有一些其它编程语言的开发平台SDK。 你有没有想过为自己的数据搭建个API? 在之前的文章依托虚拟主机为自制APP提供软件更新服务中我介绍了怎样用PHP访问数据库返回JSON格式字符串,从而搭建自己的网络API;在文章我介绍了使用java+webservice连接数据库发布数据和实现查询、增删数据操作。 极客人最近就想到了学校教务系统就可以为学生查询成绩搭建一个API,一卡通中心可以提供一个查询账单的API,学校的跑操系统提供查询跑操次数,这些都是分分钟可以实现的问题,不知道学校不尝试一下呢,然后交由第三方实现相关APP。当然官方不开放API,并不代表第三方没有办法,办法是有的但是很暴力,那就是模拟用户登录、抓取页面然后解析数据提供给用户。但这样做实在是麻烦,也耗费程序猿的脑力。

WordPress函数钩子(Hook)大全(3)

WordPress函数钩子(Hook)大全(3)

百元百科 2年前 (2015-05-29) 浏览: 132 评论: 0

管理界面相关 activate_(插件文件名) 首次激活某插件时执行此动作函数。参见常用函数-register_activation_hook。 activity_box_end 在控制板界面上的活动框末端执行该动作函数。 add_category_form_pre 添加分类的文本框尚未显示在管理菜单的界面上时,执行此动作函数。 admin_head 在控制板的HTML版块<head>中执行此动作函数。 admin_head-(page_hook)或admin_head-(plguin_page) 在插件所生成页面的控制板的HTML版块<head>中执行此动作函数。 admin_init 加载管理界面前执行该动作函数。参见wp-admin/admin.php ,wp-admin/admin-post.php ,以及wp-admin/admin-ajax.php 。 admin_footer 在主标签中的控制板末端执行该动作函数。 admin_print_scripts 在HTML的信息头部分执行此动作函数,以使插件将JavaScript脚本添加到所有管理界面。 admin_print_styles 在HTML的信息头部分执行此动作函数,以使插件将CSS或样式表单添加到所有管理界面。 admin_print_scripts-(page_hook) 或 admin_print_scripts-(plugin_page) 执行此动作函数,以便将JavaScript脚本输入某个由插件生成的管理页面的HTML信息头部分。使用add_management_page(), add_options_page()等函数将插件菜 单选项添加到管理菜单中时,返回(page_hook)。示例如下: check_passwords 创建新用户账号时,执行该动作函数以验证两次输入的密码是否一致。函数接收的参数:登录名数组,首次输入的密码,第二次输入的密码。 dbx_page_advanced 在管理菜单的页面编辑界面上“advanced”版块的最下方执行此动作函数。 dbx_page_sidebar 在管理菜单的页面编辑界面工具条的最下方执行此动作函数。 dbx_post_advanced 在管理菜单的日志编辑界面上“advanced”版块的最下方执行此动作函数。 dbx_post_siderbar 在管理菜单的日志编辑界面工具条的最下方执行此动作函数。WordPress 2.5或更高版本中则执行 [http://www.wordpress.la/codex-%E5%B8%B8%E7%94%A8%E5%87%BD%E6 %95%B0-add_meta_box%28%29.html add_meta_box()]函数。 deactivate_(插件文件名) 禁用插件时执行此动作函数。 delete_user 删除用户时执行此动作函数。函数接收的参数:用户ID。 edit_category_form 添加/编辑分类表显示在界面上后(HTML表标签结束前),执行此动作函数。 edit_category_form_pre 编辑分类表显示在管理菜单界面前,执行此动作函数。 edit_tag_form 添加/编辑标签表显示在界面上后(HTML表标签结束前),执行此动作函数。 edit_tag_form_pre 编辑标签表显示在管理菜单界面前,执行此动作函数。 edit_form_advanced 在管理菜单中日志编辑框的“advanced”版块前执行此动作函数。 edit_page_form 在管理菜单中页面编辑框的“advanced”版块前执行此动作函数。 edit_user_profile 在管理菜单中用户资料的最后部分执行此动作函数。 load_(page) 加载管理菜单页面时执行此动作函数。该动作函数不能直接添加——添加管理菜单过程参见定制插件管理菜单。如果希望直接添加该函数,add_options_page和类似函数返回的值能够给出动作函数名称。 login_form 在登录框的结尾部分前执行此动作函数。 login_head 在登录界面HTML页眉部分的结尾部分前执行此动作函数。 lost_password 在“通过电子邮件找回密码”显示在登录界面前执行此动作函数。 lostpassward_form 在通过电子邮件找回密码的表格尾部执行此动作函数,使插件能够提供更多字段。 lostpassward_post 用户要求通过电子邮件找回密码时执行此动作函数,使插件能够在找回密码前修改PHP $_POST变量。 manage_link_custom_column 反向链接管理界面中出现未知列名称时执行此动作函数。函数接收的参数:列名称,链接ID。参见[http://www.wordpress.la/codex-%E6%8F%92%E4%BB%B6API%E4%B9%8B %E5%B8%B8%E7%94%A8%E8%BF%87%E6%BB%A4%E5%99%A8%E5%87%BD%E6%95%B0.html 插件API/常用过滤器函数]中的过滤器函数manage_links_columns,该函数可添加自定义列。 manage_posts_custom_column 日志管理界面中出现未知列名称时执行此动作函数。函数接收的参数:列名称,日志ID。参见[http://www.wordpress.la/codex-%E6%8F%92%E4%BB%B6API%E4%B9%8B%E5 %B8%B8%E7%94%A8%E8%BF%87%E6%BB%A4%E5%99%A8%E5%87%BD%E6%95%B0.html 插件API/常用过滤器函数]中的过滤器函数manage_posts_columns,该函数可添加自定义列。(具体用法和示例参见 Scompt's tutorial )。 manage_pages_custom_column 页面管理界面中出现未知列名称时执行此动作函数。函数接收的参数:列名称,页面ID。参见插件API/常用过滤器函数中的过滤器函数manage_pages_columns,该函数可添加自定义列。 password_reset 用户将旧密码更改为新密码前执行此动作函数。 personal_options_update 用户在控制板中更新设置时执行此动作函数。 plugins_loaded 所有插件加载完毕后执行此动作函数。 profile_personal_options 在用户资料编辑iemian的“关于您自己”版块结尾处执行此动作函数。 profile_update 更新用户资料时执行此动作函数。函数结合搜的参数:用户ID。 register_form 在新用户注册表结尾部分前执行此动作函数。 register_post 处理新用户注册请求前执行此动作函数。 restrict_manage_posts 需要编辑的日志列表显示在管理菜单界面前,执行此动作函数。 retrieve_password 检索用户密码以发送密码提醒邮件时执行此动作函数。函数接收的参数:登录名。 set_current_user 默认函数wp_set_current_user更改用户后,执行此动作函数。注意:wp_set_current_user是一个“插入式”函数,即插件可以改写该函数;参见插件API。 show_user_profile 在用户资料编辑界面结尾部分执行此动作函数。 simple_edit_form 在控制板的“简单”日志编辑框的结尾部分执行此动作函数(默认情况下,简单编辑框仅用于书签工具——没有“高级”选项)。 update_option_(option_name) update_option函数更新WordPress选项后,执行该动作函数。函数接收的参数:原选项值,新选项值。用户需要为希望更新的选项添加一个动作函数,例如更新“foo”时用函数update_option_foo来呼应。 upload_files_(tab) 执行该动作函数以显示上传文件管理界面上的某个页面;“tab”是自定义动作函数表的名称。可以用过滤器函数wp_upload_tabs来定义自定义表(参见 插件API/常用过滤器函数)。 user_register 首次创建用户资料时执行此动作函数。函数接收的参数:用户ID。 wp_ajax_(action) 在管理菜单中执行此动作函数以运行未知类型的AJAX。 wp_authenticate 用户登录时,执行该动作函数以验证用户身份。函数接收的参数:用户名和密码数组。 wp_login 用户登录时执行此动作函数。 wp_logout 用户退出登录时执行此动作函数。 高级动作函数 本部分介绍的都是与WordPress查询(决定该显示哪一篇日志)、WordPress主循环、激活插件以及WordPress基础代码相关的动作函数。admin_menu控制板中的菜单结构显示无误后,执行此动作函数。admin_notices管理菜单显示在页面上时执行此动作函数。blog_privacy_selector博客默认隐私选项显示在页面上时,执行此动作函数。check_admin_referer系统出于安全考虑检查随机数后在默认函数check_admin_referrer中执行check_admin_referer动作钩子,使插件因安全原因而强制WordPress停止运行。注意:check_admin_referrer也是一个“插入式”函数,即插件可以改写该函数;参见插件API。check_ajax_referer系统从cookies中成功验证用户的登录名和密码后,在默认函数 check_ajax_referer(这是在有AJAX请求进入wp-admin/admin-ajax.php脚本时所调用的函数)中执行此动作函数,使插件能够因安全原因强制WordPress停止运行。注意: check_ajax_referer函数也是一个“插入式”函数,即插件可以改写该函数;参见插件API。generate_rewrite_rules重写规则生成后,执行此动作函数。函数接收的参数:WP_Rewrite类变量列表。注意:在修改重写规则时,使用rewrite_rules_array过滤器函数比使用该动作函数更加方便。initWordPress加载完毕但尚未发送页眉信息时执行该动作函数。函数适用于解析$_GET or $_POST 触发器。loop_endWordPress主循环最后一篇日志执行完毕后,执行此动作函数。loop_start执行WordPress主循环第一篇日志前,执行此动作函数。parse_query在主查询或WP_Query 的任何实例(如query_posts,get_posts或get_children)中查询解析结束时,执行此动作函数。函数接收的参数:$wp_query 对象内容列表。parse_request在主WordPress函数wp中解析查询请求后,执行该动作函数。函数接收的参数:引用全局变量$wp对象的数组。pre_get_posts在get_posts函数开始操作查询前执行此动作函数。函数接收的参数:$wp_query对象的内容列表。sanitize_comment_cookies HTTP请求读取cookies后执行此动作函数。send_headers在WordPress主函数wp中发送基本HTTP页眉后执行此动作函数。函数接收的参数:引用全局变量$wp对象的数组。shutdown页面内容输出完毕后执行此动作函数。wp在WordPress主函数wp中解析查询、页面加载完毕后,执行模板前,执行此动作函数。函数接收的参数:引用全局变量$wp对象的数组。

wordpress函数钩子(hook)大全(2)

wordpress函数钩子(hook)大全(2)

百元百科 2年前 (2015-05-29) 浏览: 880 评论: 0

反向链接动作钩子函数 add_link 新反向链接首次加入数据库时,执行此动作函数。函数接收的参数:链接ID。 delete_link 删除反向链接时,执行此动作函数。函数接收的参数:链接ID。 edit_link 编辑反向链接时,执行此动作函数。函数接收的参数:链接ID。 Feed动作钩子函数 atom_entry 在atom订阅中,显示某篇博客日志信息后(但关闭该日志标签前),执行此动作函数。 atom_head 在atom订阅中,显示所订阅的某个博客信息后,还未显示该博客第一篇日志前,执行此动作函数。 atom_ns 为atom订阅的根XML元素执行此动作函数(以添加命名空间)。 commentrss2_item 在评论订阅中,显示某条评论信息后(但关闭该评论的标签前),执行此动作函数。函数接收的参数:评论ID,日志ID。 do_feed_(feed) 生成订阅信息时执行此动作函数,其中的订阅指的是订阅类型(rss2,atom,rdf等)。显示订阅信息所用优先级应低于10。函数接收的参数:true(评论订阅),或false(日志订阅)。 rdf_header 在rdf订阅中,显示所订阅的博客信息后,还未显示该博客第一篇日志前,执行此动作函数。 rdf_item 在RDF订阅中,显示某篇博客日志信息后(但关闭该日志标签前),执行此动作函数。 rdf_ns 为RDF订阅的根XML元素执行此动作函数(以添加命名空间)。 rss_head 在RSS订阅中,显示所订阅的博客信息后,还未显示该博客第一篇日志前,执行此动作函数。 rss_item 在RSS订阅中,显示某篇博客日志信息后(但关闭该日志标签前),执行此动作函数。 rss2_head 在RSS2订阅中,显示所订阅的博客信息后,还未显示该博客第一篇日志前,执行此动作函数。 rss2_item 在RSS2订阅中,显示某篇博客日志信息后(但关闭该日志标签前),执行此动作函数。 rss2_ns 为RSS2订阅的根XML元素执行此动作函数(以添加命名空间)。 模板相关动作钩子函数 comment_form 在标准WordPress主题中执行此动作函数以插入评论表单。函数接收的参数:日志ID。 do_robots 模板文件选择器认为这是一个来自robots.txt的请求时,执行该动作函数。 do_rebotstxt 在do_robots函数为robots.txt文件显示“Disallow”链接前,执行此动作函数。 get_footer 加载footer.php模板文件前,模板调用get_footer函数时执行此动作函数。 get_header 加载header.php模板文件前,模板调用get_header函数时执行此动作函数。 switch_theme 更改博客主题时执行此动作函数。函数接收的参数:新主题的名称。 template_redirect 决定用以显示所请求页面的模板文件前执行此动作函数,以便插件改写对模板文件的选择。示例(仅供参考,无实际用途):将所有请求重定向到当前主题目录下的all.php模板文件。 wp_footer 模板在博客页面的最下方附近调用wp_footer函数时执行该动作函数。 wp_head 模板调用wp_head函数时执行动作函数wp_head。wp_head通常被放在页面模板最上方< head>和 </head>之间。该动作函数不接受参数。 wp_meta 模板文件sidebar.php调用wp_meta函数以允许插件在侧边栏加入内容时,执行此动作函数。 wp_print_scripts WordPress将已记录的JavaScript脚本输入页面的页眉部分前,执行此动作函数。

wordpress函数钩子(hook)大全(1)

wordpress函数钩子(hook)大全(1)

百元百科 2年前 (2015-05-27) 浏览: 222 评论: 0

一、在典型请求中运行的动作钩子 当已登录用户在默认主题打开网站主页时,WordPress会运行以下动作钩子函数: plugins_loaded sanitize_comment_cookies setup_theme auth_cookie_malformed auth_cookie_valid set_current_user init widgets_init parse_request send_headers pre_get_posts posts_selection wp template_redirect get_header wp_head wp_print_styles wp_print_scripts loop_start loop_end get_sidebar wp_meta get_footer wp_footer 二、日志、页面、附件以及类别相关的动作钩子函数 add_attachment 附件文件首次加入数据库时,执行add_attachment函数。函数接收的参数:附件ID。 add_category 与create_category相同。 clean_post_cache 清除日志缓存时,执行该动作函数。函数接收的参数:日志ID。参见clean_post_cache()。 create_category 生成新类别时,执行该动作函数。函数接收的参数:类别ID。 delete_attachment 从数据库和相应链接/日志中删除某个类别后,执行该动作函数。函数接收的参数:类别ID。 delete_post 将要删除某篇日志或页面时,执行该动作函数。函数接收的参数:日志ID或页面ID。 deleted_post 删除某篇日志或页面后,执行该动作函数。函数接收的参数:日志ID或页面ID。 edit_attachment 数据库中附件文件被更新时执行该动作函数。函数接收的参数:附件ID。 edit_category 更新/编辑某个类别时(包括添加/删除日志或博客反向链接,或更新日志/博客反向链接的类别),执行该动作函数。函数接收的参数:类别ID。 edit_post 更新/编辑某篇日志或页面时(包括添加/更新评论,这会导致日志评论总数的更新),执行该动作函数。函数接收的参数:日志ID或页面ID。 pre_post_update 更新日志或页面前执行该动作函数。函数接收的参数:日志ID。 private_to_publish 当日志状态从private(私密)更改为published(公开)时,执行该动作函数。函数接收的参数:日志对象。(用以翻译日志状态的动作函数目前可用;参见wp_transition_post_status())。 publish_page 发表页面或编辑某个状态为“published”的页面时,执行该动作函数。函数接收的参数:页面ID。(警告:该动作函数不能在WordPress 2.3以及更高版本中运行;但动作函数'transition_post_status'能够运行。更新信息:publish_page动作函数可在WordPress 2.6及之后版本中运行。) publish_phone 通过电子邮件添加新日志后,执行该动作函数。函数接收的参数:日志ID。 publish_post 发表日志或编辑某个状态为“published”的日志时,执行该动作函数。函数接收的参数:日志ID。 save_post 新建或更新一篇日志/页面时,执行该动作函数。更新可以来自导入、日志/页面编辑框、xmlrpc或邮件日志。函数接收的参数:日志ID。 更新信息存入数据库后执行该动作函数。 注意:日志ID可能会参照日志的修改版而不是最新发布版。wp_is_post_revision可获取日志最新版的ID。 wp_insert_post 与save_post相同,更新信息存入数据库后执行该动作函数。 xmlrpc_public_post 通过XMLRPC请求发表日志,或通过XMLRPC编辑某个状态为“published”的日志时,执行该动作函数。函数接收的参数:日志ID。 三、评论、Ping以及引用通告相关动作钩子函数 comment_closed 尝试显示评论输入框而日志却设置为不允许评论时,执行该动作函数。函数接收的参数:日志ID。 comment_id_not_found 试图显示评论或评论输入框却未找到日志ID时,执行该动作函数。函数接收的参数:日志ID。 comment_flood_trigger 调用wp_die以阻止接收评论前,若检测到评论数量异常增多,执行该动作函数。函数接收的参数:上一次评论发表时间,当前评论发表时间。 comment_on_draft 日志为草稿状态却试图显示评论或评论输入框时,执行该动作函数。函数接收的参数:日志ID。 comment_post 评论刚被存入数据库时,执行此动作函数。函数接收的参数:评论ID,评论审核状态("spam",0(表示未审核),1(表示已审核))。 edit_comment 数据库中的评论被更新或编辑后,执行此动作函数。函数接收的参数:评论ID。 delete_comment 评论即将被删除前,执行此动作函数。函数接收的参数:评论ID。 pingback_post 日志新添加pingback后,执行此动作函数。函数接收的参数:评论ID。 pre_ping 执行pingback前,执行此动作函数。函数接收的参数:将要处理的日志链接数组,以及日志的“pung”设置。 trackback_post 日志新添加trackback后,执行此动作函数。函数接收的参数:评论ID。 wp_blacklist_check 执行该动作函数以判断评论是否应被禁止。函数接收的参数:评论者的名称、电子邮件、URL、评论内容、IP地址、用户代理(浏览器)。该函数可执行wp_die以拒绝评论,也可以修改某个参数以使评论中可包含用户在WordPress选项中设置的黑名单关键词。 wp_set_comment_status 评论状态发生改变时,执行此动作函数。函数接收的参数:评论ID,表明新状态的状态字符串("delete", "approve", "spam", "hold")。

依托虚拟主机为自制APP提供软件更新服务(一)

依托虚拟主机为自制APP提供软件更新服务(一)

软件开发 3年前 (2015-04-21) 浏览: 528 评论: 2

学了一个月的安卓,写了几个小程序,总是觉得缺少点什么。看到一般市场上的软件都提供软件更新服务,极客人想自己也有个虚拟主机,是不是可以自己搭建一个软件更新服务器呢?百度了一下“依托虚拟主机为自制APP提供软件更新服务”,可惜找遍整个百度也没找到解决方案,所以一穷二白,自己干。 要想实现软件更新,肯定有个服务器端发布的最新软件版本号与用户端当前使用的版本进行比对。如果版本号相同,则提示用户“当前为最新版本”;如果服务器上发布的最新版本高于用户使用的,则提示“版本更新”,并提供下载功能,下载完毕之后自动执行安装。要想获取最新版本号,必须读取数据库,如果直接用用户加密码的方式直接连接数据库的话,这无疑不安全,因为如果反编译或者破解了你的软件,你的数据库将会任人宰割。所以,我想到的解决方案是,自己在服务器端利用PHP做一个API,使用API请求的方法获取最新版本号和版本描述及下载地址。在奋斗几个星期后,下面是我的具体实现步骤: 依托虚拟主机为自制APP提供软件更新服务(一)——使用PHP制作API 1.新建软件数据库表,添加软件ID、版本号、下载地址、版本描述等列; SQL语句如下:   建立的数据库表名为:mysoftware,结构如图: 2.PHP调用数据库返回JSON格式字符串 我在自己的虚拟主机根目录新建了命名为“api”文件夹,在“api”文件夹下建立两个php文件:update.php和db_connect.php。 其中db_connect.php是连接数据库的PHP文件,里面记录了连接数据库的数据库名、用户名、主机、密码、编码格式,代码如下:   你可以访问该PHP的URL测试改文件是否正确。 update.php是返回JSON字符串的PHP文件。它的作用是调取软件数据库表内的内容,并通过GET方法返回数据。 其代码如下:   在这个文件里,通过”http://wangbaiyuan.cn/api/update.php?id=1”GET方式接受传值,然后调用了db_connect.php文件连接的数据库,执行$string = "select * from my_software where sw_id=".$id;语句,然后对结果进行解析返回标准的JSON格式字符串。其中jsons_encode函数你可以参考我之前的一篇文章:PHP用json_encode转换数组中文乱码进行理解; 下面我制作成功后访问http://wangbaiyuan.cn/api/update.php?id=1的网页内容: 看到这段字符串你可能大脑就会兴奋了,你可能能想到下面就是根据不同平台对JSON数据进行解析的工作了 依托虚拟主机为自制APP提供软件更新服务(二)——安卓解析API数据 在下一节我将通过安卓示例,向大家讲解对JSON数据进行解析为自制APP提供软件更新服务,查看下一节。 代码下载

Android开发解析JSON数据

Android开发解析JSON数据

算法语言 3年前 (2015-04-07) 浏览: 473 评论: 0

对于服务器端来说,返回给客户端的数据格式一般分为html、xml和json这三种格式,那么本篇随笔将讲解一下json这个知识点,包括如何通过json-lib和gson这两个json解析库来对解析我们的json数据,以及如何在我们的Android客户端解析来自服务器端的json数据,并更新到UI当中。 一、什么是json json(Javascript Object Notation)是一种轻量级的数据交换格式,相比于xml这种数据交换格式来说,因为解析xml比较的复杂,而且需要编写大段的代码,所以客户端和服务器的数据交换格式往往通过json来进行交换。尤其是对于web开发来说,json数据格式在客户端直接可以通过javascript来进行解析。 json一共有两种数据结构,一种是以 (key/value)对形式存在的无序的jsonObject对象,一个对象以“{”(左花括号)开始,“}”(右花括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。 例如:{"name": "xiaoluo"}, 这就是一个最简单的json对象,对于这种数据格式,key值必须要是string类型,而对于value,则可以是string、number、object、array等数据类型: 另一种数据格式就是有序的value的集合,这种形式被称为是jsonArray,数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。 更多的有关json数据格式可以参加json的官网,http://www.json.org/json-zh.html 二、解析json数据格式 这里将使用两种json的解析库来对我们的json数据格式进行解析以及生成我们的json数据格式。 1.json-lib(http://json-lib.sourceforge.net/) 使用json-lib来进行解析,我们需要引入第三方的包,因为json-lib分为了两个版本,一个版本是针对于jdk1.3的,一个版本是针对于jdk1.5的,这里我们下载jdk1.5的这个json-lib包,其中还需要引入其他的几个jar包: 下载好这几个jar包后,加入到classpath中即可。我们来看看json-lib给我们提供的API。 我们最常用的两个类就是  JSONObject和JSONArray这两个类,分别代表了json对象和json数组,这两个类都实现了 JSON 这个接口,下面我们通过几个小例子来看看如何将我们常见的几种数据格式转换成我们的json对象(我们一般称之为JSON数据的序列化)以及再将json对象在转换成我们的数据格式(称之为反序列化)。 ①简单的javabean的序列化和反序列化     首先我们定义一个简单的javabean对象,然后将一个Person对象转换成json对象,然后再将这个json对象反序列化成我们的Person对象。 我们先定义一个JsonTools类,这个类有两个静态方法,我们可以通过这两个方法来得到一个JSON类型的字符串对象,以及一个JSON对象     我们可以直接通过 JSONObject jsonObject = new JSONObject(); 这个方法就可以得到一个json对象,然后通过element()或者是put()方法来给我们的json对象添加key/value对。我们先来看看第一个例子,实现一个简单的Person对象和json对象的转换 我们看看控制台的输出: 整个外面的大括号是一个json对象,里面有一对key/value,其中里面的{"address":"广州","id":1,"name":"xiaoluo"}就是我们转换成的json字符串对象 再来看看如何将json对象转换成我们的bean对象 ②转换List<Person>类型的对象     ③List<Map<String, String>>类型的json对象转换     通过上面的例子,我们可以了解了如何通过json-lib这个解析库来实现javabean、List、Map等数据和json数据的互相转换 2.gson(http://code.google.com/p/google-gson/) 下面我们来看看Google提供的gson这个json解析库,同样我们需要去下载gson这个jar包,导入到我们的项目中 使用gson,我们可以非常轻松的实现数据对象和json对象的相互转化,其中我们最常用的就是两个方法,一个是fromJSON(),将json对象转换成我们需要的数据对象,另一个是toJSON(),这个就是将我们的数据对象转换成json对象。下面我们也通过一个综合的例子来看看gson的使用方法:         看看控制台的输出:   三、在Android客户端解析服务器端的json数据 下面我们来完成一个综合的例子,Android客户端通过一个AsyncTask异步任务请求服务器端的某些数据,然后在解析完这些数据后,将得到的数据内容更新到我们的Spinner这个UI控件当中。 我们首先来看下服务器端的代码:     如果客户端请求的参数是type=json,则响应给客户端一个json数据格式 接着来看看客户端的代码,首先看看客户端的布局文件,其实就是一个按钮和一个Spinner控件,当点击按钮后,通过http协议请求服务器端的数据,然后在接收到后再更新我们的Spinner控件的数据     在Android客户端写一个解析json数据格式的类:     当然我们的HttpUtils类也不可少:     最后来看看我们的MainActivity类:     当然别往了开启我们的网络授权 最后我们来看看效果图: 这样我们就完成了客户端与服务器端通过json来进行数据的交换 总结:本篇随笔主要讲解了JSON这种轻量级的数据交换格式的概念,以及讲解了两种解析json数据的解析类(json-lib以及gson),最后通过一个小例子实现了在Android客户端和服务器端使用json这种数据格式来进行数据的交换。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

切换登录

注册