#!/bin/sh PATH=/home/bsy/bin:/home/bsy/bin.`/home/bsy/bin/sys`:/usr/bin:/bin:/usr/local/bin:/usr/local/GNU/bin:/usr/local/X11/bin:/usr/X11R6/bin:/usr/local/netscape export PATH me=`basename $0` usage="$0 [-c city] [-s state] [address]" default_city='San Diego' default_state='CA' while : do case $# in 0) break;; *) case "$1" in -c) case $# in 1) echo "$me: City argument missing $usage" >&2; exit 1;; esac city="$2"; ; ;; -s) case $# in 1) echo "$me: State argument missing $usage" >&2; exit 1;; esac state="$2"; ; ;; -h|-?) echo "$usage" >&2; exit 0;; -*) echo "$me: Unrecognized flag $1 $usage" >&2; exit 1;; *) break;; esac;; esac done case $# in 0) street_addr=`xcb -p 0 | tr '\n' ','`;; *) street_addr="$*";; esac case "$street_addr" in *,) street_addr=`echo $street_addr | sed 's/,$//'`;; esac # hack for use with my on-line phone book, where .HA starts home # addresses and .WA starts work addresses. phone -r outputs "raw" # phonebook data which contains these data field tags. case "$street_addr" in .?A*) street_addr=`echo "$street_addr" | sed 's/^\.[^ ]*A[ ]//;s/,\.[^ ]*A[ ]/,/g'` ;; esac # if not set by flags.... (We assume that users will either set both # city and state by command line flags, or city only and use default state.) # case "x$city" in x) case "$street_addr" in *,*) # guess city state info encoded city=`expr "$street_addr" : '.*,\([^,]*\)'` # will probably get leading space, but back-end accepts that. # also may include zip code, which appears to be ignored by # the server at lycos.vicinity.com. street_addr=`expr "$street_addr" : '\(.*\),[^,]*'` case "$street_addr" in *,*) state="$city" city=`expr "$street_addr" : '.*,\([^,]*\)'` street_addr=`expr "$street_addr" : '\(.*\),[^,]*'` ;; esac;; esac;; esac case "x$city" in x) city="$default_city";; esac case "x$state" in x) state="$default_state";; esac # map_url="http://lycos.vicinity.com/cgi-bin/webmap?Template=lycos&Style=Fancy&Alias=1&Icon=Smallcross&File=world&Address1=&Address2=${street_addr}&Address3=$city, $state" # map_url="http://www.mapblast.com/mapblast/blast.hm?CMD=GEO&xx=1&id=9112594184707&AD2=${street_addr}&AD3=${city}, ${state}&IC=%3A%3ASmallcross&IC%3A=" # map_url="http://www.mapblast.com/mapblast/blast.hm?CMD=GEO&xx=1&AD2=${street_addr}&AD3=${city}, ${state}&IC=%3A%3ASmallcross&IC%3A=" map_url="http://www.mapblast.com/myblast/map.mb?CMD=GEO&CT=&IC=&GMI=&GAD1=&GAD2=&GAD3=&noPrefs=&remLoc=&AD4=USA&AD2_street=${street_addr}&AD3=${city} ${state}&apmenu=&apcode=&AD2=${street_addr}&req_action=crmap" map_url=`echo "$map_url" | sed 's/%/%25/g;s/ /+/g;s/,/%2C/g'` lynx -dump "$map_url" | sed -n 's/.*\(Lat: *-\?[.0-9]*\) *\(Lon: *-\?[.0-9]*\).*/\1\ \2/p'
#!/usr/bin/perl -w # addr_gps. given an address, query web resources to convert to GPS # latitude and longitude data. create May 28, 2000, bsy@cs.ucsd.edu # Copyright 2000 Bennet S. Yee (bsy@cs.ucsd.edu), all right reserved. # This material was developed by the author and may be redistributed # under the GNU copyright license version 2. See http://www.gnu.org/ # for details. # gps parser package GP; use HTML::Parser; @ISA=("HTML::Parser"); my($debug) = 0; sub new { my $proto = ; my $class = ref($proto) || $proto; my $self = $class->SUPER::new(); bless($self, $class); $self->initialize(); return $self; } sub initialize { my $self = ; $self->{LAT} = undef; $self->{LON} = undef; } sub _lat { my $self = ; if (@_) { $self->{LAT} = } $self->{LAT}; } sub _lon { my $self = ; if (@_) { $self->{LON} = } $self->{LON}; } sub found { my $self = ; return defined($self->{LAT}) && defined($self->{LON}); } sub start { my($self,$tag,$attr,$attrseq,$origtext) = @_; my($i,$k); if ($debug > 1) { print "Tag($tag)"; if (@$attrseq > 0) { print ", attr( [\n"; foreach $k (keys %$attr) { print "$k => ",$$attr{$k},"\n"; } print "] ), attrseq( [\n"; for ($i = 0; $i < @$attrseq; $i++) { print " $i: ",$$attrseq[$i],"\n"; } print "] )"; } print ", origtext($origtext)\n"; } if ($tag eq 'A' || $tag eq 'a') { if (defined($$attr{"href"})) { $k = $$attr{"href"}; if ($k =~ /slt=(-?[\d.]+).*sln=(-?[\d.]+)/) { $self->{LAT} = $1; $self->{LON} = $2; } } } } sub end { my ($self, $tag, $origtext) = @_; print "EndTag($tag), origtext($origtext)\n" if $debug > 1; } sub text { my ($self, $text) = @_; my($country,$cc); print "Text($text)\n" if $debug; if ($text =~ /Lat:\s*(-?[\d.]+)/) { $self->{LAT} = $1; } if ($text =~ /Lon:\s*(-?[\d.]+)/) { $self->{LON} = $1; } } package main; use LWP; $debug = 0; $minutes = 1; $default_city = "San Diego"; $default_state = "CA"; $city = undef; $state = undef; $which_url = 0; $in_browser = 0; # it'd be better if we had an array of web sites, but the URL encoding # schemes differ. sub help { print STDERR "\ Usage: addr_gps [-flags] street address flags are: short long meaning -w --web-site arg is web-site selection 0 for maps.yahoo.com (default) 1 for www.mapblash.com -b --browser display map in netscape browser -B --no-browser parse and print GPS coordinates (default) -m --minutes output in degree and minutes (default) -d --degrees output in fractional degrees -c --city city is next arg (default $default_city) -s --state state is next arg (default $default_state) "; } arg: for ($i = 0; $i < @ARGV; $i++) { if ($ARGV[$i] eq '-m' || $ARGV[$i] eq '--minutes') { $minutes = 1; } elsif ($ARGV[$i] eq '-d' || $ARGV[$i] eq '--degrees') { $minutes = 0; } elsif ($ARGV[$i] eq '-b' || $ARGV[$i] eq '--browser') { $in_browser = 1; } elsif ($ARGV[$i] eq '-B' || $ARGV[$i] eq '--no-browser') { $in_browser = 0; } elsif ($ARGV[$i] eq '-w' || $ARGV[$i] eq '--web-site') { ++$i <= @ARGV || ($ARGV[$i] =~ /^\d+$/) || die "$ARGV[$i-1] requires numeric argument\n"; $which_url = $ARGV[$i]; if ($which_url > 1) { die "web-site selector out of range: 0 for maps.yahoo.com, 1 for www.mapblast.com\n"; } } elsif ($ARGV[$i] eq '-c' || $ARGV[$i] eq '--city') { ++$i <= @ARGV || die "$ARGV[$i-1] requires cityname argument\n"; $city = $ARGV[$i]; } elsif ($ARGV[$i] eq '-s' || $ARGV[$i] eq '--state') { ++$i <= @ARGV || die "$ARGV[$i-1] requires statename argument\n"; $city = $ARGV[$i]; } elsif ($ARGV[$i] eq '-h' || $ARGV[$i] eq '--help') { &help(); exit 0; } elsif ($ARGV[$i] eq '--') { $i++; last arg; } elsif ($ARGV[$i] =~ /^-.*/) { die "flag $ARGV[$i] not implemented, --help for help\n"; } else { last arg; } } if ($i < @ARGV) { $street_addr = join ' ', @ARGV[$i .. $#ARGV]; } else { @addrlines = split '\n',`xcb -p 0`; for ($i = 0; $i < @addrlines; $i++) { if ($addrlines[$i] =~ /^\.\w+A\s+(.*)/) { print STDERR "match: $addrlines[$i] converting to $1" if $debug>1; $addrlines[$i] = $1; } } $street_addr = join ', ',@addrlines; } if (!defined($city)) { if ($street_addr =~ /(.*),\s*([^,]+)/) { $street_addr = $1; $city = $2; if ($street_addr =~ /(.*),\s*([^,]+)/) { $state = $city; $city = $2; $street_addr = $1; } } } $city = $default_city if !defined($city); $state = $default_state if !defined($state); print STDERR "Street address is $street_addr\n" if $debug; print STDERR "City is $city\nState is $state\nOutput in degrees",$minutes ? " and minutes":"","\n" if $debug; $mapblast_url="http://www.mapblast.com/myblast/map.mb?CMD=GEO&CT=&IC=&GMI=&GAD1=&GAD2=&GAD3=&noPrefs=&remLoc=&AD4=USA&AD2_street=${street_addr}&AD3=${city} ${state}&apmenu=&apcode=&AD2=${street_addr}&req_action=crmap"; $yahoo_url="http://maps.yahoo.com/py/maps.py?Pyt=Tmap&addr=${street_addr}&csz=${city} ${state}&country=us&Get%A0Map=Get+Map"; $url = $which_url ? $mapblast_url : $yahoo_url; $url =~ s/%/%25/g; $url =~ s/ /+/g; $url =~ s/,/%2C/g; if ($in_browser) { system("netscape -remote \"OpenURL($url,new-window)\" 2> /dev/null || netscape \"$url\""); exit 0; } print STDERR "URL is $url\n" if $debug; $ua = LWP::UserAgent->new; $p = GP->new; $req = HTTP::Request->new(GET => $url); print STDERR "fetching...\n" if $debug; $resp = $ua->request($req); if (!$resp->is_success) { die "fetch of $url failed\n"; } print STDERR "parsing...\n" if $debug; for $line (split '\n',$resp->content) { $p->parse($line); } die "coordinates not found\n" if !$p->found; $lat = $p->_lat; $lon = $p->_lon; $ns = $lat >= 0 ? "N" : "S"; $ew = $lon >= 0 ? "E" : "W"; $lat = abs($lat); $lon = abs($lon); if ($minutes) { printf "Lat: %s %d° %.6f', Lon: %s %d° %.6f'\n",$ns,gps_deg($lat),gps_min($lat),$ew,gps_deg($lon),gps_min($lon); } else { printf "Lat: %s %f, Lon: %s %f\n",$ns,$lat,$ew,$lon; } sub gps_deg { my($d) = @_; int($d); } sub gps_min { my($d) = @_; ($d - int($d)) * 60; }
bsy+cse190.s00@cs.ucsd.edu, last updated
email bsy.