!/usr/bin/perl
use strict;
use warnings;
use lib 'lib';
use Geo;
####
use autodie;
use DBD::SQLite;
use Data::Dumper;
use lib 'lib';
use Geo;
my $dbh = DBI->connect(
"dbi:SQLite:dbname=us_counties.db",
"",
"",
{ RaiseError => 1, AutoCommit => 1 },
);
my $states = $dbh->selectall_hashref( "SELECT id, code FROM state", 'id' );
my $range = .3; # at US latitudes .3 degree is about 20 miles of surface dist
while() {
chomp;
s/"//g;
my ($lat,$long) = split /,/;
my $range = .3; # at US latitudes .3 degree is about 20 miles of surface distance
my $county_ref = Geo::find_near_counties( $dbh, $lat, $long, $range );
my $print_stuff = defined $county_ref ? scalar @$county_ref : "None found ";
print $print_stuff, " counties found for $lat and $long\n";
}
__DATA__
85,-110
46,-115
27,-81
43,-74
45,-93
48,-104
40,-85
####
package Geo;
sub find_near_counties {
####
my ( $dbh, $lat, $long, $range ) = @_;
my $increment = .3;
my @sql_parms = ( $lat - $range, $lat + $range, $long - $range, $long + $range ) ;
my $query = "SELECT fips FROM county WHERE latitude > ? AND latitude < ? AND longitude > ? AND longitude < ? ";
my $county_ref = $dbh->selectcol_arrayref($query, {}, @sql_parms );
if( ! scalar @$county_ref ) {
if ( $range > 3 ) {
return undef;
}
return find_near_counties( $lat, $long, $range+$increment );
}
return $county_ref;
}
1;