/[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 - (show 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 <?php
2 // $Id$
3
4 // CubeWerx requires at least 10M for wms capabilities
5 ini_set( 'memory_limit', '20M' );
6
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 $this->parser = xml_parser_create( "UTF-8" );
37 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 //print '_startElement ' . $name . "\n";
66 if( ! $this->root )
67 {
68 $this->root = $name;
69 $this->version = $attrs['version'];
70 $this->layer_props[ $this->layer_level ]['wms_version'] = $this->version;
71 }
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 //print '_characterData ' . $this->element . ':' . $data . "\n";
149 if( $this->element != '' )
150 {
151 $text = trim($data);
152 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 if( $this->layer_level > 0 && ! $this->inSomething() )
165 {
166 switch( $this->element )
167 {
168 case 'Title':
169 case 'Name':
170 // if not a style name!!
171 $this->layer_props[ $this->layer_level][ $this->element ] .= $text;
172 break;
173 case 'Abstract':
174 //print 'abstract=' . $test . '<br/>';
175 // if not a style name!!
176 $this->layer_props[ $this->layer_level][ $this->element ] .= $text;
177 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 $this->inStyle .= $text;
194 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
200 //$this->element = ''; // previously here instead of at start of _endElement
201 }
202 }
203
204 function _endElement( $parser, $name )
205 {
206 //print '_endElement ' . $name . "\n";
207 $this->element = ''; // instead of at end of _characterData function
208
209 $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