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"
24GeoDataMultiGeometry::GeoDataMultiGeometry()
25 : GeoDataGeometry( new GeoDataMultiGeometryPrivate )
29GeoDataMultiGeometry::GeoDataMultiGeometry(
const GeoDataGeometry& other )
30 : GeoDataGeometry( other )
34GeoDataMultiGeometry::~GeoDataMultiGeometry()
38const char *GeoDataMultiGeometry::nodeType()
const
40 return GeoDataTypes::GeoDataMultiGeometryType;
43EnumGeometryId GeoDataMultiGeometry::geometryId()
const
45 return GeoDataMultiGeometryId;
48GeoDataGeometry *GeoDataMultiGeometry::copy()
const
50 return new GeoDataMultiGeometry(*
this);
53bool 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) {
71const 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;
92int GeoDataMultiGeometry::size()
const
94 Q_D(
const GeoDataMultiGeometry);
95 return d->m_vector.size();
100 Q_D(
const GeoDataMultiGeometry);
105GeoDataGeometry& GeoDataMultiGeometry::at(
int pos )
107 mDebug() <<
"detaching!";
110 Q_D(GeoDataMultiGeometry);
111 return *(d->m_vector[pos]);
114const GeoDataGeometry& GeoDataMultiGeometry::at(
int pos )
const
116 Q_D(
const GeoDataMultiGeometry);
117 return *(d->m_vector.at(pos));
120GeoDataGeometry& GeoDataMultiGeometry::operator[](
int pos )
124 Q_D(GeoDataMultiGeometry);
125 return *(d->m_vector[pos]);
128const GeoDataGeometry& GeoDataMultiGeometry::operator[](
int pos )
const
130 Q_D(
const GeoDataMultiGeometry);
131 return *(d->m_vector[pos]);
134GeoDataGeometry& GeoDataMultiGeometry::last()
138 Q_D(GeoDataMultiGeometry);
139 return *(d->m_vector.last());
142GeoDataGeometry& GeoDataMultiGeometry::first()
146 Q_D(GeoDataMultiGeometry);
147 return *(d->m_vector.first());
150const GeoDataGeometry& GeoDataMultiGeometry::last()
const
152 Q_D(
const GeoDataMultiGeometry);
153 return *(d->m_vector.last());
156const 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);
245void GeoDataMultiGeometry::clear()
249 Q_D(GeoDataMultiGeometry);
250 qDeleteAll(d->m_vector);
254void GeoDataMultiGeometry::pack(
QDataStream& stream )
const
256 Q_D(
const GeoDataMultiGeometry);
258 GeoDataGeometry::pack( stream );
260 stream << d->m_vector.size();
263 = d->m_vector.constBegin();
264 iterator != d->m_vector.constEnd();
266 const GeoDataGeometry *geometry = *iterator;
267 stream << geometry->geometryId();
268 geometry->pack( stream );
272void GeoDataMultiGeometry::unpack(
QDataStream& stream )
276 Q_D(GeoDataMultiGeometry);
277 GeoDataGeometry::unpack( stream );
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);
A base class for all geodata features.
A class that can contain other GeoDataGeometry objects.
void setParent(GeoDataObject *parent)
Sets the parent of the object.
const QList< QKeySequence > & end()
Binds a QML item to a specific geodetic location in screen coordinates.