package DBIx::Class::GeomColumns; use strict; use warnings; use Carp; use Geo::Converter::WKT2KML; use version; our $VERSION = qv('0.0.2'); use base qw/DBIx::Class/; __PACKAGE__->mk_classdata( '_geom_columns' ); __PACKAGE__->mk_classdata( '_kml_columns' ); =head1 NAME DBIx::Class::GeomColumns - Filter of geometry columns to access with WKT =head1 SYNOPSIS package POI; __PACKAGE__->load_components(qw/GeomColumns Core/); __PACKAGE__->utf8_columns('wgs84_col',{'tokyo_col' => 4301}); __PACKAGE__->kml_columns('kml_col'); # Then belows return the result of 'AsText(wgs84_col)' $poi->wgs84_col; # You can also create or update 'GeomFromText($data,$srid)'; # below example is insert 'GeomFromText('POINT(135 35)',4301)' $poi->tokyo_col('POINT(135 35)'); $poi->update; # Access by KML geometry fragment $poi->kml_col; $poi->kml_col('135,35 136,36'); $poi->update; =head1 DESCRIPTION This module allows you to access geometry columns by WKT or KML format. =head1 METHODS =head2 geom_columns =cut sub geom_columns { shift->set_geom_columns( 'geom', @_ ) } =head2 kml_columns =cut sub kml_columns { shift->set_geom_columns( 'kml', @_ ) } =head1 INTERNAL METHODS =head2 set_geom_column =cut sub set_geom_columns { my $self = shift; my $type = shift; my $property = "_${type}_columns"; if (@_) { my %args; foreach my $elm (@_) { my $ref = ref($elm) ? $elm : { $elm => 4326 }; foreach my $col ( keys %$ref ) { $self->throw_exception("column $col doesn't exist") unless $self->has_column($col); } %args = ( %args, %$ref ); } my @keys = keys %args; $self->resultset_attributes( { '+select' => [ map { { 'AsText' => "me.$_" } } @keys ], '+as' => \@keys, } ); return $self->$property({ map { $_ => $args{$_} } @keys }); } else { return $self->$property; } } =head2 get_column =cut sub get_column { my ( $self, $column ) = @_; my $value = $self->next::method($column); my $kcols = $self->_kml_columns || {}; my $cols = { %{ $self->_geom_columns || {} }, %{ $kcols } }; if ( $cols and defined $value and ref($value) and ref($value) eq 'SCALAR' and $cols->{$column} ) { $value = ${$value} . ""; $value =~ s/GeomFromText\('(.+)',\d+\)/$1/; } if ( $kcols and defined $value and $kcols->{$column} ) { $value = wkt2kml($value); } $value; } =head2 get_columns =cut sub get_columns { my $self = shift; my %data = $self->next::method(@_); my $kcols = $self->_kml_columns || {}; my $cols = { %{ $self->_geom_columns || {} }, %{ $kcols } }; unless ( (caller(1))[3] eq 'DBIx::Class::Row::insert' ) { foreach my $col (grep { defined $data{$_} } keys %{ $cols }) { my $value = $data{$col}; if ( ref($value) and ref($value) eq 'SCALAR' ) { $value = ${$value}; $value =~ s/GeomFromText\('(.+)',\d+\)/$1/; } $value = wkt2kml($value) if ( $kcols->{$col} ); $data{$col} = $value; } } %data; } =head2 store_column =cut sub store_column { my ( $self, $column, $value ) = @_; my $kcols = $self->_kml_columns || {}; my $cols = { %{ $self->_geom_columns || {} }, %{ $kcols } }; if ( $cols and defined $value ) { $value = kml2wkt($value) if ( $kcols->{$column} ); if ( my $srid = $cols->{$column} ) { $value = \"GeomFromText('$value',$srid)"; } } $self->next::method( $column, $value ); } =head1 DEPENDENCIES L. L. =head1 AUTHOR OHTSUKA Ko-hei =head1 COPYRIGHT This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. The full text of the license can be found in the LICENSE file included with this module. =cut 1;