diff options
author | Ivan Kohler <ivan@freeside.biz> | 2022-08-26 12:23:43 -0700 |
---|---|---|
committer | Ivan Kohler <ivan@freeside.biz> | 2022-08-26 12:23:43 -0700 |
commit | b3b6d0750030d08032756ad4a6969e193a65a928 (patch) | |
tree | 24918c1ec8c2ed0878e1eebc952c45ce71efea23 /httemplate/view | |
parent | 86fb4649060ed26420bb1931481885064e76abc5 (diff) |
add shapefile, kmz and geojson export to deployment zones, RT#86460
Diffstat (limited to 'httemplate/view')
-rw-r--r-- | httemplate/view/deploy_zone-geojson.cgi | 42 | ||||
-rw-r--r-- | httemplate/view/deploy_zone-kmz.cgi | 42 | ||||
-rw-r--r-- | httemplate/view/deploy_zone-shp.cgi | 76 |
3 files changed, 160 insertions, 0 deletions
diff --git a/httemplate/view/deploy_zone-geojson.cgi b/httemplate/view/deploy_zone-geojson.cgi new file mode 100644 index 000000000..0c9d19353 --- /dev/null +++ b/httemplate/view/deploy_zone-geojson.cgi @@ -0,0 +1,42 @@ +<% $content %>\ +<%init> + +my $curuser = $FS::CurrentUser::CurrentUser; +my $acl_edit = $curuser->access_right('Edit FCC report configuration'); +my $acl_edit_global = $curuser->access_right('Edit FCC report configuration for all agents'); +die "access denied" + unless $acl_edit or $acl_edit_global; + +my($name, $content); + +my($query) = $cgi->keywords; +if ( $query =~ /^(\d+)$/ || $cgi->param('zonenum') =~ /^(\d+$)/ ) { + my $zonenum = $1; + $name = $zonenum; + my $deploy_zone = qsearchs('deploy_zone', { 'zonenum' => $zonenum }) + or die 'unknown zonenum'; + + $content = $deploy_zone->geo_json_feature->to_json; + +} elsif ( $cgi->param('zonetype') =~ /^(\w)$/ ) { + my $zonetype = $1; + $name = $zonetype; + my @deploy_zone = qsearch('deploy_zone', { 'zonetype' => $zonetype, + 'disabled' => '', }); + + my $fc = Geo::JSON::FeatureCollection->new({ + features => [ map $_->geo_json_feature, @deploy_zone ], + }); + + $content = $fc->to_json; + +} else { + die "no zonenum or zonetype\n"; +} + +http_header('Content-Type' => 'application/geo+json' ); +http_header('Content-Disposition' => "filename=$name.geojson" ); +http_header('Content-Length' => length($content) ); +http_header('Cache-control' => 'max-age=60' ); + +</%init> diff --git a/httemplate/view/deploy_zone-kmz.cgi b/httemplate/view/deploy_zone-kmz.cgi new file mode 100644 index 000000000..d2af171e5 --- /dev/null +++ b/httemplate/view/deploy_zone-kmz.cgi @@ -0,0 +1,42 @@ +<% $content %>\ +<%init> + +my $curuser = $FS::CurrentUser::CurrentUser; +my $acl_edit = $curuser->access_right('Edit FCC report configuration'); +my $acl_edit_global = $curuser->access_right('Edit FCC report configuration for all agents'); +die "access denied" + unless $acl_edit or $acl_edit_global; + +my $kml = Geo::GoogleEarth::Pluggable->new; + +my $name; + +my($query) = $cgi->keywords; +if ( $query =~ /^(\d+)$/ || $cgi->param('zonenum') =~ /^(\d+$)/ ) { + my $zonenum = $1; + $name = $zonenum; + my $deploy_zone = qsearchs('deploy_zone', { 'zonenum' => $zonenum }) + or die 'unknown zonenum'; + + $deploy_zone->kml_polygon($kml); + +} elsif ( $cgi->param('zonetype') =~ /^(\w)$/ ) { + my $zonetype = $1; + $name = $zonetype; + my @deploy_zone = qsearch('deploy_zone', { 'zonetype' => $zonetype, + 'disabled' => '', }); + + $_->kml_polygon($kml) foreach @deploy_zone; + +} else { + die "no zonenum or zonetype\n"; +} + +my $content = $kml->archive; + +http_header('Content-Type' => 'application/vnd.google-earth.kmz' ); #kmz +http_header('Content-Disposition' => "filename=$name.kmz" ); +http_header('Content-Length' => length($content) ); +http_header('Cache-control' => 'max-age=60' ); + +</%init> diff --git a/httemplate/view/deploy_zone-shp.cgi b/httemplate/view/deploy_zone-shp.cgi new file mode 100644 index 000000000..4b5dfbbc6 --- /dev/null +++ b/httemplate/view/deploy_zone-shp.cgi @@ -0,0 +1,76 @@ +<% $content %>\ +<%init> + +my $curuser = $FS::CurrentUser::CurrentUser; +my $acl_edit = $curuser->access_right('Edit FCC report configuration'); +my $acl_edit_global = $curuser->access_right('Edit FCC report configuration for all agents'); +die "access denied" + unless $acl_edit or $acl_edit_global; + +my $dir = $FS::UID::conf_dir. "/cache.". $FS::UID::datasrc; + +my %shapelib_opts = ( + Shapetype => Geo::Shapelib::POLYGON, + FieldNames => [ 'Tech', 'Down', 'Up' ], + FieldTypes => [ 'String:32', 'Double', 'Double' ], +); + +my( $name, $shapefile ); + +my($query) = $cgi->keywords; +if ( $query =~ /^(\d+)$/ || $cgi->param('zonenum') =~ /^(\d+$)/ ) { + my $zonenum = $1; + $name = $zonenum; + my $deploy_zone = qsearchs('deploy_zone', { 'zonenum' => $zonenum }) + or die 'unknown zonenum'; + + $shapefile = new Geo::Shapelib { + Name => "$dir/$zonenum-$$", + %shapelib_opts + }; + + $deploy_zone->shapefile_add($shapefile); + +} elsif ( $cgi->param('zonetype') =~ /^(\w)$/ ) { + my $zonetype = $1; + $name = $zonetype; + my @deploy_zone = qsearch('deploy_zone', { 'zonetype' => $zonetype, + 'disabled' => '', }); + + $shapefile = new Geo::Shapelib { + Name => "$dir/$zonetype-$$", + %shapelib_opts + }; + + $_->shapefile_add($shapefile) foreach @deploy_zone; + +} else { + die "no zonenum or zonetype\n"; +} + +$shapefile->set_bounds; + +$shapefile->save; + +#slurp up .shp .shx and .dbf files and put them in a zip.. return that +#and delete the files + +my $content = ''; +open(my $fh, '>', \$content); + +my $zip = new Archive::Zip; +$zip->addFile("$dir/$name-$$.$_", "$name.$_") foreach qw( shp shx dbf ); +unless ( $zip->writeToFileHandle($fh) == Archive::Zip::AZ_OK() ) { + die "failed to create .shz file\n"; +} +close $fh; + +unlink("$dir/$name-$$.$_") foreach qw( shp shx dbf ); + +#http_header('Content-Type' => 'x-gis/x-shapefile' ); +http_header('Content-Type' => 'archive/zip' ); +http_header('Content-Disposition' => "filename=$name.shz" ); +http_header('Content-Length' => length($content) ); +http_header('Cache-control' => 'max-age=60' ); + +</%init> |