use Storable qw(thaw);
use MIME::Base64;
-use JSON qw(encode_json decode_json) ;
+use Cpanel::JSON::XS;
use LWP::UserAgent;
use HTTP::Request::Common;
-# update this in 2020, along with the URL for the TIGERweb service
-our $CENSUS_YEAR = 2010;
+use Geo::JSON::Polygon;
+use Geo::JSON::Feature;
+
+our $CENSUS_YEAR = 2020;
+
+our $tech_label = FS::part_pkg_fcc_option->technology_labels;
=head1 NAME
=cut
-# the replace method can be inherited from FS::Record
+sub replace {
+ my $self = shift;
+ my $old = shift || $self->replace_old;
+
+ $self->expire_date(time)
+ if $self->disabled eq 'Y' && ! $old->disabled && ! $self->expire_date;
+ $self->SUPER::replace($old, @_);
+}
=item check
Checks all fields to make sure this is a valid zone record. If there is
});
}
+=item shapefile_add SHAPEFILE
+
+Adds this deployment zone to the supplied Geo::Shapelib shapefile.
+
+=cut
+
+sub shapefile_add {
+ my( $self, $shapefile ) = @_;
+
+ my @coordinates = map { [ $_->longitude, $_->latitude, 0, 0 ] }
+ $self->deploy_zone_vertex;
+ push @coordinates, $coordinates[0];
+
+ push @{$shapefile->{Shapes}}, { 'Vertices' => \@coordinates };
+ push @{$shapefile->{ShapeRecords}}, [ $tech_label->{$self->technology},
+ $self->adv_speed_down,
+ $self->adv_speed_up,
+ ];
+ '';
+}
+
=item vertices_json
Returns the vertex list for this zone, as a JSON string of
encode_json(\@vertices);
}
+=item geo_json_feature
+
+Returns this zone as a Geo::JSON::Feature object
+
+=cut
+
+sub geo_json_feature {
+ my $self = shift;
+
+ my @coordinates = map { [ $_->longitude, $_->latitude ] }
+ $self->deploy_zone_vertex;
+ push @coordinates, $coordinates[0];
+
+ Geo::JSON::Feature->new({
+ geometry => Geo::JSON::Polygon->new({ coordinates => [ \@coordinates ] }),
+ properties => { 'Technology' => $tech_label->{$self->technology},
+ 'Down' => $self->adv_speed_down,
+ 'Up' => $self->adv_speed_up,
+ },
+ })
+}
+
+=item kml_add
+
+Adds this deployment zone to the supplied Geo::GoogleEarth::Pluggable object.
+
+=cut
+
+sub kml_polygon {
+ my( $self, $kml ) = @_;
+
+ my $name = $self->description. ' ('. $self->adv_speed_down. '/'.
+ $self->adv_speed_up. ')';
+
+ $kml->Polygon( 'name' => $name,
+ 'coordinates' => [ [ #outerBoundary
+ map { [ $_->longitude, $_->latitude, 0 ] }
+ $self->deploy_zone_vertex
+ ],
+ #[ #innerBoundary
+ #]
+ ]
+ );
+}
+
=head2 SUBROUTINES
=over 4
inSR => 4326,
outSR => 4326,
spatialRel => 'esriSpatialRelIntersects', # the test to perform
- outFields => 'OID,GEOID',
+ outFields => 'GEOID',
returnGeometry => 'false',
orderByFields => 'OID',
);
- my $url = 'http://tigerweb.geo.census.gov/arcgis/rest/services/TIGERweb/Tracts_Blocks/MapServer/12/query';
+ my $url = 'https://tigerweb.geo.census.gov/arcgis/rest/services/TIGERweb/Tracts_Blocks/MapServer/12/query';
my $ua = LWP::UserAgent->new;
# first find out how many of these we're dealing with
#warn "Census block lookup: $count\n";
- # we have to do our own pagination on this, because the census bureau
- # doesn't support resultOffset (maybe they don't have ArcGIS 10.3 yet).
- # that's why we're ordering by OID, it's globally unique
- my $last_oid = 0;
my $done = 0;
while (!$done) {
$response = $ua->request(
POST $url, Content => [
%query,
- where => "OID>$last_oid",
+ resultOffset => $inserted,
]
);
die $response->status_line unless $response->is_success;
$data = decode_json($response->content);
die $data->{error}{message} if $data->{error};
+ last unless scalar @{$data->{features}}; #Nothing to insert
foreach my $feature (@{ $data->{features} }) {
my $geoid = $feature->{attributes}{GEOID}; # the prize
}
#warn "Inserted $inserted records\n";
- $last_oid = $data->{features}[-1]{attributes}{OID};
$done = 1 unless $data->{exceededTransferLimit};
}