Skip to content

Instantly share code, notes, and snippets.

@olegwtf
Created March 29, 2014 09:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save olegwtf/9851248 to your computer and use it in GitHub Desktop.
Save olegwtf/9851248 to your computer and use it in GitHub Desktop.
gortrans geo
use strict;
use feature 'say';
use Geo::Distance;
use Geo::Point;
use JSON;
use LWP::UserAgent::Cached;
use Term::ANSIColor;
use List::Util 'reduce';
use Math::Trig;
my $geo = Geo::Distance->new;
#$geo->reg_unit(6371*100, 'meters');
my $ua = LWP::UserAgent::Cached->new(cache_dir => '.', agent => undef);
my $page = $ua->get('http://maps.nskgortrans.ru/trasses.php?r=1-8-W-8%257C')->decoded_content;
my $points = decode_json($page)->{trasses}[0]{r}[0]{u};
my $total;
my $lng = 83.094589;
my $lat = 54.859261;
my @h;
for (my $i=0; $i < @{$points}; $i++) {
if ($i > 0) {
my $a = $geo->distance('meter', $points->[$i-1]{lng}, $points->[$i-1]{lat}, $points->[$i]{lng}, $points->[$i]{lat});
my $b = $geo->distance('meter', $points->[$i-1]{lng}, $points->[$i-1]{lat}, $lng, $lat);
my $c = $geo->distance('meter', $points->[$i]{lng}, $points->[$i]{lat}, $lng, $lat);
if ($a+$b > $c && $b+$c > $a && $c+$a > $b) {
my $deg = rad2deg(acos(($b**2 + $c**2 - $a**2) / (2*$b*$c)));
#warn $a;
#warn $b;
#warn $c;
#warn $deg;
#warn "-------";
if ($deg > 90) {
my $p = ($a+$b+$c)/2;
my $h = 2*sqrt($p*($p-$a)*($p-$b)*($p-$c))/$a;
push @h, {
a => $a,
b => $b,
c => $c,
deg => $deg,
h => $h,
lng => $points->[$i-1]{lng},
lat => $points->[$i-1]{lat}
};
}
else {
push @h, {
a => $a,
b => $b,
c => $c,
deg => $deg,
h => $b,
lng => $points->[$i-1]{lng},
lat => $points->[$i-1]{lat}
};
}
}
#say $geo->distance('meters', $points->[$i-1]{lng}, $points->[$i-1]{lat}, $points->[$i]{lng}, $points->[$i]{lat});
}
}
my $min = reduce { $a->{h} < $b->{h} ? $a : $b } @h;
use Data::Dumper;
print Dumper $min;
#warn $total/1000;
__END__
my $data = do {
local $/;
<DATA>;
};
my $js = decode_json($data);
my $points = $js->{trasses}[0]{r}[0]{u};
my $p1 = Geo::Point->longlat(83.087012283504, 54.8394573897716);
my $p2 = Geo::Point->longlat(83.0872375890613, 54.8392901995504);
say $p1->distance($p2);
say $geo->distance('kilometer', 83.087012283504, 54.8394573897716, 83.0872375890613, 54.8392901995504);
#for (my $i=0; $i < @{$points}; $i++) {
# if ($i > 0) {
# say $geo->distance('meters', $points->[$i-1]{lng}, $points->[$i-1]{lat}, $points->[$i]{lng}, $points->[$i]{lat});
# }
#}
#say $geo->distance('meters', 83.087012283504, 54.8394573897716, 83.0872375890613, 54.8392901995504);
{
"markers": [
{
"title": "8",
"id_typetr": "1",
"marsh": "8",
"graph": "8",
"direction": "B",
"lat": "54.859261",
"lng": "83.094589",
"time_nav": "27.01.14 23:06:21",
"azimuth": "355",
"rasp": "23:32+Цветной проезд|",
"speed": "30"
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment