USGS

Isis 3.0 Object Programmers' Reference

Home

ImageOverlap.cpp
1 #include <iostream>
2 #include <sstream>
3 
4 #include "geos/io/WKBReader.h"
5 #include "geos/io/WKBWriter.h"
6 
7 #include "PolygonTools.h"
8 #include "IException.h"
9 #include "FileName.h"
10 #include "ImageOverlap.h"
11 #include "IString.h"
12 
13 namespace Isis {
14 
20  Init();
21  }
22 
23 
32  ImageOverlap::ImageOverlap(QString serialNumber,
33  geos::geom::MultiPolygon &polygon) {
34  Init();
35  SetPolygon(polygon);
36  Add(serialNumber);
37  }
38 
45  ImageOverlap::ImageOverlap(std::istream &inputStream) {
46  geos::io::WKBReader geosReader;
47 
48  std::string fileData;
49  getline(inputStream, fileData);
50 
51  QString serialNums = fileData.c_str();
52  foreach (QString serialNum, serialNums.split(",")) {
53  Add(serialNum);
54  }
55 
56  // now get the multipolygon on the next line
57  getline(inputStream, fileData);
58 
59  std::stringstream multiPolygon;
60  multiPolygon << fileData;
61  multiPolygon.seekg(0, std::ios::beg);
62 
64  geosReader.readHEX(multiPolygon));
65  }
66 
67 
73  delete p_polygon;
74  };
75 
76 
82  p_serialNumbers.clear();
83  p_polygon = NULL;
84  }
85 
86 
94  void ImageOverlap::SetPolygon(const geos::geom::MultiPolygon &polygon) {
95  if(p_polygon != NULL) {
96  delete p_polygon;
97  p_polygon = NULL;
98  }
99 
100  p_polygon = PolygonTools::CopyMultiPolygon(polygon);
101  }
102 
103 
111  void ImageOverlap::SetPolygon(const geos::geom::MultiPolygon *polygon) {
112  if(p_polygon != NULL) {
113  delete p_polygon;
114  p_polygon = NULL;
115  }
116 
117  p_polygon = PolygonTools::CopyMultiPolygon(polygon);
118  }
119 
120 
121  void ImageOverlap::Write(std::ostream &outputStream) {
122  geos::io::WKBWriter geosWriter;
123 
124  QString serialNums;
125 
126  for(unsigned int sn = 0; sn < p_serialNumbers.size(); sn++) {
127  if(sn != 0) {
128  serialNums += ",";
129  }
130 
131  serialNums += p_serialNumbers[sn];
132  }
133 
134  serialNums += "\n";
135 
136  outputStream << serialNums;
137 
138  geosWriter.writeHEX(*p_polygon, outputStream);
139  }
147  void ImageOverlap::Add(QString &sn) {
148  for(unsigned int s = 0; s < p_serialNumbers.size(); ++s) {
149  if(sn == p_serialNumbers[s]) {
150  QString msg = "Duplicate SN added to [" +
151  QString::fromStdString(p_polygon->toString()) + "]";
153  }
154  }
155 
156  p_serialNumbers.push_back(sn);
157  return;
158  }
159 
160 
168  return p_polygon->getArea();
169  }
170 
176  for(int thisSn = 0; thisSn < this->Size(); ++thisSn) {
177  for(int otherSn = 0; otherSn < other.Size(); ++otherSn) {
178  if(p_serialNumbers[thisSn] == other.p_serialNumbers[otherSn]) {
179  return true;
180  }
181  }
182  }
183  return false;
184  }
185 
186 
187 
197  bool ImageOverlap::HasSerialNumber(QString &sn) const {
198  for(int thisSn = 0; thisSn < Size(); ++thisSn) {
199  if(p_serialNumbers[thisSn] == sn) {
200  return true;
201  }
202  }
203  return false;
204  }
205 
206 
207 }