Statistics
| Revision:

svn-gvsig-desktop / tags / gvSIGv0_6_1RELEASE / libraries / libRemoteServices / src / org / gvsig / remoteClient / wms / wms_1_3_0 / WMSLayer1_3_0.java @ 5222

History | View | Annotate | Download (10.6 KB)

1

    
2
package org.gvsig.remoteClient.wms.wms_1_3_0;
3

    
4
import java.io.IOException;
5
import java.util.ArrayList;
6
import java.util.TreeMap;
7
import java.util.Vector;
8

    
9
import org.gvsig.remoteClient.utils.BoundaryBox;
10
import org.gvsig.remoteClient.utils.CapabilitiesTags;
11
import org.gvsig.remoteClient.utils.Utilities;
12
import org.gvsig.remoteClient.wms.WMSDimension;
13
import org.kxml2.io.KXmlParser;
14
import org.xmlpull.v1.XmlPullParserException;
15

    
16

    
17
/**
18
 * <p>WMS Layer for WMS 1.3.0</p>
19
 * 
20
 */
21
public class WMSLayer1_3_0 extends org.gvsig.remoteClient.wms.WMSLayer {
22
    
23
    
24
    public ArrayList getDimensions()
25
    {   
26
        WMSDimension pDimension;
27
        WMSDimension myDimension;    
28
        ArrayList myDimensions = (ArrayList) this.dimensions.clone();        
29
        ArrayList pDimensions;
30
        
31
        if (parent!=null)
32
        {
33
                pDimensions = parent.getDimensions();
34
                for (int i= 0; i < pDimensions.size(); i++){
35
                        pDimension = (WMSDimension)pDimensions.get(i);
36
                        myDimension = getDimension(pDimension.getName());
37
                        if (myDimension != null){
38
                                pDimensions.remove(pDimension);
39
                        }
40
                }
41
                myDimensions.addAll(pDimensions);
42
        }
43
        return myDimensions;
44
    }
45
    
46
    public WMSLayer1_3_0()
47
    {
48
        children = new ArrayList();
49
    }
50
    /**
51
     * <p>Parses the contents of the parser(WMSCapabilities)
52
     * to extract the information about an WMSLayer</p>
53
     * 
54
     */
55
    public void parse(KXmlParser parser, TreeMap layerTreeMap)
56
    throws IOException, XmlPullParserException
57
    {
58
        int currentTag;
59
        boolean end = false;
60
        String value;
61
        BoundaryBox bbox;
62
        parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.LAYER);
63
        
64
        readLayerAttributes( parser );
65
        
66
        currentTag = parser.nextTag();
67
        
68
        while (!end) 
69
        {
70
            switch(currentTag)
71
            {
72
                case KXmlParser.START_TAG:
73
                    if (parser.getName().compareTo(CapabilitiesTags.LAYER)==0)
74
                    {        
75
                        WMSLayer1_3_0 lyr = new WMSLayer1_3_0();                                                
76
                        //parser.next(); 
77
                        lyr.parse(parser, layerTreeMap);
78
                        lyr.setParent(this);
79
                        this.children.add(lyr);
80
                        // Jaume
81
                        if (lyr.getName()!=null)
82
                            layerTreeMap.put(lyr.getName(), lyr);
83
                    }
84
                    else if (parser.getName().compareTo(CapabilitiesTags.ATTRIBUTION)==0){
85
                        // TODO comprobar que esto se necesite o se deseche
86
                        parser.skipSubTree();
87
                    }
88
                    else if (parser.getName().compareTo(CapabilitiesTags.NAME)==0)
89
                    {                
90
                        value = parser.nextText();
91
                        if (value != null) setName(value);                                                
92
                    }        
93
                    else if (parser.getName().compareTo(CapabilitiesTags.TITLE)==0)
94
                    {
95
                        value = parser.nextText();
96
                        if (value != null) setTitle(value);
97
                    }
98
                    else if (parser.getName().compareTo(CapabilitiesTags.ABSTRACT)==0)
99
                    {
100
                        value = parser.nextText();
101
                        if (value != null) setAbstract(value);
102
                    }
103
                    else if (parser.getName().compareTo(CapabilitiesTags.CRS)==0)
104
                    {
105
                            //TODO:
106
                            //comentar esto y a?adir solo los SRS o CRS que incluyan un extent...
107
                        value = parser.nextText();
108
                        if (value != null){
109
                            String[] srs = value.split(" ");
110
                            for (int i = 0; i < srs.length; i++) {
111
                                addSrs(srs[i]);    
112
                            }                        
113
                        }
114
                    }                                        
115
                    else if (parser.getName().compareTo(CapabilitiesTags.BOUNDINGBOX)==0)
116
                    {
117
                        bbox = new BoundaryBox();
118
                        value = parser.getAttributeValue("",CapabilitiesTags.CRS);
119
                        if (value != null)
120
                            bbox.setSrs(value);
121
                        value = parser.getAttributeValue("",CapabilitiesTags.MINX);
122
                        if ((value != null) && (Utilities.isNumber(value)))
123
                            bbox.setXmin(Double.parseDouble(value));        
124
                        value = parser.getAttributeValue("",CapabilitiesTags.MINY);
125
                        if ((value != null) && (Utilities.isNumber(value)))
126
                            bbox.setYmin(Double.parseDouble(value));        
127
                        value = parser.getAttributeValue("",CapabilitiesTags.MAXX);
128
                        if ((value != null) && (Utilities.isNumber(value)))
129
                            bbox.setXmax(Double.parseDouble(value));        
130
                        value = parser.getAttributeValue("",CapabilitiesTags.MAXY);
131
                        if ((value != null) && (Utilities.isNumber(value)))
132
                            bbox.setYmax(Double.parseDouble(value));        
133
                        
134
                        //X and Y spatial resolution in the units if that CRS.
135
                        //value = parser.getAttributeValue("",CapabilitiesTags.RESX);
136
                        //if ((value != null) && (Utilities.isNumber(value)))
137
                            //bbox.setYmax(Double.parseDouble(value));
138
                        //value = parser.getAttributeValue("",CapabilitiesTags.RESY);
139
                        //if ((value != null) && (Utilities.isNumber(value)))
140
                            //bbox.setYmax(Double.parseDouble(value));
141
                        
142
                        addBBox(bbox);
143
                        addSrs(bbox.getSrs());
144
                    }        
145
                    else if (parser.getName().compareTo(CapabilitiesTags.EX_GEOGRAPHICBOUNDINGBOX)==0)
146
                    {
147
                            //minimum bounding rectangle in decimal degrees of the area covered by the layer.
148
                        bbox = parseEXGeographicBBTag(parser);        
149
                        addBBox(bbox);
150
                        setLatLonBox(bbox);
151
                        addSrs(bbox.getSrs());
152
                    }                                                
153
                    else if (parser.getName().compareTo(CapabilitiesTags.SCALEHINT)==0)
154
                    {
155
                        value = parser.getAttributeValue("",CapabilitiesTags.MIN);
156
                        if ((value != null) && (Utilities.isNumber(value)))
157
                            setScaleMin(Double.parseDouble(value));
158
                        value = parser.getAttributeValue("",CapabilitiesTags.MAX);
159
                        if ((value != null) && (Utilities.isNumber(value)))
160
                            setScaleMax(Double.parseDouble(value));                                                                                                                                        
161
                    }                                                
162
                    else if (parser.getName().compareTo(CapabilitiesTags.STYLE)==0)
163
                    {
164
                        WMSStyle1_3_0 style = new WMSStyle1_3_0();
165
                        style.parse(parser);
166
                        if ((style != null) && (style.getName() != null))
167
                        {
168
                            styles.add(style);
169
                        }
170
                    }
171
                    else if (parser.getName().compareTo(CapabilitiesTags.DIMENSION)==0)
172
                    {
173
                        WMSDimension dim = new WMSDimension();
174
                        dim.parse(parser);
175
                        if ((dim != null) && (dim.getName() != null))
176
                        {
177
                            addDimension(dim);
178
                            
179
                        }
180
                    }                
181
                    else if (parser.getName().compareTo(CapabilitiesTags.KEYWORDLIST)==0)
182
                    {
183
                            parseKeywordList(parser);
184
                    }                     
185
                    break;
186
                case KXmlParser.END_TAG:
187
                    if (parser.getName().compareTo(CapabilitiesTags.LAYER) == 0)
188
                        end = true;
189
                    break;
190
                case KXmlParser.TEXT:                                        
191
                    break;
192
            }
193
            if (!end)
194
                    currentTag = parser.next();
195
        }
196
        parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.LAYER);
