7 #include "GeoDataMultiGeometry.h"
8 #include "GeoDataMultiGeometry_p.h"
10 #include "GeoDataLineString.h"
11 #include "GeoDataLinearRing.h"
12 #include "GeoDataPoint.h"
13 #include "GeoDataPolygon.h"
14 #include "GeoDataTypes.h"
16 #include "MarbleDebug.h"
18 #include <QDataStream>
24 GeoDataMultiGeometry::GeoDataMultiGeometry()
25 : GeoDataGeometry( new GeoDataMultiGeometryPrivate )
29 GeoDataMultiGeometry::GeoDataMultiGeometry(
const GeoDataGeometry& other )
30 : GeoDataGeometry( other )
34 GeoDataMultiGeometry::~GeoDataMultiGeometry()
40 return GeoDataTypes::GeoDataMultiGeometryType;
43 EnumGeometryId GeoDataMultiGeometry::geometryId()
const
45 return GeoDataMultiGeometryId;
48 GeoDataGeometry *GeoDataMultiGeometry::copy()
const
50 return new GeoDataMultiGeometry(*
this);
53 bool GeoDataMultiGeometry::operator==(
const GeoDataMultiGeometry &other)
const
55 Q_D(
const GeoDataMultiGeometry);
56 const GeoDataMultiGeometryPrivate *
const other_d = other.d_func();
62 for (; thisBegin != thisEnd && otherBegin != otherEnd; ++thisBegin, ++otherBegin) {
63 if (**thisBegin != **otherBegin) {
71 const GeoDataLatLonAltBox& GeoDataMultiGeometry::latLonAltBox()
const
73 Q_D(
const GeoDataMultiGeometry);
78 d->m_latLonAltBox.clear();
79 for (; it !=
end; ++it) {
80 if ( !(*it)->latLonAltBox().isEmpty() ) {
81 if ( d->m_latLonAltBox.isEmpty() ) {
82 d->m_latLonAltBox = (*it)->latLonAltBox();
85 d->m_latLonAltBox |= (*it)->latLonAltBox();
89 return d->m_latLonAltBox;
92 int GeoDataMultiGeometry::size()
const
94 Q_D(
const GeoDataMultiGeometry);
95 return d->m_vector.size();
100 Q_D(
const GeoDataMultiGeometry);
105 GeoDataGeometry& GeoDataMultiGeometry::at(
int pos )
110 Q_D(GeoDataMultiGeometry);
111 return *(d->m_vector[pos]);
114 const GeoDataGeometry& GeoDataMultiGeometry::at(
int pos )
const
116 Q_D(
const GeoDataMultiGeometry);
117 return *(d->m_vector.at(pos));
120 GeoDataGeometry& GeoDataMultiGeometry::operator[](
int pos )
124 Q_D(GeoDataMultiGeometry);
125 return *(d->m_vector[pos]);
128 const GeoDataGeometry& GeoDataMultiGeometry::operator[](
int pos )
const
130 Q_D(
const GeoDataMultiGeometry);
131 return *(d->m_vector[pos]);
134 GeoDataGeometry& GeoDataMultiGeometry::last()
138 Q_D(GeoDataMultiGeometry);
139 return *(d->m_vector.last());
142 GeoDataGeometry& GeoDataMultiGeometry::first()
146 Q_D(GeoDataMultiGeometry);
147 return *(d->m_vector.first());
150 const GeoDataGeometry& GeoDataMultiGeometry::last()
const
152 Q_D(
const GeoDataMultiGeometry);
153 return *(d->m_vector.last());
156 const GeoDataGeometry& GeoDataMultiGeometry::first()
const
158 Q_D(
const GeoDataMultiGeometry);
159 return *(d->m_vector.first());
166 Q_D(GeoDataMultiGeometry);
167 return d->m_vector.begin();
174 Q_D(GeoDataMultiGeometry);
175 return d->m_vector.end();
180 Q_D(
const GeoDataMultiGeometry);
181 return d->m_vector.constBegin();
186 Q_D(
const GeoDataMultiGeometry);
187 return d->m_vector.constEnd();
198 return d->m_vector.at(i);
204 return d->m_vector.at(i);
213 for (
int i = 0; i < d->m_vector.size(); ++i) {
214 if (d->m_vector.at(i) ==
object) {
230 d->m_vector.append(other);
241 d->m_vector.append(g);
245 void GeoDataMultiGeometry::clear()
249 Q_D(GeoDataMultiGeometry);
250 qDeleteAll(d->m_vector);
254 void GeoDataMultiGeometry::pack(
QDataStream& stream )
const
256 Q_D(
const GeoDataMultiGeometry);
260 stream << d->m_vector.size();
264 iterator != d->m_vector.constEnd();
266 const GeoDataGeometry *geometry = *iterator;
267 stream << geometry->geometryId();
268 geometry->pack( stream );
272 void GeoDataMultiGeometry::unpack(
QDataStream& stream )
276 Q_D(GeoDataMultiGeometry);
283 for(
int i = 0; i < size; i++ ) {
285 stream >> geometryId;
286 switch( geometryId ) {
287 case InvalidGeometryId:
291 GeoDataPoint *point =
new GeoDataPoint;
292 point->unpack( stream );
293 d->m_vector.append(point);
296 case GeoDataLineStringId:
298 GeoDataLineString *lineString =
new GeoDataLineString;
299 lineString->unpack( stream );
300 d->m_vector.append(lineString);
303 case GeoDataLinearRingId:
305 GeoDataLinearRing *linearRing =
new GeoDataLinearRing;
306 linearRing->unpack( stream );
307 d->m_vector.append(linearRing);
310 case GeoDataPolygonId:
312 GeoDataPolygon *polygon =
new GeoDataPolygon;
313 polygon->unpack( stream );
314 d->m_vector.append(polygon);
317 case GeoDataMultiGeometryId:
319 GeoDataMultiGeometry *multiGeometry =
new GeoDataMultiGeometry;
320 multiGeometry->unpack( stream );
321 d->m_vector.append(multiGeometry);