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;
perl:perl获取GPS对应的百度经纬度及两点间距离计算
最新推荐文章于 2020-12-21 12:28:50 发布