/[drupal]/contributions/modules/carto/wms-parser.php
ViewVC logotype

Contents of /contributions/modules/carto/wms-parser.php

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.2 - (hide annotations) (download) (as text)
Fri Oct 13 13:22:51 2006 UTC (3 years, 1 month ago) by openwereld
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +29 -5 lines
File MIME type: text/x-php
wms node view as table listing
1 openwereld 1.1 <?php
2 openwereld 1.2 // $Id$
3 openwereld 1.1
4     // CubeWerx requires at least 10M for wms capabilities
5 openwereld 1.2 ini_set( 'memory_limit', '20M' );
6 openwereld 1.1
7     /**
8     *
9     * inherited: +style, +crs, =latlonboundingbox, =boundingbox, +authorityurl
10     * =dimension, =attribution, =min/maxscaledenominator, =queryable, =cascaded
11     * =opaque
12     * attribution: title, onlineresource->xlink:href, logourl(format,onlineresource)
13     * style: name, title, legendurl(format,onlineresource->xlink:href)
14     */
15     class CapabilitiesParser
16     {
17     var $parser;
18    
19     var $version = NULL; // wms version
20     var $root = NULL; // root element name (depends on wms version)
21     var $path = ''; // current path (excluding root)
22    
23     var $layers = array();
24     var $layer_level = 0;
25     var $layer_props;
26     var $inAttribution = false;
27     var $inStyle = false;
28    
29     var $element = ''; // current element
30     var $cbLayer = NULL;
31     var $cbLayerParams = NULL;
32     var $numLayers = 0;
33    
34     function CapabilitiesParser( )
35     {
36 openwereld 1.2 $this->parser = xml_parser_create( "UTF-8" );
37 openwereld 1.1 xml_parser_set_option( $this->parser, XML_OPTION_CASE_FOLDING, 0 );
38     xml_set_element_handler( $this->parser, array(&$this,"_startElement"), array(&$this,"_endElement") );
39     xml_set_character_data_handler( $this->parser, array(&$this,"_characterData") );
40     $this->layer_level = 0;
41     $this->layer_props = array();
42     $this->layer_props[ $this->layer_level ] = array( );
43     $this->layers = array( );
44     }
45    
46     function free_parser( )
47     {
48     xml_parser_free( $this->parser );
49     }
50    
51     function inSomething()
52     {
53     return $this->inAttribution || $this->inStyle !== false;
54     }
55    
56     function parse( $capabilities, $cbLayer = NULL, $cbLayerParams = NULL )
57     {
58     $this->cbLayer = $cbLayer;
59     $this->cbLayerParams = $cbLayerParams;
60     return xml_parse( $this->parser, $capabilities, TRUE );
61     }
62    
63     function _startElement( $parser, $name, $attrs )
64     {
65 openwereld 1.2 //print '_startElement ' . $name . "\n";
66 openwereld 1.1 if( ! $this->root )
67     {
68     $this->root = $name;
69     $this->version = $attrs['version'];
70 openwereld 1.2 $this->layer_props[ $this->layer_level ]['wms_version'] = $this->version;
71 openwereld 1.1 }
72     else
73     {
74     $this->path .= '/' . $name;
75     }
76     $this->element = $name;
77    
78     switch( $name )
79     {
80     case 'Attribution':
81     $this->inAttribution = true;
82     break;
83     case 'Style':
84     $this->inStyle = true;
85     // $this->layer_props[ $this->layer_level ]['Style'] = array( );
86     break;
87     case 'OnlineResource':
88     if( $this->inStyle !== false )
89     {
90     $this->layer_props[ $this->layer_level ]['Style'][ $this->inStyle ] = $attrs['xlink:href'];
91     }
92     break;
93     case 'Layer':
94     // the previous layer is a parent layer of the new one
95     if( ! isset($this->layer_props[ $this->layer_level ]['layer_id']) )
96     {
97     $this->layer_props[ $this->layer_level ]['layer_id'] = $this->numLayers++;
98     if( $this->cbLayer )
99     eval( $this->cbLayer . "(\$this->layer_props[\$this->layer_level], \$this->cbLayerParams );" );
100     else
101     {
102     // print $this->layer_level . ' : ' . var_export($this->layer_props[ $this->layer_level ],true) . '<br>';
103     $this->layers[] = $this->layer_props[ $this->layer_level ];
104     }
105     }
106     else
107     {
108     // adjust layer of $this->layer_props[ $this->layer_level ]
109     // count child layers?
110     }
111     $this->layer_level += 1;
112     // copy layer_props for new layer level and merge new attrs
113     // @todo: merge only inherited props!
114     $inherited_values = array();
115     $inherited_properties = array( 'Style', 'SRS', 'LatLonBoundingBox', 'BoundingBox', 'queryable', 'opaque', 'cascaded' );
116     foreach( $inherited_properties as $prop )
117     {
118     if( isset($this->layer_props[ $this->layer_level - 1 ][$prop]) )
119     $inherited_values[$prop] = $this->layer_props[ $this->layer_level - 1 ][$prop];
120     }
121     $this->layer_props[ $this->layer_level ] = array_merge( $inherited_values, $attrs );
122    
123     // print var_export( array($name,$attrs,$this->layer_level), true ) . '<br>';
124     break;
125     case 'LatLonBoundingBox';
126     if( $this->layer_level > 0 )
127     $this->layer_props[ $this->layer_level][ $name ] = $attrs;
128     break;
129     case 'BoundingBox':
130     if( $this->layer_level > 0 )
131     {
132     if( ! isset($this->layer_props[ $this->layer_level][ $name ]) )
133     $this->layer_props[ $this->layer_level][ $name ] = array();
134     $SRS = $attrs['SRS'];
135     unset( $attrs['SRS'] );
136     $this->layer_props[ $this->layer_level][ $name ][$SRS] = $attrs;
137     }
138     break;
139     default:
140     // print $this->path . ':' . var_export($attrs,true) . '<br>';
141     break;
142     }
143     // print $this->path . ': attrs = ' . var_export($attrs,true) . '<br>';
144     }
145    
146     function _characterData( $parser, $data )
147     {
148 openwereld 1.2 //print '_characterData ' . $this->element . ':' . $data . "\n";
149 openwereld 1.1 if( $this->element != '' )
150     {
151     $text = trim($data);
152 openwereld 1.2 if( $this->layer_level == 0 )
153     {
154     switch( $this->element )
155     {
156     case 'Title':
157     case 'Name':
158     case 'Abstract':
159     //print 'abstract=' . $test . '<br/>';
160     $this->layer_props[ $this->layer_level][ $this->element ] .= $text;
161     break;
162     }
163     }
164 openwereld 1.1 if( $this->layer_level > 0 && ! $this->inSomething() )
165     {
166     switch( $this->element )
167     {
168     case 'Title':
169     case 'Name':
170 openwereld 1.2 // if not a style name!!
171     $this->layer_props[ $this->layer_level][ $this->element ] .= $text;
172     break;
173 openwereld 1.1 case 'Abstract':
174 openwereld 1.2 //print 'abstract=' . $test . '<br/>';
175 openwereld 1.1 // if not a style name!!
176 openwereld 1.2 $this->layer_props[ $this->layer_level][ $this->element ] .= $text;
177 openwereld 1.1 break;
178     case 'SRS':
179     if( isset($this->layer_props[ $this->layer_level][ $this->element ])
180     && $this->layer_props[ $this->layer_level][ $this->element ] != '' )
181     {
182     $this->layer_props[ $this->layer_level][ $this->element ] .= ' ';
183     }
184     $this->layer_props[ $this->layer_level][ $this->element ] .= $text;
185     break;
186     }
187     }
188     else if( $this->inStyle !== false )
189     {
190     switch( $this->element )
191     {
192     case 'Name':
193 openwereld 1.2 $this->inStyle .= $text;
194 openwereld 1.1 break;
195     }
196     }
197     // print $this->path . ':<b>' . $this->element . '=' . $text . '|</b><br>';
198     // print '---> ' . $this->layer_level . '/' . var_export($this->layer_props[ $this->layer_level],true) . '<br>';
199 openwereld 1.2
200     //$this->element = ''; // previously here instead of at start of _endElement
201 openwereld 1.1 }
202     }
203    
204     function _endElement( $parser, $name )
205     {
206 openwereld 1.2 //print '_endElement ' . $name . "\n";
207     $this->element = ''; // instead of at end of _characterData function
208    
209 openwereld 1.1 $this->path = substr( $this->path, 0, -(1+strlen($name)) );
210     switch( $name )
211     {
212     case 'Layer':
213     if( ! $this->layer_props[ $this->layer_level ]['layer_id'] )
214     {
215     $this->layer_props[ $this->layer_level ]['layer_id'] = $this->numLayers++;
216     if( $this->cbLayer )
217     eval( $this->cbLayer . "(\$this->layer_props[\$this->layer_level], \$this->cbLayerParams );" );
218     else
219     {
220     // print $this->layer_level . ' : ' . var_export($this->layer_props[ $this->layer_level ],true) . '<br>';
221     $this->layers[] = $this->layer_props[ $this->layer_level ];
222     }
223     }
224     $this->layer_level -= 1;
225     array_pop( $this->layer_props );
226     break;
227     case 'Attribution':
228     $this->inAttribution = false;
229     break;
230     case 'Style':
231     $this->inStyle = false;
232     break;
233     default:
234     break;
235     }
236     }
237    
238     } // CapabilitiesParser
239    
240     ?>

  ViewVC Help
Powered by ViewVC 1.1.2