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;
}

