Personal tools
You are here: Home Old Content - To be removed SOS Perl Cookbook Version 0.1 SOS Clients getCapabilities.pl SOS Client

getCapabilities.pl SOS Client

Simple perl script to retrieve and parse an SOS GetCapabilities response

getCapabilities.pl — text/x-perl, 3Kb

File contents

#!/usr/bin/perl
use strict; 
use XML::XPath; 
use LWP::Simple;

# pass in a SOS GetCapabilities URL
# you may need to put single quotes around the url to escape it from the shell.

error("GetCapabilities URL is required.\nSample Usage: $0 'http://www.gomoos.org/cgi-bin/sos/oostethys_sos?request=GetCapabilities'\n")
	if (@ARGV != 1);

my $xml_url = shift;

my $xml = LWP::Simple::get($xml_url);

error("Could not fetch $xml_url.\n") if(!$xml);

my $xp = XML::XPath->new(xml => $xml);

# Clear and reset these namespaces so we can use them in XPath queries no matter what prefix has been 
# used.
$xp->clear_namespaces();
$xp->set_namespace('sos','http://www.opengeospatial.net/sos');
$xp->set_namespace('ows','http://www.opengeospatial.net/ows');
$xp->set_namespace('gml','http://www.opengis.net/gml');

# we reuse these.
my ($node, $nodeset);

my $sos_url;
my $i = 0;
foreach my $node ($xp->find("//sos:Capabilities/ows:OperationsMetadata/ows:Operation")->get_nodelist){
	my $op_name = $node->getAttribute('name');
	if(uc($op_name) eq 'GETCAPABILITIES'){
		# for some reason the ows:DCP/ows:HTTP/ows:Get does not work here while it works above
		my $prefix = $node->getNamespace()->getPrefix;
		$nodeset = $node->find("$prefix:DCP/$prefix:HTTP/$prefix:Get");
		$sos_url = $nodeset->get_node(1)->getAttribute('xlink:href');
	}
}

my $org = $xp->find("//sos:Capabilities/ows:ServiceProvider/ows:ProviderName")->string_value;
$node = $xp->find("//sos:Capabilities/ows:ServiceProvider/ows:ProviderSite");

my $org_url = $node->get_node(1)->getAttribute('xlink:href');

print "$org\n";
print "$org_url\n";
print "SOS URL: $sos_url\n";
print "============================================\n";

# Loop thru the  ObservationOfferingList
foreach my $node ($xp->find("//sos:Capabilities/sos:Contents/sos:ObservationOfferingList/sos:ObservationOffering")->get_nodelist){
	my $sensor_name = $node->find("gml:name")->string_value;
	print "$sensor_name ";
	my $lower = $node->findvalue("gml:boundedBy/gml:Envelope/gml:lowerCorner");
	my $upper = $node->findvalue("gml:boundedBy/gml:Envelope/gml:upperCorner");
	# This works!
	# use lowerCorner for SRS
	my $srs = $node->find("gml:boundedBy/gml:Envelope/gml:lowerCorner")->get_node(1)->getAttribute('srsName');
	my $pos_type = '';
	if($lower eq $upper){
		$pos_type = 'POINT';
		print "\t$pos_type $srs";
		my @pos = split(/ /, $lower);
		print " lat: " . $pos[0];
		print " lon: " . $pos[1];
		print "\n";
	}else{
		$pos_type = 'BBOX';
		print "\t$pos_type $srs";
		print "lower_corner: $lower";
		print "upper_corner: $upper";
	}

	# DescribeSensor URL
	#print "\t$sos_url?service=SOS&version=0.31&request=DescribeSensor&sensorId=$sensor_name\n";

	# loop thru observedProperty list
	foreach my $node2 ( $node->findnodes("sos:observedProperty")->get_nodelist){
		my $property = '';
		if($node2->string_value){
			$property = $node2->string_value;
		}else{
			$property = $node2->getAttribute('xlink:href');
		}
		print "\tProperty: $property\n";
		# GetObservation URL
		#print "\t$sos_url?service=SOS&version=0.31&request=GetObservation&offering=$sensor_name&observedProperty=$property\n";
	}

	my $time_node = $node->find("sos:eventTime/gml:TimePeriod/gml:beginPosition")->get_node(1);
	my $begin_time = $time_node->string_value;
	if(!$begin_time or $begin_time eq ''){
		$begin_time = $time_node->getAttribute('indeterminatePosition');
	}

	# we may need the attribute so get the node
	$time_node = $node->find("sos:eventTime/gml:TimePeriod/gml:endPosition")->get_node(1);

	my $end_time = $time_node->string_value;
	if(!$end_time or $end_time eq ''){
		$end_time = $time_node->getAttribute('indeterminatePosition');
	};
	print "\tData available from: $begin_time to $end_time.\n";
	print "\n";


	$i++;
}

print "$i Offerings Found\n";
exit;

#######################################
sub error
{
	my $msg = shift;
	print $msg;
	exit 1;
}
Document Actions