使用google地图API获得经纬度

description: 
教大家在drupal中使用gmap的API获取经纬度
大家好!我是Lester,这是第一次写教程,希望大家捧场。
 
我每次使用google地图的时候都会感叹其数据之丰富功能之周全,总之一句话,google很好!很强大!很牛逼!
 
那么我们用Drupal的建立的网站能否也沾上点google的仙气,做出一些类似google地图的功能呢?
 
答案是——其实答案很明显,如果不能的话我也不用在这废话了,您说是吧。(急性子的读者别拿鸡蛋砸我,我马上就进入正题!)
 
Google地图为我们开发网站的人员提供了丰富API,用来以各种方式调用它的数据,这次我们要使用的是其中一个比较简单的功能:向google发送地点信息,返回此地点对应的经纬度。
 
 
而反映到我们的网站上就是这样一个页面:列出表单让用户输入一个地址(MM最好填的是家庭地址,嘿嘿),点击提交按钮后向google发送信息,并取得返回的经纬度(这下就能锁定MM了,哈哈哈……)。
 
我们将开发一个模块来实现以上功能,就用geoinfogeography infomation)作为模块的名字吧,总算有点描述性。然后就是在htdocs\drupalbar\sites\all\modules\custom目录下建立geonfo文件夹,并且在里面建立geoinfo.info(该死,起的名字有点别扭,大家原谅我吧……),和geoinfo.module文件。
 
geoinfo.info文件该怎么写就不用我说了吧?什么?最好说一下?那好吧,反正我是这么写的:
 
name = geography  information  page
version =6.x-1.0
description’ = get geography infomations from google
core = 6.x
 
第一步当然是建立表单了,很基础的表单,一个填写地址的文本框,一个提交按钮。文本框是用来填地址的,提交按钮是用来提交表单并向google发送请求的。通过在geoinfo.module中输入以下代码实现:
 
<?php
 
/**
 * @file
 *
 * get the geography infomation for the user's address from google
 */
 
/**
 * implent the hook menu
 */
 
function geoinfo_menu() {
         $items['admin/geoinfo'] =array(
            'title' =>'geography infomation',
            'page callback' => 'geoinfo_page',
            'access arguments' =>array('access content'),
            'type' => MENU_CALLBACK,
         );
         return $items;
}
 
/**
 * create the geoinfo page
 */
 
function geoinfo_page() {
         $output= t('this page contained the address form');
         $output .=drupal_get_form('geoinfo_addressform');
         return $output;
}
 
/**
 * define the address form
 *
 */
 
function geoinfo_addressform() {
         $form['address'] = array(
            '#title' => 'address',
            '#type' => 'textfield',
            '#description' => t('please enter your address')
         );
        
         $form['submit'] = array(
            '#type' => 'submit',
            '#value' => t('send'),
         );
         return $form;
}
 
/**
 * validate the addressform
 */
 
function geoinfo_addressform_validate($form,&$form_state) {
         if($form_state['values']['address']==Null) {
                form_set_error('address',t('please enter your address'));
         }
}
 
/**
 * submit the addressform
 */
 
function geoinfo_addressform_submit($form,&$form_state) {
    $address='http://maps.google.com/maps/geo?q='.$form_state['values']['address'].'&output=csv&key=abcdefg';
         drupal_set_message($address);
         $result =drupal_http_request($address);
         drupal_set_message(t('geoinfo:%result',array('%result'=>$result->data)));
}
 
先看看结果:
 
                  我们建立的表单
 
address中输入北京的结果:
 
              输入‘北京’后点击send的结果
 
现在让我们来解释一下代码。
 
代码分为两部分:
 
1是基础的定义表单,这里不会的赶紧去看ProDrupal v6,英文不好的同学嘛,嘿嘿。乖乖的给www.drupalbar.com贡献点击吧,因为我们有中文版!虽然没翻译完,但是这里只用到了第二章,第十章的一些基本知识,而这正是我们首先翻译的几章之二,大家边读边写,肯定能定义基本的表单。怎么样,我们考虑的周全吧,大家呱唧呱唧(哗哗哗——鼓掌声)。
 