197
    }      
198
  
199
    
200
    /**
201
     * <p>Parses the EX_GeographicBoundingBox </p>
202
     */    
203
    private BoundaryBox parseEXGeographicBBTag(KXmlParser parser) throws IOException, XmlPullParserException 
204
    {
205
            int currentTag;
206
            boolean end = false;
207
            BoundaryBox bbox = new BoundaryBox ();
208
            String value;
209
            
210
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.EX_GEOGRAPHICBOUNDINGBOX);
211
            currentTag = parser.next();
212
            
213
            while (!end) 
214
            {
215
                         switch(currentTag)
216
                         {
217
                                case KXmlParser.START_TAG:
218
                                        if (parser.getName().compareTo(CapabilitiesTags.WESTBOUNDLONGITUDE)==0)
219
                                        {
220
                                                value = parser.nextText();                               
221
                            if ((value != null) && (Utilities.isNumber(value)))
222
                                    bbox.setXmin(Double.parseDouble(value));
223
                                        }        
224
                                        else if (parser.getName().compareTo(CapabilitiesTags.EASTBOUNDLONGITUDE)==0)
225
                                        {
226
                                                value = parser.nextText();                               
227
                            if ((value != null) && (Utilities.isNumber(value)))
228
                                    bbox.setXmax(Double.parseDouble(value));
229
                                        }
230
                                        else if (parser.getName().compareTo(CapabilitiesTags.NORTHBOUNDLATITUDE)==0)
231
                                        {
232
                                                value = parser.nextText();                               
233
                            if ((value != null) && (Utilities.isNumber(value)))
234
                                    bbox.setYmax(Double.parseDouble(value));
235
                                        }
236
                                        else if (parser.getName().compareTo(CapabilitiesTags.SOUTHBOUNDLATITUDE)==0)
237
                                        {
238
                                                value = parser.nextText();                               
239
                            if ((value != null) && (Utilities.isNumber(value)))
240
                                    bbox.setYmin(Double.parseDouble(value));
241
                                        }                                        
242
                                        break;
243
                                case KXmlParser.END_TAG:
244
                                        if (parser.getName().compareTo(CapabilitiesTags.EX_GEOGRAPHICBOUNDINGBOX) == 0)
245
                                                end = true;
246
                                        break;
247
                                case KXmlParser.TEXT:                                        
248
                                        break;
249
                         }
250
             if (!end)
251
                 currentTag = parser.next();
252
            }            
253
            parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.EX_GEOGRAPHICBOUNDINGBOX);
254
            
255
            //TODO: 
256
            bbox.setSrs("CRS:84");
257
            return bbox;
258
    }
259
    
260
    public String toString(){
261
        return super.toString();
262
    }
263
}