用PHP做基于Yahoo!Map Api 的地域访问统计
网站一直在用clustrmaps的访问统计,感觉用地图显示简单的网站访问情况很直观。单最近clustrmaps发信根我说由于网站的每日访问量超过2500,要我升级帐户才能继续使用,也就是说访问量太大要给钱,才可以用,呵呵。我不想掏钱,那只好找其他类似的服务。google的半天,竟然没有找到适合的,倒是看到结合google map做的gvisit。试用过gvisit,但并不太符合我的要求,它只是显示访问量比较大的一些ip的位置。既然找不到,那就自己写一个。在google的过程也看到很多基于google map的应用,但发现yahoo用flash实现的map更漂亮点(只是说界面,没有作过其他比较),我决定就用yahoo map api做一个网站的地域访问统计
说了一大堆废话,现在正式介绍yahoo map api。yahoo的map api提供了地理信息查询功能,只要你提交国家名称、地区、城市、街道、zip之中的一个或者多个,就可以找到相关的地点的详细地理信息,包括经纬度等。在测试的过程中发现,美国、加拿大的信息已经丰富到街道名称;中国的只是到城市级别,但这对我来说已经够用。

由于是flash的应用,Yahoo提供了Flash/AS API、AXJAX API,我不会flash,那只有用geocoding+php啦。要在地图上显示访问者的位置,那就要用到ip to city的转换,在这里我用的是maxmind的geolitecity,ip到城市的对应能达到60%,不算很理想,再多就是要钱的。通过GeoLiteCity我们就可以得到IP所在的城市,然后用Yahoo map api就可以查到城市对应的经纬度。其实GeoLiteCity就有返回经纬度,但这里介绍如何应用Yahoo map API得到城市的经纬度。
查找城市地理信息的接口是http://api.local.yahoo.com/MapsService/V1/geocode?appid=yahoodemo&output=php&location=guangzhou
其中appid是你从yahoo申请到的application id,output是指明接口返回结果的格式,默认是xml,另一种是php,如果参数设为php,那么返回的是serialize php,把返回内容用unserialize()就可以得到一个php的数组,非常方便。这里我用的就是output=php。location就是你要查询的地点。
<?php
/**
geo.inc.php
*/
##缓存从Yahoo得到的城市地理信息
function request_cache($url, $dest_file, $timeout = 243200)
{
if(!file_exists($dest_file) || filemtime($dest_file) < (time() - $timeout)) {
$fp = fopen($url, 'r');
$stream = fgets($fp);
$tmpf = tempnam('/tmp', 'YWS');
file_put_contents($tmpf, $stream);
@fclose($fp);
rename($tmpf, $dest_file);
return $stream;
} else {
return file_get_contents($dest_file);
}
}
function yahoo_geo($location)
{
$q = 'http://api.local.yahoo.com/MapsService/V1/geocode';
$q .= '?appid=vxs-unet&output=php&location=' . rawurlencode($location);
$tmp = '/tmp/geo/yws_geo_' . md5($q);
$stream = request_cache($q, $tmp);
$ret = unserialize($stream);
if(!is_array($ret)) return false;
return $ret['ResultSet']['Result'];
}
?>
详细的参数信息请看http://developer.yahoo.net/maps/rest/V1/geocode.html
查询地理信息的程序 geo.php:
<html><head>
<title>GeoCoding API Example</title>
</head><body>
<form action="/php/ymap/geo1.php" method="GET">
<input type="text" size="80" name="location" />
</form>
<?phpinclude './geo.inc';
if(!empty($_REQUEST['location'])) {
$a = yahoo_geo($_REQUEST['location']);
echo "<pre>";
print_r($a);
echo "</pre>";
}
?>
</body></html>2006年08月26日 | 分类归档: Tech

评论