Statistics
| Revision:

root / tags / v2_0_0_Build_2020 / libraries / libRemoteServices / src / org / gvsig / remoteclient / wms / wms_1_3_0 / WMSLayer1_3_0.java @ 33963

History | View | Annotate | Download (10.7 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

    
8
import org.kxml2.io.KXmlParser;
9
import org.xmlpull.v1.XmlPullParserException;
10

    
11
import org.gvsig.compat.CompatLocator;
12
import org.gvsig.compat.lang.StringUtils;
13
import org.gvsig.remoteclient.utils.BoundaryBox;
14
import org.gvsig.remoteclient.utils.CapabilitiesTags;
15
import org.gvsig.remoteclient.utils.Utilities;
16
import org.gvsig.remoteclient.wms.WMSDimension;
17

    
18

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