#!/usr/bin/perl # Open Location Codes / Plus Codes NS and EW component splitter # Author: Dan Jacobson https://www.jidanni.org/ # Copyright: https://www.gnu.org/licenses/gpl.htm # Created: 2024-04-13T09:24:43+0000 # Last-Updated: 2024-04-17T08:08:33+0000 # Update #: 90 # https://github.com/google/open-location-code/blob/main/docs/specification.md#most-significant-10-digits use strict; use warnings q(all); my $u = "Usage: $0 --mode_argument"; die $u unless @ARGV; my $mode = shift; if ( $mode eq "--split-code" ) { # Convert Plus Codes into split Plus Codes. ## We pick apart Plus Codes, separating them into their N and E components. ## Input: plus codes, one per line. Leading URL stuff, if any, will be stripped. ## echo https://plus.codes/7QP26R85+WX https://plus.codes/7QP26F86+WQ \ ## https://plus.codes/7QP26Q8X+WV | xargs -n 1 | ./olc --split-code #Output ## 7QP26R85WX: 7P68W N, Q2R5X E ## 7QP26F86WQ: 7P68W N, Q2F6Q E ## 7QP26Q8XWV: 7P68W N, Q2QXV E while (<>) { s!.*/!!; tr/+//d; chomp; my ( $i, @f ); for ( split //, $_ ) { $f[ $i++ % 2 ] .= $_; } printf "%s: %s N, %s E$/", $_, @f; } } elsif ( $mode eq "--lonlat2split_code" ) { ## Convert lon lat pairs to split codes my @a = split //, '23456789CFGHJMPQRVWX'; while (<>) { chomp; my ( @ll, @ans ); my @ll_0 = reverse split; for ( 0, 1 ) { $ll[$_] = int( 8000 * ( $ll_0[$_] + 90 * ( $_ + 1 ) ) ); } for ( 1 .. 5 ) { for ( 0, 1 ) { push @{ $ans[$_] }, $a[ $ll[$_] % 20 ]; $ll[$_] /= 20; } } my @o; for ( 0, 1 ) { $o[$_] = join "", reverse @{ $ans[$_] }; } print join " ", @o; print $/; } } ## elsif ( $mode eq "--encode" ) {...} #Just create a plus code from a lon lat ## elsif ( $mode eq "--decode" ) {...} #Just create a lon lat from a plus code else { die $u }