OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimWms.cpp
Go to the documentation of this file.
1 // $Id$
2 
3 #include <ossim/base/ossimWms.h>
5 #include <deque>
6 #include <iostream>
7 #include <sstream>
9 
11 {
12  clearFields();
13  const vector<ossimRefPtr<ossimXmlNode> >& childNodes = node->getChildNodes();
14  ossim_uint32 idx = 0;
15 
16  for(idx = 0; idx < childNodes.size();++idx)
17  {
18  if(childNodes[idx]->getTag() == "Format")
19  {
20  ossimString text = childNodes[idx]->getText();
21  text = text.trim();
22  if(!text.empty())
23  {
24  theFormatTypes.push_back(text);
25  }
26  else
27  {
28  const vector<ossimRefPtr<ossimXmlNode> >& childFormatNodes = childNodes[idx]->getChildNodes();
29  if(childFormatNodes.size())
30  {
31  ossim_uint32 childIdx = 0;
32  for(childIdx = 0; childIdx < childFormatNodes.size();++childIdx)
33  {
34  text = childFormatNodes[childIdx]->getTag();
35  text = text.trim();
36  if(!text.empty())
37  {
38  theFormatTypes.push_back(text);
39  }
40  }
41  }
42  }
43  }
44  else if(childNodes[idx]->getTag() == "DCPType")
45  {
46  ossimRefPtr<ossimXmlNode> node = childNodes[idx]->findFirstNode("HTTP/Get/OnlineResource");
47  if(node.valid())
48  {
49  node->getAttributeValue(theUrl, "xlink:href");
50  }
51  else
52  {
53  node = childNodes[idx]->findFirstNode("HTTP/Get");
54  if(node.valid())
55  {
56  node->getAttributeValue(theUrl, "onlineResource");
58  }
59  }
60  }
61  }
62 
63  return true;
64 }
65 
66 bool ossimWmsGetMap::hasFormat(const ossimString& format, bool caseSensitive)const
67 {
68  if(theFormatTypes.empty()) return false;
69  ossimString tempFormat = format;
70  if(!caseSensitive) tempFormat = tempFormat.downcase();
71 
72  ossim_uint32 idx = 0;
73  for(idx = 0; idx < theFormatTypes.size();++idx)
74  {
75  ossimString temp = theFormatTypes[idx];
76  if(!caseSensitive)
77  {
78  temp = temp.downcase();
79  }
80  if(temp==tempFormat)
81  {
82  return true;
83  }
84  }
85 
86  return false;
87 }
88 
89 bool ossimWmsGetMap::containsFormat(const ossimString& format, bool caseSensitive)const
90 {
91  if(theFormatTypes.empty()) return false;
92  ossimString tempFormat = format;
93  if(!caseSensitive) tempFormat = tempFormat.downcase();
94 
95  ossim_uint32 idx = 0;
96  for(idx = 0; idx < theFormatTypes.size();++idx)
97  {
98  ossimString temp = theFormatTypes[idx];
99  if(!caseSensitive)
100  {
101  temp = temp.downcase();
102  }
103  if(temp.contains(tempFormat))
104  {
105  return true;
106  }
107  }
108 
109  return false;
110 }
111 
113 {
114  ossimRefPtr<ossimXmlNode> childNode = node->findFirstNode("DCPType/HTTP/Get/OnlineResource");
115 
116  if(childNode.valid())
117  {
118  childNode->getAttributeValue(theUrl, "xlink:href");
119  }
120 
121  return true;
122 }
123 
125 {
126  const vector<ossimRefPtr<ossimXmlNode> >& childNodes = node->getChildNodes();
127  ossim_uint32 idx = 0;
128 
129  for(idx = 0; idx < childNodes.size();++idx)
130  {
131  if((childNodes[idx]->getTag() == "GetCapabilities")||
132  (childNodes[idx]->getTag() == "Capabilities"))
133  {
135  theGetCapabilities->read(childNodes[idx]);
136  }
137  else if((childNodes[idx]->getTag() == "GetMap")||
138  (childNodes[idx]->getTag() == "Map"))
139  {
141  theGetMap->read(childNodes[idx]);
142  }
143  }
144 
145  return true;
146 }
147 
149 {
150  clearFields();
151  node->getAttributeValue(theDefaultValue, "default");
152  ossimString timeValues = node->getText();
153 
154  timeValues.split(theTimes, "/");
155 
156  return true;
157 }
158 
160 {
161  const vector<ossimRefPtr<ossimXmlNode> >& childNodes = node->getChildNodes();
162  ossim_uint32 idx = 0;
163  for(idx = 0; idx < childNodes.size();++idx)
164  {
165  if(childNodes[idx]->getTag() == "Name")
166  {
167  theName = childNodes[idx]->getText();
168  }
169  else if(childNodes[idx]->getTag() == "Title")
170  {
171  theTitle = childNodes[idx]->getText();
172  }
173  else if(childNodes[idx]->getTag() == "Abstract")
174  {
175  theAbstract = childNodes[idx]->getText();
176  }
177  }
178 
179  return true;
180 }
181 
183 {
184  ossimString minScale, maxScale;
185 
186  if(node->getAttributeValue(minScale, "min")&&
187  node->getAttributeValue(maxScale, "max"))
188  {
189 
190  theMin = minScale.toDouble();
191  theMax = maxScale.toDouble();
192 
193  return true;
194  }
195 
196  return false;
197 }
198 
200 {
201  ossimString minx, miny, maxx, maxy;
202 
203  bool result = (node->getAttributeValue(minx, "minx")&&
204  node->getAttributeValue(miny, "miny")&&
205  node->getAttributeValue(maxx, "maxx")&&
206  node->getAttributeValue(maxy, "maxy"));
207 
208  node->getAttributeValue(theSrs, "SRS");
209 
210  if(node->getTag() == "LatLonBoundingBox")
211  {
212  theSrs = "EPSG:4326";
213  }
214 
215  theMinX = minx.toDouble();
216  theMinY = miny.toDouble();
217  theMaxX = maxx.toDouble();
218  theMaxY = maxy.toDouble();
219 
220  return result;
221 }
222 
224 {
225  clearFields();
226  const vector<ossimRefPtr<ossimXmlNode> >& childNodes = node->getChildNodes();
227  ossim_uint32 idx = 0;
228  for(idx = 0; idx < childNodes.size();++idx)
229  {
230  if(childNodes[idx]->getTag() == "Name")
231  {
232  theName = childNodes[idx]->getText();
233  }
234  else if(childNodes[idx]->getTag() == "Title")
235  {
236  theTitle = childNodes[idx]->getText();
237  }
238  else if(childNodes[idx]->getTag() == "Abstract")
239  {
240  theAbstract = childNodes[idx]->getText();
241  }
242  else if(childNodes[idx]->getTag() == "Extent")
243  {
244  ossimString name;
245  if(childNodes[idx]->getAttributeValue(name, "name"))
246  {
247  if(name == "time")
248  {
250  if(!theTimeExtent->read(childNodes[idx]))
251  {
252  theTimeExtent = 0;
253  }
254  }
255  }
256  }
257  else if(childNodes[idx]->getTag() == "SRS")
258  {
259  theSrs = childNodes[idx]->getText();
260  }
261  else if(childNodes[idx]->getTag() == "Dimension")
262  {
263  childNodes[idx]->getAttributeValue(theDimensionUnits, "units");
264  childNodes[idx]->getAttributeValue(theDimensionName, "name");
265  }
266  else if(childNodes[idx]->getTag() == "Style")
267  {
269  style->read(childNodes[idx]);
270  theStyles.push_back(style);
271  }
272  else if(childNodes[idx]->getTag() == "ScaleHint")
273  {
275  if(!theScaleHint->read(childNodes[idx]))
276  {
277  theScaleHint = 0;
278  }
279  }
280  else if(childNodes[idx]->getTag() == "LatLonBoundingBox"||
281  childNodes[idx]->getTag() == "BoundingBox")
282  {
284  if(!theBoundingBox->read(childNodes[idx]))
285  {
286  theBoundingBox = 0;
287  }
288  }
289  else if(childNodes[idx]->getTag() == "Layer")
290  {
292  if(!layer->read(childNodes[idx]))
293  {
294  return false;
295  }
296  layer->setParent(this);
297  theLayers.push_back(layer.get());
298  }
299  }
300 
301  return true;
302 }
303 
305 {
306  if(theLayers.empty()) return;
307 
308  std::deque<ossimRefPtr<ossimWmsLayer> > layers(theLayers.begin(), theLayers.end());
309 
310  while(!layers.empty())
311  {
312  ossimRefPtr<ossimWmsLayer> layer = layers.front();
313  layers.pop_front();
314  if(!layer->getName().empty())
315  {
316  namedLayers.push_back(layer);
317  }
318  if(layer->getNumberOfChildren()>0)
319  {
320  ossimWmsLayerListType& layerList = layer->getLayers();
321  layers.insert(layers.end(), layerList.begin(), layerList.end());
322  }
323  }
324 }
325 
327 {
328  const vector<ossimRefPtr<ossimXmlNode> >& childNodes = node->getChildNodes();
329 
330  ossim_uint32 idx = 0;
331  for(idx = 0; idx < childNodes.size();++idx)
332  {
333  if(childNodes[idx]->getTag() == "Layer")
334  {
336  if(!layer->read(childNodes[idx]))
337  {
338  return false;
339  }
340  theLayers.push_back(layer.get());
341  }
342  else if(childNodes[idx]->getTag() == "Request")
343  {
345  theRequest->read(childNodes[idx]);
346  }
347  }
348 
349  return true;
350 }
351 
353 {
354  ossim_uint32 idx = 0;
355 
356  for(idx = 0; idx < theLayers.size(); ++idx)
357  {
358  if(!theLayers[idx]->getName().empty())
359  {
360  layers.push_back(theLayers[idx]);
361  }
362  theLayers[idx]->getNamedLayers(layers);
363  }
364 
365 }
366 
367 bool ossimWmsCapabilitiesDocument:: read(const std::string& inString)
368 {
369  std::istringstream in(inString);
371  if(!document->read(in))
372  {
373 // std::cout << "Couldn't parse XML!!!!!" << std::endl;
374  return false;
375  }
376  if(!read(document->getRoot()))
377  {
378  return false;
379  }
380 
381 // std::cout << *document << std::endl;
382  return true;
383 }
384 
386 {
387  const vector<ossimRefPtr<ossimXmlNode> >& childNodes = node->getChildNodes();
388  clearFields();
389  if(!node.valid()) return false;
390  node->getAttributeValue(theVersion, "version");
391  ossim_uint32 idx = 0;
392  for(idx = 0; idx < childNodes.size();++idx)
393  {
394  if(childNodes[idx]->getTag() == "Capability")
395  {
397  if(!theCapability->read(childNodes[idx]))
398  {
399  return false;
400  }
401  }
402  }
403 
404  return theCapability.valid();
405 }
406 
408 {
410 
411  if(theCapability.valid())
412  {
414  if(request.valid())
415  {
416  result = request->getMap();
417  }
418  }
419 
420  return result;
421 }
422 
424 {
425 
426  if(theCapability.valid())
427  {
429  if(request.valid())
430  {
431  return request->getMap();
432  }
433  }
434 
435  return 0;
436 }
437 
439 {
441 
442  if(theCapability.valid())
443  {
445  if(request.valid())
446  {
447  result = request->getCapabilities();
448  }
449  }
450 
451  return result;
452 }
453 
455 {
456  if(theCapability.valid())
457  {
459  if(request.valid())
460  {
461  return request->getCapabilities();
462  }
463  }
464 
465  return 0;
466 }
bool read(const std::string &inString)
Definition: ossimWms.cpp:367
std::vector< ossimRefPtr< ossimWmsLayer > > ossimWmsLayerListType
Definition: ossimWms.h:17
const ossimString & getName() const
Definition: ossimWms.h:377
ossimWmsStringListType theFormatTypes
Definition: ossimWms.h:69
ossimString theDefaultValue
Definition: ossimWms.h:187
virtual bool read(ossimRefPtr< ossimXmlNode > node)
Definition: ossimWms.cpp:223
ossimRefPtr< ossimWmsGetMap > getRequestGetMap()
Definition: ossimWms.cpp:407
bool valid() const
Definition: ossimRefPtr.h:75
const ossimXmlNode::ChildListType & getChildNodes() const
ossimString const & getTag() const
Definition: ossimXmlNode.h:53
virtual bool read(ossimRefPtr< ossimXmlNode > node)
Definition: ossimWms.cpp:182
virtual bool read(ossimRefPtr< ossimXmlNode > node)
Definition: ossimWms.cpp:199
bool contains(char aChar) const
Definition: ossimString.h:58
void split(std::vector< ossimString > &result, const ossimString &separatorList, bool skipBlankFields=false) const
Splits this string into a vector of strings (fields) using the delimiter list specified.
virtual bool read(ossimRefPtr< ossimXmlNode > node)
Definition: ossimWms.cpp:10
void clearFields()
Definition: ossimWms.h:331
const ossimRefPtr< ossimXmlNode > & findFirstNode(const ossimString &rel_xpath) const
ossimRefPtr< ossimWmsScaleHint > theScaleHint
Definition: ossimWms.h:448
ossimRefPtr< ossimWmsGetCapabilities > getRequestGetCapabilities()
Definition: ossimWms.cpp:438
ossimRefPtr< ossimWmsGetMap > getMap()
Definition: ossimWms.h:105
void clearFields()
Definition: ossimWms.h:181
OSSIM_DLL std::string convertHtmlSpecialCharactersToNormalCharacter(const std::string &src)
void getNamedLayers(ossimWmsLayerListType &namedLayers)
Definition: ossimWms.cpp:304
ossimString theName
Definition: ossimWms.h:440
virtual bool read(const ossimRefPtr< ossimXmlNode > node)
Definition: ossimWms.cpp:326
bool getAttributeValue(ossimString &value, const ossimString &name) const
const ossimString & getText() const
Definition: ossimXmlNode.h:92
ossimString theUrl
Definition: ossimWms.h:67
virtual bool read(ossimRefPtr< ossimXmlNode > node)
Definition: ossimWms.cpp:159
ossimRefPtr< ossimWmsRequest > theRequest
Definition: ossimWms.h:467
ossimString theDimensionName
Definition: ossimWms.h:446
virtual bool read(ossimRefPtr< ossimXmlNode > node)
Definition: ossimWms.cpp:112
unsigned int ossim_uint32
ossimString trim(const ossimString &valueToTrim=ossimString(" \\)) const
this will strip lead and trailing character passed in.
virtual bool read(ossimRefPtr< ossimXmlNode > node)
Definition: ossimWms.cpp:124
double toDouble() const
ossimString theAbstract
Definition: ossimWms.h:442
ossimString theTitle
Definition: ossimWms.h:241
void clearFields()
Definition: ossimWms.h:52
ossimString theSrs
Definition: ossimWms.h:443
ossimRefPtr< ossimWmsBoundingBox > theBoundingBox
Definition: ossimWms.h:447
static ossimString downcase(const ossimString &aString)
Definition: ossimString.cpp:48
ossimString theSrs
Definition: ossimWms.h:313
ossimRefPtr< ossimWmsGetCapabilities > theGetCapabilities
Definition: ossimWms.h:115
ossim_uint32 getNumberOfChildren() const
Definition: ossimWms.h:430
std::vector< ossimRefPtr< ossimWmsLayer > > theLayers
Definition: ossimWms.h:468
ossimString theUrl
Definition: ossimWms.h:85
bool containsFormat(const ossimString &format, bool caseSensitive=true) const
Will not do an exact compare but instead will test if the passed in string is contained within the fo...
Definition: ossimWms.cpp:89
ossimString theName
Definition: ossimWms.h:240
ossimRefPtr< ossimWmsTimeExtent > theTimeExtent
Definition: ossimWms.h:444
virtual bool read(ossimRefPtr< ossimXmlNode > node)
Definition: ossimWms.cpp:148
ossimWmsStyleListType theStyles
Definition: ossimWms.h:449
ossimRefPtr< ossimWmsGetMap > theGetMap
Definition: ossimWms.h:116
ossimRefPtr< ossimWmsGetCapabilities > getCapabilities()
Definition: ossimWms.h:97
void getNamedLayers(ossimWmsLayerListType &layers)
Definition: ossimWms.cpp:352
ossimRefPtr< ossimWmsRequest > getRequest()
Definition: ossimWms.h:458
ossimWmsLayerListType theLayers
Definition: ossimWms.h:450
ossimRefPtr< ossimWmsCapability > theCapability
Definition: ossimWms.h:503
ossimString theTitle
Definition: ossimWms.h:441
bool empty() const
Definition: ossimString.h:411
bool read(std::istream &in)
bool hasFormat(const ossimString &format, bool caseSensitive=true) const
Will do an exact compare on the input format.
Definition: ossimWms.cpp:66
std::basic_istringstream< char > istringstream
Class for char input memory streams.
Definition: ossimIosFwd.h:32
ossimRefPtr< ossimXmlNode > getRoot()
ossimString theAbstract
Definition: ossimWms.h:242
std::vector< ossimString > theTimes
Definition: ossimWms.h:188
ossimString theDimensionUnits
Definition: ossimWms.h:445
void setParent(ossimWmsLayer *parent)
Definition: ossimWms.h:355
const ossimWmsLayerListType & getLayers() const
Definition: ossimWms.h:421