perl:perl获取GPS对应的百度经纬度及两点间距离计算

package GPS;

use LWP::Simple;
use MIME::Base64;
use Math::Trig qw(great_circle_distance deg2rad);

require Exporter;
our @ISA = qw(Exporter);
our @EXPORT=qw(getBaiduPosXY getDistance);
#our @EXPORT_OK=qw(getDistance);


########################### 获取GPS转化百度经纬度 ############################
#	gps坐标的type=0
#	google坐标的type=2
#	baidu坐标的type=4
#	http://api.map.baidu.com/ag/coord/convert?from=0&to=4&x=经度&y=纬度&callback=BMap.Convertor.cbk_7594
sub getBaiduPosXY {
	my ($x,$y) = @_;
	my ($url,$content,$lat,$lon,@res);	
	
	$url = "http://api.map.baidu.com/ag/coord/convert?from=0&to=4";
	$url .= "&x=$x&y=$y";
	$url .= "&callback=BMap.Convertor.cbk_7594";
	
	$content = get($url);
	($lat,$lon) = (decode_base64($1),decode_base64($2)) if($content=~m#x":"(.*?)","y":"(.*?)"#);
	@res = ($lat,$lon);
	return @res;
}

######################## 计算百度goole地图距离 ###############################
#   http://hi.baidu.com/shooke1/item/77570cffb3b52510d7ff8cb9	
#	球面距离公式
#	R*arccos(cos(lat1*pi()/180 )*cos(lat2*pi()/180)*cos(lng1*pi()/180 -lng2*pi()/180)+
#	sin(lat1*pi()/180 )*sin(lat2*pi()/180))
#	其中,R=6370996.81;//地球半径,pi()为圆周率π,(lng1,lat1),(lng2,lat2)分别是百度地图的两个经纬度,带入数值计算即可
#	$lat,$lon 是当前坐标
#	$_lat,$_lon 是目标坐标
sub getDistance {
	my ($lon,$lat,$_lon,$_lat) = @_;
	my $R = 6371.012;
	sub NESW { 
		deg2rad($_[0]), 
		deg2rad(90 - $_[1]) 
	}
	my @L = NESW($lon, $lat);
	my @T = NESW($_lon, $_lat);
	
	my $distance = great_circle_distance(@L, @T, $R);
#	= 6371.012 * acos(
#			cos(acos(-1) / 180 * $lat) *
#            cos(acos(-1) / 180 * $_lat) *
#            cos(acos(-1) / 180 * $lon - acos(-1) / 180 * $_lon) +
#            sin(acos(-1) / 180 * $lat) *
#            sin(acos(-1) / 180 * $_lat))*1;
    return $distance;
}

1;

__END__
=pod

=head1 NAME

GPS Custom Module Map function
import: use lib "./";

=head1 getBaiduPosXY
	use GPS;
	my @pos=getBaiduPosXY(121.398189,31.23103447);
	
=head1 getDistance 
	use GPS;	
	my $distance = getDistance(121.398189,31.23103447,121.474797,31.223954);
	print $distance;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值