RDF::Query::Functions::Geo - Geographic extension functions


RDF-Query documentation Contained in the RDF-Query distribution.

Index


Code Index:

NAME

Top

RDF::Query::Functions::Geo - Geographic extension functions

VERSION

Top

This document describes RDF::Query::Functions::Geo version 2.907.

DESCRIPTION

Top

Defines the following function:

* java:com.ldodds.sparql.Distance

AUTHOR

Top

 Gregory Williams <gwilliams@cpan.org>.


RDF-Query documentation Contained in the RDF-Query distribution.
package RDF::Query::Functions::Geo;

use strict;
use warnings;
use Scalar::Util qw(blessed reftype refaddr looks_like_number);
use Log::Log4perl;
our ($VERSION, $l);
BEGIN {
	$l			= Log::Log4perl->get_logger("rdf.query.functions.geo");
	$VERSION	= '2.907';
}

our $GEO_DISTANCE_LOADED;
BEGIN {
	$GEO_DISTANCE_LOADED	= do {
		eval {
			require Geo::Distance;
		};
		($@) ? 0 : 1;
	};
}

sub install {
	RDF::Query::Functions->install_function(
		"java:com.ldodds.sparql.Distance",
		sub {
			# http://xmlarmyknife.com/blog/archives/000281.html
			my $query	= shift;
			my ($lat1, $lon1, $lat2, $lon2);
			
			unless ($GEO_DISTANCE_LOADED) {
				throw RDF::Query::Error::FilterEvaluationError ( -text => "Cannot compute distance because Geo::Distance is not available" );
			}
	
			my $geo		= ref($query)
						? ($query->{_query_cache}{'java:com.ldodds.sparql.Distance'}{_geo_dist_obj} ||= new Geo::Distance)
						: new Geo::Distance;
			if (2 == @_) {
				my ($point1, $point2)	= map { $_->literal_value } splice(@_,0,2);
				($lat1, $lon1)	= split(/ /, $point1);
				($lat2, $lon2)	= split(/ /, $point2);
			} else {
				($lat1, $lon1, $lat2, $lon2)	= map { $_->literal_value } splice(@_,0,4);
			}
			
			my $dist	= $geo->distance(
							'kilometer',
							$lon1,
							$lat1,
							$lon2,
							$lat2,
						);
		#	warn "ldodds:Distance => $dist\n";
			return RDF::Query::Node::Literal->new("$dist", undef, 'http://www.w3.org/2001/XMLSchema#float');
		}
	);
}

1;

__END__