Report match level on failed matches
[Geo-USCensus-Geocoding.git] / Geocoding.pm
index 04605ad..405ff18 100644 (file)
@@ -29,9 +29,9 @@ our $DEBUG = 0;
       # required fields
       street  => '123 Main Street',
       city    => 'San Francisco',   # city
-      state   => 'CA',              # state/province
-      zip     => '93102',           # zip/postal code
+      state   => 'CA',              # state
       # optional fields
+      zip     => '93102',           # zip code
       benchmark => 'Public_AR_ACS2013', # default is "Public_AR_Current"
       vintage   => 'Census2010_ACS2013', # default is "Current_Current"
 
@@ -89,12 +89,16 @@ sub query {
 
   my @row = ( 1 ); # first element = row identifier
   # at some point support multiple rows in a single query?
+  if (!$opt{street}) {
+    $result->error_message("Street address is required.");
+    return $result;
+  }
+  if (!$opt{zip} and (!$opt{city} or !$opt{state})) {
+    $result->error_message("Either city/state or zip code is required.");
+    return $result;
+  }
   foreach (qw(street city state zip)) {
-    if (!length($opt{$_})) {
-      $result->error_message("$_ required");
-      return $result;
-    }
-    push @row, $opt{$_};
+    push @row, $opt{$_} || '';
   }
 
   $csv->combine(@row);
@@ -124,15 +128,16 @@ sub query {
       $result->is_match(1);
       $result->match_level($fields[3]);
       $result->address($fields[4]);
-      my ($lat, $long) = split(',', $fields[5]);
-      $result->latitude($lat);
+      my ($long, $lat) = split(',', $fields[5]);
       $result->longitude($long);
+      $result->latitude($lat);
       $result->state($fields[8]);
       $result->county($fields[9]);
       $result->tract($fields[10]);
       $result->block($fields[11]);
     } else {
       $result->is_match(0);
+      $result->match_level($fields[2]); # "No_Match", "Tie"
     }
   } else {
     $result->error_message( $resp->status_line );