2就是最后的submit函数用的google地图PAI,这里我们主要用到的是地址解析部分(具体参见http://code.google.com/intl/zh-CN/apis/maps/documentation/services.html#Geocoding)。而且是用http请求进行地址解析。说白了就是按照google给的准则写出一个包含了你的地址信息的网址,访问这个网址就能得到其对应的经纬度。代码中把用户输入的部分定义为变量$address,所以这个网址就是:
http://maps.google.com/maps/geo?q=北京&output=csv&key=abcdefg
 
我们把它大卸八块来分析:
http://maps.google.com/maps/geo?这是google地图的访问网址是固定的,下面的才是参数
q=北京 q=后面跟的就是你输入的地址
&output=csv 返回的数据的格式,有xmlkmljsoncsv等等,这里使用的csv是仅仅返回4个数字,分别对应1http信息 2:数据的精确程度 3:经度 4:纬度。这种模式虽然简洁好操作,但是返回信息的精确度不高(这里不是说得到的数值不准,而是所能体现的情况有限,因为只返回两个数字来表示目标区域的中心点经纬度)。
&key=abcdefg &key=后面跟的是在google上注册获得的使用API的密钥,代表了你使用此功能的权限。而abcdefggoogle地图API教程里使用的样例,如果你有自己的网站要使用此功能,还是要去注册一个,放心吧,免费的。
 
然后就是访问这个网址,用的是drupal_http_requets();函数,其参数就是直接在括号里填上刚才拼成的网址,然后用一个变量$result来保存这个网址返回的信息。再使用:
drupal_set_message(t('geoinfo:%result',array('%result'=>$result->data)));
 
 
 
 
把返回信息显示在页面上。
这里要注意的是t()函数的使用方法,主要是在其中引入变量的格式。还有就是$result得到的是一个http响应,所以我们使用$result->data的方法来取得$result里的数据。
 
如此这般,这般如此,当我们输入‘北京’,点下send,就得到了它的经纬度(这里指的其城市中心点的经纬度),其实核心语句只有一句话:
 
drupal_http_request(http://maps.google.com/maps/geo?q=北京&output=csv&key=abcdefg)
 
哈哈哈哈,真是强大到不可阻挡啊(读者:笑个p啊,强大的是drupalgoogle又不是你!)。
 
好了,众位的仰慕我记在心中,我们下次再……这位看官,你说什么?你说你为啥输入了‘中国 北京 你家地址’得不到经纬度?恩,这个问题很严重啊,所以问一句,你是男的还是MM?什么?MM?你输入的你家地址是多少?(众人一片叫骂:色狼,快回答问题,不要做了色狼再做骗子!)
 
恩,咳,咳咳……其实,问题的答案很简单,那就是,我们要访问的是一个网址,网址中是不能输入空格的,所以如果要输入数个关键字的时候,请不要用空格分割……(众人更是叫骂:靠,敢给用户立这么离谱的规矩,你不如去死啊!)
 
啊,那好,实际的答案是,用urlencode($form_state['values']['address'])对你输入的内容预先处理一下,或者使用正则表达式对$address进行匹配,这两种方法的目的都是空格去掉,使之变成合法的url,这样就ok了。
这里我选择的是用正则表达式:
 
所以submit函数就变成了:
 
function geoinfo_addressform_submit($form,&$form_state) {
         $address='http://maps.google.com/maps/geo?q='.$form_state['values']['address'].'&output=csv&key=abcdefg';
         $address = preg_replace('/ /','',$address);
         drupal_set_message($address);
         $result =drupal_http_request($address);
         drupal_set_message(t('geoinfo:%result',array('%result'=>$result->data)));
}
 
这次再试试带空格的关键字,是不是ok了?那么,我说这位MM,是不是该把你家地址告诉我了?(众人怒曰:废话少说,讲完快走!)
 
想赶我走?嘿嘿,大家不觉得这样使用drupal_set_message来来回回的显示信息麻烦么?那是因为我还留了一手——在Drupal中使用jquery来丰富以上功能。
 
哈哈哈,咱们下次再见。

 

评论

写得挺好的,比较通俗,看起来也有劲一点

URL 转义不是光去除空格这么简单的,用正则会比较麻烦,直接用 urlencode 吧

汗死,这还能叫强大?比Jquery差的不是1点2点,又复杂又低效。

这里说的强大指的是google提供的api
难不成楼上直接拿jquery就能算出某个地址的经纬度?

楼主,jquery的版本放出来了么?
此外,楼主文才很自恋啊?
膜拜中。。。

在谷歌地图API允许你在你的JavaScript嵌入自己的网页谷歌地图。stools 该API提供了一个工具,用于操纵就像在http://maps.google.com网页)和向地图添加内容的服务,通过各种地图 step stools(数字,让您创建强大的地图在您的网站申请