view release on metacpan or search on metacpan
lib/Geo/Vector/Layer.pm view on Meta::CPAN
return 0;
}
## @method void render($pb)
#
# @brief Renders the vector layer onto a memory image.
#
# @param[in,out] pb Pixel buffer into which the vector layer is rendered.
# @note The layer has to be visible while using the method!
sub render {
my($self, $pb, $cr, $overlay, $viewport) = @_;
return if !$self->visible();
$self->{PALETTE_VALUE} = $PALETTE_TYPE{$self->{PALETTE_TYPE}};
$self->{SYMBOL_VALUE} = $SYMBOL_TYPE{$self->{SYMBOL_TYPE}};
if ($self->{SYMBOL_FIELD} eq 'Fixed size') {
$self->{SYMBOL_SCALE_MIN} = 0; # similar to grayscale scale
$self->{SYMBOL_SCALE_MAX} = 0;
}
my $schema = $self->schema();
$self->{COLOR_FIELD_VALUE} = ohoh(Geo::Vector::field_index($self->{COLOR_FIELD}),
lib/Geo/Vector/Layer.pm view on Meta::CPAN
$self->{RENDER_AS_VALUE} = $Geo::Vector::RENDER_AS{ $self->{RENDER_AS} };
my @border;
if ( @{$self->{BORDER_COLOR}} and
($self->{RENDER_AS} eq 'Native' or $self->{RENDER_AS} eq 'Polygons')) {
@border = @{$self->{BORDER_COLOR}};
push @border, 255;
}
if ($self->{features}) {
for my $feature (values %{$self->{features}}) {
$self->render_feature($overlay, $cr, $feature);
}
} else {
my $handle = Geo::Vector::OGRLayerH($self->{OGR}->{Layer});
if ( not $self->{RENDERER} ) {
my $layer = Geo::Vector::ral_visual_layer_create($self, $handle);
if ($layer) {
Geo::Vector::ral_visual_layer_render( $layer, $pb ) if $pb;
Geo::Vector::ral_visual_layer_destroy($layer);
}
}
if (@border) {
my $border = Geo::Vector::Layer->new( alpha => $self->{ALPHA}, single_color => \@border );
$border->{RENDER_AS_VALUE} = $Geo::Vector::RENDER_AS{Lines};
my $layer = Geo::Vector::ral_visual_layer_create($border, $handle);
if ($layer) {
Geo::Vector::ral_visual_layer_render( $layer, $pb ) if $pb;
Geo::Vector::ral_visual_layer_destroy($layer);
}
}
$self->render_labels($cr, $overlay, $viewport);
}
}
sub render_labels {
my($self, $cr, $overlay, $viewport) = @_;
my $labeling = $self->labeling;
return unless $labeling->{field} ne 'No Labels';
my @label_color = @{$labeling->{color}};
$label_color[3] = int($self->{ALPHA}*$label_color[3]/255);
for (@label_color) {
$_ /= 255;
}
my $wc = -0.5;
lib/Geo/Vector/Layer.pm view on Meta::CPAN
my @color = @{$self->{SINGLE_COLOR}};
$label_color[3] = int($self->{ALPHA}*$color[3]/255);
for (@color) {
$_ /= 255;
}
while ($f = $self->{OGR}->{Layer}->GetNextFeature()) {
my $geometry = $f->GetGeometryRef();
my @placements = label_placement($geometry, $overlay->{pixel_size}, @$viewport, $f->GetFID);
for (@placements) {
my ($size, @point) = @$_;
last unless (@point and defined($point[0]) and defined($point[1]));
next if ($labeling->{min_size} > 0 and $size < $labeling->{min_size});
next if
$point[0] < $viewport->[0] or
$point[0] > $viewport->[2] or
$point[1] < $viewport->[1] or
$point[1] > $viewport->[3];
my @pixel = $overlay->point2pixmap_pixel(@point);
if ($self->{INCREMENTAL_LABELS}) {
# this is fast but not very good
my $geokey = int($pixel[0]/120) .'-'. int($pixel[1]/50);
next if $geohash{$geokey};
$geohash{$geokey} = 1;
}
if ($self->{RENDERER} eq 'Cairo') {
my $points = $geometry->Points;
# now only for points
my @p = $overlay->point2pixmap_pixel(@{$points->[0]});
my $d = $self->{SYMBOL_SIZE}/2;
$cr->move_to($p[0]-$d, $p[1]);
$cr->line_to($p[0]+$d, $p[1]);
$cr->move_to($p[0], $p[1]-$d);
$cr->line_to($p[0], $p[1]+$d);
$cr->set_line_width($self->{LINE_WIDTH});
$cr->set_source_rgba(@color);
$cr->stroke();
}
lib/Geo/Vector/Layer.pm view on Meta::CPAN
$cr->move_to($pixel[0]+$wc*$width+$dw, $pixel[1]+$hc*$height);
$cr->set_source_rgba(@label_color);
Gtk2::Pango::Cairo::show_layout($cr, $layout);
}
}
}
sub render_feature {
my($self, $overlay, $cr, $feature, $geometry) = @_;
$geometry = $feature->Geometry unless $geometry;
my $t = $geometry->GeometryType;
my $a = $self->alpha/255.0;
my @color = $self->single_color;
for (@color) {
$_ /= 255.0;
$_ *= $a;
}
if ($t =~ /^Point/) {
render_point($overlay, $cr, $geometry, \@color);
} elsif ($t =~ /^Line/) {
render_linestring($overlay, $cr, $geometry, 1, \@color);
} elsif ($t =~ /^Poly/) {
my @border = $self->border_color;
@border = (0,0,0) unless @border;
for (@border) {
$_ /= 255.0;
$_ *= $a;
}
push @border, $color[3];
render_polygon($overlay, $cr, $geometry, 1, \@border, \@color);
} elsif ($geometry->GetGeometryCount > 0) {
for my $i (0..$geometry->GetGeometryCount-1) {
render_feature($self, $overlay, $cr, $feature, $geometry->GetGeometryRef($i));
}
}
}
sub render_polygon {
my($overlay, $cr, $geometry, $line_width, $border, $fill) = @_;
paths($overlay, $cr, $geometry->Points);
$cr->set_line_width($line_width);
$cr->set_source_rgba(@$fill);
$cr->set_fill_rule('even-odd');
$cr->fill_preserve;
$cr->set_source_rgba(@$border);
$cr->stroke;
}
sub render_linestring {
my($overlay, $cr, $geometry, $line_width, $color) = @_;
$cr->set_line_width($line_width);
$cr->set_source_rgba(@$color);
geometry_path($overlay, $cr, $geometry);
$cr->stroke;
}
sub render_point {
my($overlay, $cr, $geometry, $color) = @_;
$cr->set_line_width(1);
$cr->set_source_rgba(@$color);
my @p = $overlay->point2surface($geometry->GetPoint);
for (@p) {
$_ = bounds($_, -10000, 10000);
}
$p[0] -= 3;
$cr->move_to(@p);
$p[0] += 6;
$cr->line_to(@p);
$p[0] -= 3;
$p[1] -= 3;
$cr->move_to(@p);
$p[1] += 6;
$cr->line_to(@p);
$cr->stroke;
}
sub geometry_path {
my($overlay, $cr, $geometry) = @_;
if ($geometry->GetGeometryCount > 0) {
for my $i (0..$geometry->GetGeometryCount-1) {
geometry_path($overlay, $cr, $geometry->GetGeometryRef($i));
}
} else {
path($overlay, $cr, $geometry->Points);
}
}
sub paths {
my($overlay, $cr, $points) = @_;
if (ref $points->[0]->[0]) {
for my $i (0..$#$points) {
paths($overlay, $cr, $points->[$i]);
}
} else {
path($overlay, $cr, $points);
}
}
sub path {
my($overlay, $cr, $points) = @_;
my @p = $overlay->point2surface(@{$points->[0]});
for (@p) {
$_ = bounds($_, -10000, 10000);
}
$cr->move_to(@p);
for my $i (1..$#$points) {
@p = $overlay->point2surface(@{$points->[$i]});
for (@p) {
$_ = bounds($_, -10000, 10000);
}
$cr->line_to(@p);
}
}
sub bounds {
$_[0] < $_[1] ? $_[1] : ($_[0] > $_[2] ? $_[2] : $_[0]);
}
lib/Geo/Vector/Layer.pm view on Meta::CPAN
my $y1 = $line->GetY($_);
$l += sqrt(($x1-$x0)*($x1-$x0)+($y1-$y0)*($y1-$y0));
$x0 = $x1;
$y0 = $y1;
}
return $l;
}
## @ignore
sub render_selection {
my($self, $gc, $overlay) = @_;
my $features = $self->selected_features();
for my $f (@$features) {
next unless $f; # should not happen
my $geom = $f->GetGeometryRef();
next unless $geom;
# this could be a bit faster without conversion
$overlay->render_geometry($gc, Geo::OGC::Geometry->new(Text => $geom->ExportToWkt));
}
}
# this piece should probably go into GDAL:
package Geo::OGR::Driver;
use vars qw /%FormatNames/;
%FormatNames = (
lib/Geo/Vector/Layer/Dialogs/Copy.pm view on Meta::CPAN
$model->clear;
$model->set($model->append, 0, '');
for my $data_source (sort keys %{$self->{gui}{resources}{datasources}}) {
$model->set ($model->append, 0, $data_source);
}
$combo->set_active(0);
$combo = $dialog->get_widget('copy_name_comboboxentry');
$model = $combo->get_model();
$model->clear;
for my $layer (@{$gui->{overlay}->{layers}}) {
my $n = $layer->name();
next unless $layer->isa('Geo::Vector');
next unless $layer->{update};
next if $n eq $self->name();
$model->set($model->append, 0, $n);
}
$combo->child->set_text('copy');
$combo->set_text_column(0);
$dialog->get_widget('copy_datasource_entry')->set_text('');
lib/Geo/Vector/Layer/Dialogs/Copy.pm view on Meta::CPAN
my $new_layer;
eval {
$new_layer = $self->copy(%params);
};
if ($@ or !$new_layer) {
$gui->message("can't copy: $@");
return;
}
$gui->add_layer($new_layer, $params{create}, 1);
#$gui->set_layer($new_layer);
#$gui->{overlay}->render;
} else {
$into_layer->add($self, %params);
}
$self->hide_dialog('copy_dialog');
$gui->{overlay}->render;
}
sub mappings_changed {
my($cell, $path, $new_value, $data) = @_;
my($self, $column) = @$data;
my $iter = $self->{mappings}->get_iter_from_string($path);
my @set = ($iter, $column, $new_value);
$self->{mappings}->set(@set);
}
lib/Geo/Vector/Layer/Dialogs/Copy.pm view on Meta::CPAN
}
## @ignore
sub copy_into_changed {
my($combo) = @_;
my($self, $gui) = @{$_[1]};
my $dialog = $self->{copy_dialog};
my $into = get_value_from_combo($dialog, 'copy_name_comboboxentry') if $combo;
my $into_layer;
if ($into) {
for my $layer (@{$gui->{overlay}->{layers}}) {
my $n = $layer->name();
next unless $layer->isa('Geo::Vector');
if ($into eq $layer->name()) {
$into_layer = $layer;
last;
}
}
}
my $treeview = $dialog->get_widget('copy_mappings_treeview');
lib/Geo/Vector/Layer/Dialogs/FeatureCollection.pm view on Meta::CPAN
return if $field eq 'add field';
#$value = undef if $value eq '';
if ($value eq 'xxx') {
$feature->DeleteField($field);
} else {
$feature->SetField($field, $value);
}
$self->feature($feature->GetFID, $feature);
$gui->{overlay}->render;
$treeview = $dialog->get_widget('feature_collection_treeview');
feature_activated($treeview->get_selection, [$self, $gui]);
}
##@ignore
sub close_feature_collection_dialog {
my($self, $gui);
for (@_) {
next unless ref eq 'ARRAY';
($self, $gui) = @{$_};
lib/Geo/Vector/Layer/Dialogs/FeatureCollection.pm view on Meta::CPAN
my $delete = get_selected_from_selection($treeview->get_selection);
my @features;
my $now;
my $select;
my $feature;
for my $fid (keys %$delete) {
delete $self->{features}{$fid};
}
$self->select();
fill_features_table(undef, [$self, $gui]);
$gui->{overlay}->render;
}
##@ignore
sub create_from_drawing {
my($self, $gui) = @{$_[1]};
return unless $gui->{overlay}->{drawing};
my $feature = Geo::Vector::Feature->new();
$feature->Geometry(Geo::OGR::CreateGeometryFromWkt( $gui->{overlay}->{drawing}->AsText ));
$self->feature($feature);
$self->select(with_id => [$feature->FID]);
fill_features_table(undef, [$self, $gui]);
$gui->{overlay}->render;
}
##@ignore
sub copy_to_drawing {
my($self, $gui) = @{$_[1]};
my $dialog = $self->{$DIALOG};
my $treeview = $dialog->get_widget('feature_collection_treeview');
my $features = get_selected_from_selection($treeview->get_selection);
my @features = keys %$features;
if (@features == 0 or @features > 1) {
$gui->message("Select one and only one feature.");
return;
}
$features = $self->features(with_id=>[@features]);
for my $f (@$features) {
my $geom = $f->GetGeometryRef();
next unless $geom;
my $g = Geo::OGC::Geometry->new(Text => $geom->ExportToWkt);
$gui->{overlay}->{drawing} = $g;
last;
}
$gui->{overlay}->update_image;
}
##@ignore
sub copy_from_drawing {
my($self, $gui) = @{$_[1]};
unless ($gui->{overlay}->{drawing}) {
$gui->message("Create a drawing first.");
return;
}
my $dialog = $self->{$DIALOG};
my $treeview = $dialog->get_widget('feature_collection_treeview');
my $features = get_selected_from_selection($treeview->get_selection);
my @features = keys %$features;
if (@features == 0 or @features > 1) {
$gui->message("Select one and only one feature.");
return;
}
$features = $self->features(with_id=>[@features]);
for my $f (@$features) {
my $geom = Geo::OGR::Geometry->create(WKT => $gui->{overlay}->{drawing}->AsText);
$f->SetGeometry($geom);
$self->feature($f->FID, $f);
last;
}
$gui->{overlay}->render;
feature_activated($treeview->get_selection, [$self, $gui]);
}
##@ignore
sub vertices_of_selected_features {
my($self, $gui) = @{$_[1]};
# add title to the call
$self->open_vertices_dialog($gui);
}
##@ignore
sub make_selection {
my($self, $gui) = @{$_[1]};
my $dialog = $self->{$DIALOG};
my $treeview = $dialog->get_widget('feature_collection_treeview');
my $features = get_selected_from_selection($treeview->get_selection);
$features = $self->features(with_id=>[keys %$features]);
delete $gui->{overlay}->{selection};
for my $f (@$features) {
my $geom = $f->GetGeometryRef();
next unless $geom;
my $g = Geo::OGC::Geometry->new(Text => $geom->ExportToWkt);
unless ($gui->{overlay}->{selection}) {
unless ($g->isa('Geo::OGC::GeometryCollection')) {
my $coll = $g->MakeCollection;
$coll->AddGeometry($g);
$gui->{overlay}->{selection} = $coll;
} else {
$gui->{overlay}->{selection} = $g;
}
} else {
$gui->{overlay}->{selection}->AddGeometry($g);
}
}
$gui->{overlay}->update_image;
}
##@ignore
sub copy_selected_features {
my($self, $gui) = @{$_[1]};
Geo::Vector::Layer::Dialogs::Copy::open($self, $gui);
}
##@ignore
sub zoom_to_selected_features {
my($self, $gui) = @{$_[1]};
my $dialog = $self->{$DIALOG};
my $treeview = $dialog->get_widget('feature_collection_treeview');
my $features = get_selected_from_selection($treeview->get_selection);
$features = $self->features(with_id=>[keys %$features]);
my @viewport = $gui->{overlay}->get_viewport;
my @extent = ();
for my $f (@$features) {
my $geom = $f->Geometry();
next unless $geom;
my $env = $geom->GetEnvelope;
$extent[0] = $env->[0] if !defined($extent[0]) or $env->[0] < $extent[0];
$extent[1] = $env->[2] if !defined($extent[1]) or $env->[2] < $extent[1];
lib/Geo/Vector/Layer/Dialogs/FeatureCollection.pm view on Meta::CPAN
# a point?
if ($extent[2] - $extent[0] <= 0) {
$extent[0] -= ($viewport[2] - $viewport[0])/10;
$extent[2] += ($viewport[2] - $viewport[0])/10;
}
if ($extent[3] - $extent[1] <= 0) {
$extent[1] -= ($viewport[3] - $viewport[1])/10;
$extent[3] += ($viewport[3] - $viewport[1])/10;
}
$gui->{overlay}->zoom_to(@extent);
}
}
## @ignore
sub fill_features_table {
shift;
my($self, $gui) = @{$_[0]};
my $dialog = $self->{$DIALOG};
my $from = $dialog->get_widget('feature_collection_from_spinbutton')->get_value_as_int;
lib/Geo/Vector/Layer/Dialogs/FeatureCollection.pm view on Meta::CPAN
push @recs, [ 0, $_, 1, $row->{$_} ];
}
push @recs, [ 0, 'add field', 1, '' ];
for my $rec (@recs) {
my $iter = $model->insert (undef, 999999);
$model->set ($iter, @$rec);
}
}
$gui->{overlay}->update_image(
sub {
my($overlay, $pixmap, $gc) = @_;
$gc->set_rgb_fg_color(Gtk2::Gdk::Color->new(65535,0,0));
for my $f (@$features) {
next unless $f; # should not happen
my $geom = $f->GetGeometryRef();
next unless $geom;
$overlay->render_geometry($gc, Geo::OGC::Geometry->new(Text => $geom->ExportToWkt));
}
});
}
1;
lib/Geo/Vector/Layer/Dialogs/Features.pm view on Meta::CPAN
}
return unless defined $fid;
my $f = $self->feature($fid);
$new_value = undef if $new_value eq '';
$column = $treeview->get_column($column)->get_title;
$column =~ s/__/_/g;
$f->SetField($column, $new_value);
$self->feature($fid, $f);
$self->select; # clear selection since it is a list of features read from the source
$gui->{overlay}->render;
}
##@ignore
sub close_features_dialog {
my($self, $gui);
for (@_) {
next unless ref eq 'ARRAY';
($self, $gui) = @{$_};
}
$self->hide_dialog('features_dialog');
lib/Geo/Vector/Layer/Dialogs/Features.pm view on Meta::CPAN
my $_b = $b;
}
##@ignore
sub fill_features_table {
my($self, $gui) = @{$_[1]};
my $dialog = $self->{features_dialog};
my $treeview = $dialog->get_widget('feature_treeview');
my $overlay = $gui->{overlay};
my $from = $dialog->get_widget('from_feature_spinbutton')->get_value_as_int;
my $count = $dialog->get_widget('max_features_spinbutton')->get_value_as_int;
my $limit = $dialog->get_widget('features_limit_checkbutton')->get_active;
$self->{_not_a_click} = 1;
my $model = $treeview->get_model;
$model->clear;
lib/Geo/Vector/Layer/Dialogs/Features.pm view on Meta::CPAN
my $features = $self->selected_features;
my %added;
add_features($self, $treeview, $model, \@fnames, $features, 1, \%added);
$count -= @$features;
my $is_all = 1;
if ($count > 0) {
if ($limit) {
my @r = $overlay->get_viewport;
($features, $is_all) = $self->features( filter_rect => \@r, from => $from, limit => $count );
} else {
($features, $is_all) = $self->features( from => $from, limit => $count );
}
add_features($self, $treeview, $model, \@fnames, $features, 0, \%added);
}
$dialog->get_widget('all_features_label')->set_sensitive($is_all);
delete $self->{_not_a_click};
}
lib/Geo/Vector/Layer/Dialogs/Features.pm view on Meta::CPAN
my $selection = shift;
my($self, $gui) = @{$_[0]};
return if $self->{_not_a_click};
my $features = get_selected_from_selection($selection);
$features = $self->features(with_id=>[keys %$features]);
return unless $features;
return unless @$features;
$self->selected_features($features);
$gui->{overlay}->update_image(
sub {
my($overlay, $pixmap, $gc) = @_;
$gc->set_rgb_fg_color(Gtk2::Gdk::Color->new(65535,0,0));
for my $f (@$features) {
next unless $f; # should not happen
my $geom = $f->GetGeometryRef();
next unless $geom;
$overlay->render_geometry($gc, Geo::OGC::Geometry->new(Text => $geom->ExportToWkt));
}
}
);
}
##@ignore
sub delete_selected_features {
my($self, $gui) = @{$_[1]};
my $dialog = $self->{features_dialog};
my $treeview = $dialog->get_widget('feature_treeview');
my $features = get_selected_from_selection($treeview->get_selection);
$features = $self->features(with_id=>[keys %$features]);
$self->select;
for my $f (@$features) {
$self->{OGR}->{Layer}->DeleteFeature($f->FID);
}
fill_features_table(undef, [$self, $gui]);
$gui->{overlay}->render;
}
##@ignore
sub zoom_to_selected_features {
my($self, $gui) = @{$_[1]};
my $dialog = $self->{features_dialog};
my $treeview = $dialog->get_widget('feature_treeview');
my $features = get_selected_from_selection($treeview->get_selection);
$features = $self->features(with_id=>[keys %$features]);
my @viewport = $gui->{overlay}->get_viewport;
my @extent = ();
for (@$features) {
my $geom = $_->GetGeometryRef();
next unless $geom;
my $env = $geom->GetEnvelope;
$extent[0] = $env->[0] if !defined($extent[0]) or $env->[0] < $extent[0];
$extent[1] = $env->[2] if !defined($extent[1]) or $env->[2] < $extent[1];
lib/Geo/Vector/Layer/Dialogs/Features.pm view on Meta::CPAN
# a point?
if ($extent[2] - $extent[0] <= 0) {
$extent[0] -= ($viewport[2] - $viewport[0])/10;
$extent[2] += ($viewport[2] - $viewport[0])/10;
}
if ($extent[3] - $extent[1] <= 0) {
$extent[1] -= ($viewport[3] - $viewport[1])/10;
$extent[3] += ($viewport[3] - $viewport[1])/10;
}
$gui->{overlay}->zoom_to(@extent);
}
}
##@ignore
sub copy_selected_features {
my($self, $gui) = @{$_[1]};
Geo::Vector::Layer::Dialogs::Copy::open($self, $gui);
}
##@ignore
lib/Geo/Vector/Layer/Dialogs/Features.pm view on Meta::CPAN
$self->open_vertices_dialog($gui);
}
##@ignore
sub make_selection {
my($self, $gui) = @{$_[1]};
my $dialog = $self->{features_dialog};
my $treeview = $dialog->get_widget('feature_treeview');
my $features = get_selected_from_selection($treeview->get_selection);
$features = $self->features(with_id=>[keys %$features]);
delete $gui->{overlay}->{selection};
for my $f (@$features) {
my $geom = $f->GetGeometryRef();
next unless $geom;
my $g = Geo::OGC::Geometry->new(Text => $geom->ExportToWkt);
unless ($gui->{overlay}->{selection}) {
unless ($g->isa('Geo::OGC::GeometryCollection')) {
my $coll = $g->MakeCollection;
$coll->AddGeometry($g);
$gui->{overlay}->{selection} = $coll;
} else {
$gui->{overlay}->{selection} = $g;
}
} else {
$gui->{overlay}->{selection}->AddGeometry($g);
}
}
$gui->{overlay}->update_image;
}
##@ignore
sub from_drawing {
my($self, $gui) = @{$_[1]};
return unless $gui->{overlay}->{drawing};
$self->add_feature( Geometry => $gui->{overlay}->{drawing} );
fill_features_table(undef, [$self, $gui]);
$gui->{overlay}->render;
}
##@ignore
sub copy_to_drawing {
my($self, $gui) = @{$_[1]};
my $dialog = $self->{features_dialog};
my $treeview = $dialog->get_widget('feature_treeview');
my $features = get_selected_from_selection($treeview->get_selection);
my @features = keys %$features;
if (@features == 0 or @features > 1) {
$gui->message("Select one and only one feature.");
return;
}
$features = $self->features(with_id=>[@features]);
for my $f (@$features) {
my $geom = $f->GetGeometryRef();
next unless $geom;
my $g = Geo::OGC::Geometry->new(Text => $geom->ExportToWkt);
$gui->{overlay}->{drawing} = $g;
last;
}
$gui->{overlay}->update_image;
}
##@ignore
sub copy_from_drawing {
my($self, $gui) = @{$_[1]};
unless ($gui->{overlay}->{drawing}) {
$gui->message("Create a drawing first.");
return;
}
my $dialog = $self->{features_dialog};
my $treeview = $dialog->get_widget('feature_treeview');
my $features = get_selected_from_selection($treeview->get_selection);
my @features = keys %$features;
if (@features == 0 or @features > 1) {
$gui->message("Select one and only one feature.");
return;
}
$features = $self->features(with_id=>[@features]);
for my $f (@$features) {
my $geom = Geo::OGR::Geometry->create(WKT => $gui->{overlay}->{drawing}->AsText);
$f->SetGeometry($geom);
$self->feature($f->FID, $f);
last;
}
fill_features_table(undef, [$self, $gui]);
$gui->{overlay}->render;
}
1;
lib/Geo/Vector/Layer/Dialogs/Open.pm view on Meta::CPAN
$err = "data_source=$data_source, layer=$name, sql=$sql, update=$update";
}
$self->{gui}->message("Could not open layer: $err");
return;
}
$name = $wish if (keys %$layers) == 1;
$layer->visible(0) if $hidden;
$self->{gui}->add_layer($layer, $name, 1);
}
$self->{gui}{tree_view}->set_cursor(Gtk2::TreePath->new(0));
$self->{gui}{overlay}->render;
delete $self->{directory_toolbar};
$dialog->get_widget('open_dialog')->destroy;
}
##@ignore
sub cancel_open_vector {
my $self = pop;
delete $self->{directory_toolbar};
$self->{open_dialog}->get_widget('open_dialog')->destroy;
}
lib/Geo/Vector/Layer/Dialogs/Properties.pm view on Meta::CPAN
my $alpha = $dialog->get_widget('properties_transparency_spinbutton')->get_value_as_int;
$self->alpha($alpha);
my $name = $dialog->get_widget('properties_name_entry')->get_text;
$self->name($name);
my $combo = $dialog->get_widget('properties_render_as_combobox');
my $model = $combo->get_model;
my $iter = $model->get_iter_from_string($combo->get_active());
$self->render_as($model->get_value($iter));
$self->hide_dialog('properties_dialog') if $close;
$gui->set_layer($self);
$gui->{overlay}->render;
}
##@ignore
sub cancel_properties {
my($self, $gui);
for (@_) {
next unless ref eq 'ARRAY';
($self, $gui) = @{$_};
}
$self->alpha($self->{backup}->{alpha});
$self->name($self->{backup}->{name});
$self->render_as($self->{backup}->{render_as});
$self->hide_dialog('properties_dialog');
$gui->set_layer($self);
$gui->{overlay}->render;
1;
}
1;
lib/Geo/Vector/Layer/Dialogs/Rasterize.pm view on Meta::CPAN
if ($type eq 'Integer' or $type eq 'Real') {
$model->set($model->append, 0, $column->GetName);
}
}
}
$combobox->set_active(0);
$combobox = $dialog->get_widget('rasterize_like_combobox');
$model = $combobox->get_model();
$model->set($model->append, 0, "Use current view");
for my $layer (@{$gui->{overlay}->{layers}}) {
next unless $layer->isa('Geo::Raster');
$model->set($model->append, 0, $layer->name);
}
$combobox->set_active(0);
}
$dialog->get_widget('rasterize_name_entry')->set_text('r');
$dialog->get_widget('rasterize_like_combobox')->set_active(0);
my $a = $self->render_as;
lib/Geo/Vector/Layer/Dialogs/Rasterize.pm view on Meta::CPAN
##@ignore
sub apply_rasterize {
my($self, $gui, $close) = @{$_[1]};
my $dialog = $self->{rasterize_dialog};
my %ret = (name => $dialog->get_widget('rasterize_name_entry')->get_text());
my $model = get_value_from_combo($dialog, 'rasterize_like_combobox');
if ($model eq "Use current view") {
# need M (height), N (width), world
($ret{M}, $ret{N}) = $gui->{overlay}->size;
$ret{world} = [$gui->{overlay}->get_viewport];
} else {
$ret{like} = $gui->{overlay}->get_layer_by_name($model);
}
$ret{render_as} = get_value_from_combo($dialog, 'rasterize_render_as_combobox');
$ret{feature} = $dialog->get_widget('rasterize_fid_entry')->get_text;
$ret{feature} = -1 unless $ret{feature} =~ /^\d+$/;
my $field = get_value_from_combo($dialog, 'rasterize_value_field_combobox');
if ($field ne 'Draw with value 1') {
$ret{value_field} = $field;
}
$ret{nodata_value} = $dialog->get_widget('rasterize_nodata_value_entry')->get_text();
my $g = $self->rasterize(%ret);
if ($g) {
$gui->add_layer($g, $ret{name}, 1);
$gui->{overlay}->render;
}
$self->hide_dialog('rasterize_dialog') if $close;
$gui->set_layer($self);
$gui->{overlay}->render;
}
##@ignore
sub cancel_rasterize {
my($self, $gui);
for (@_) {
next unless ref CORE::eq 'ARRAY';
($self, $gui) = @{$_};
}
$self->hide_dialog('rasterize_dialog');
lib/Geo/Vector/Layer/Dialogs/Vertices.pm view on Meta::CPAN
($self, $gui) = @{$_};
}
$self->hide_dialog('vertices_dialog');
1;
}
##@ignore
sub fill_vtv {
my($self, $gui) = @{$_[1]};
my $overlay = $gui->{overlay};
my $dialog = $self->{vertices_dialog};
my $from = $dialog->get_widget('vertices_from_spinbutton')->get_value_as_int;
my $count = $dialog->get_widget('vertices_max_spinbutton')->get_value_as_int;
my $tv = $dialog->get_widget('vertices_treeview');
my $model = $tv->get_model;
$model->clear;
delete $self->{GIDS};
my @data;
lib/Geo/Vector/Layer/Dialogs/Vertices.pm view on Meta::CPAN
my $data = get_geom_data($self, $gui, $geom2, $vertex, \$vertices2, $from, $count);
push @d, [($i2+1).'. '.$name, $data, $i2] if $vertices2 > $$vertices;
$$vertices = $vertices2;
last if $$vertices >= $count;
}
return \@d if @d;
} else {
my @rect = $gui->{overlay}->get_viewport; #_of_selection;
#@rect = $gui->{overlay}->get_viewport unless @rect;
my $s = $gui->{overlay}->{selection};
my $a = ($s and $s->isa('Geo::OGR::Geometry'));
my @d;
for my $i (0..$geom->GetPointCount-1) {
my $x = $geom->GetX($i);
next if $x < $rect[0] or $x > $rect[2];
my $y = $geom->GetY($i);
next if $y < $rect[1] or $y > $rect[3];
if ($a) {
my $point = Geo::OGR::Geometry->create('Point');
$point->ACQUIRE;
lib/Geo/Vector/Layer/Dialogs/Vertices.pm view on Meta::CPAN
##@ignore
sub vertices_activated {
my $selection = $_[0];
my($self, $gui) = @{$_[1]};
$self->{SELECTED_GIDS} = [];
for my $row ($selection->get_selected_rows) {
push @{$self->{SELECTED_GIDS}}, $row->to_string;
}
$gui->{overlay}->update_image(\&show_vertices, $self) if @{$self->{SELECTED_GIDS}};
}
sub show_vertices {
my($overlay, $pixmap, $gc, $layer) = @_;
$gc->set_rgb_fg_color(Gtk2::Gdk::Color->new(65535, 0, 0));
for my $selected (@{$layer->{SELECTED_GIDS}}) {
next unless exists $layer->{GIDS}->{$selected};
my @path = split(/:/, $layer->{GIDS}->{$selected});
my $fid = shift @path;
my $f = $layer->feature($fid);
next unless $f;
my $p = $f->Geometry()->Points;
for (@path) {
$p = $p->[$_];
}
my @p = $overlay->point2pixmap_pixel(@$p);
$pixmap->draw_line($gc, $p[0]-4, $p[1], $p[0]+4, $p[1]);
$pixmap->draw_line($gc, $p[0], $p[1]-4, $p[0], $p[1]+4);
}
}
1;
t/02_layer.t view on Meta::CPAN
}
# layer list
my $list = Gtk2::ScrolledWindow->new();
$list->set_policy("never", "automatic");
$list->add($gis->{tree_view});
# layer list and the map
my $hbox = Gtk2::HBox->new(FALSE, 0);
$hbox->pack_start($list, FALSE, FALSE, 0);
$hbox->pack_start($gis->{overlay}, TRUE, TRUE, 0);
# the stack
my $vbox = Gtk2::VBox->new(FALSE, 0);
$vbox->pack_start($gis->{toolbar}, FALSE, FALSE, 0);
#$vbox->add($hbox);
$vbox->pack_start($hbox, TRUE, TRUE, 0);
$vbox->pack_start($gis->{entry}, FALSE, FALSE, 0);
$vbox->pack_start($gis->{statusbar}, FALSE, FALSE, 0);
$window->add($vbox);
t/03_layer.t view on Meta::CPAN
}
# layer list
my $list = Gtk2::ScrolledWindow->new();
$list->set_policy("never", "automatic");
$list->add($gis->{tree_view});
# layer list and the map
my $hbox = Gtk2::HBox->new(FALSE, 0);
$hbox->pack_start($list, FALSE, FALSE, 0);
$hbox->pack_start($gis->{overlay}, TRUE, TRUE, 0);
# the stack
my $vbox = Gtk2::VBox->new(FALSE, 0);
$vbox->pack_start($gis->{toolbar}, FALSE, FALSE, 0);
#$vbox->add($hbox);
$vbox->pack_start($hbox, TRUE, TRUE, 0);
$vbox->pack_start($gis->{entry}, FALSE, FALSE, 0);
$vbox->pack_start($gis->{statusbar}, FALSE, FALSE, 0);
$window->add($vbox);