X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fdeploy_zone.pm;h=c618fb9873fce4377e656c19374d157ad1d0c512;hb=b07fc5121e081be276cd7ed8ea0a030b4c2b06e7;hp=ee683213391429ddca0a605bb170fe806686c0e9;hpb=0a2c29c0f22bee8cb30ef4eea31881ab1ae525f7;p=freeside.git diff --git a/FS/FS/deploy_zone.pm b/FS/FS/deploy_zone.pm index ee6832133..c618fb987 100644 --- a/FS/FS/deploy_zone.pm +++ b/FS/FS/deploy_zone.pm @@ -10,8 +10,12 @@ 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 @@ -187,8 +191,15 @@ returns the error, otherwise returns false. =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 @@ -268,6 +279,27 @@ sub deploy_zone_vertex { }); } +=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 @@ -282,6 +314,51 @@ sub vertices_json { 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 @@ -379,11 +456,11 @@ sub process_block_lookup { 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 @@ -403,21 +480,18 @@ sub process_block_lookup { #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 @@ -436,7 +510,6 @@ sub process_block_lookup { } #warn "Inserted $inserted records\n"; - $last_oid = $data->{features}[-1]{attributes}{OID}; $done = 1 unless $data->{exceededTransferLimit}; }