Skip to content

Commit 6e67e47

Browse files
author
wonder
committedNov 19, 2009
Do transformation of coordinates in symbology-ng if on-the-fly projections are turned on
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@12193 c8812cc2-4d05-0410-92ff-de0c093fc19c

File tree

1 file changed

+163
-145
lines changed

1 file changed

+163
-145
lines changed
 

‎src/core/symbology-ng/qgsrendererv2.cpp

Lines changed: 163 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -18,36 +18,46 @@
1818

1919

2020

21-
static unsigned char* _getPoint(QPointF& pt, const QgsMapToPixel& mapToPixel, unsigned char* wkb)
21+
static unsigned char* _getPoint( QPointF& pt, QgsRenderContext& context, unsigned char* wkb )
2222
{
2323
wkb++; // jump over endian info
2424
unsigned int wkbType = *(( int* ) wkb );
25-
wkb += sizeof(unsigned int);
26-
27-
double x = *(( double * ) wkb ); wkb += sizeof(double);
28-
double y = *(( double * ) wkb ); wkb += sizeof(double);
29-
25+
wkb += sizeof( unsigned int );
26+
27+
double x = *(( double * ) wkb ); wkb += sizeof( double );
28+
double y = *(( double * ) wkb ); wkb += sizeof( double );
29+
3030
if ( wkbType == QGis::WKBPolygon25D )
31-
wkb += sizeof(double);
32-
33-
mapToPixel.transformInPlace(x,y);
34-
// TODO: coordinate transform
35-
pt = QPointF(x,y);
31+
wkb += sizeof( double );
32+
33+
if ( context.coordinateTransform() )
34+
{
35+
double z = 0; // dummy variable for coordiante transform
36+
context.coordinateTransform()->transformInPlace( x, y, z );
37+
}
38+
39+
context.mapToPixel().transformInPlace( x, y );
40+
41+
pt = QPointF( x, y );
3642
return wkb;
3743
}
3844

39-
static unsigned char* _getLineString(QPolygonF& pts, const QgsMapToPixel& mapToPixel, unsigned char* wkb)
45+
static unsigned char* _getLineString( QPolygonF& pts, QgsRenderContext& context, unsigned char* wkb )
4046
{
4147
wkb++; // jump over endian info
4248
unsigned int wkbType = *(( int* ) wkb );
43-
wkb += sizeof(unsigned int);
49+
wkb += sizeof( unsigned int );
4450
unsigned int nPoints = *(( int* ) wkb );
45-
wkb += sizeof(unsigned int);
46-
51+
wkb += sizeof( unsigned int );
52+
4753
bool hasZValue = ( wkbType == QGis::WKBLineString25D );
48-
double x,y;
54+
double x, y;
55+
56+
pts.resize( nPoints );
4957

50-
pts.resize(nPoints);
58+
const QgsCoordinateTransform* ct = context.coordinateTransform();
59+
const QgsMapToPixel& mtp = context.mapToPixel();
60+
double z = 0; // dummy variable for coordiante transform
5161

5262
for ( unsigned int i = 0; i < nPoints; ++i )
5363
{
@@ -58,195 +68,203 @@ static unsigned char* _getLineString(QPolygonF& pts, const QgsMapToPixel& mapToP
5868

5969
if ( hasZValue ) // ignore Z value
6070
wkb += sizeof( double );
61-
62-
mapToPixel.transformInPlace(x,y);
63-
64-
pts[i] = QPointF(x,y);
65-
66-
// TODO: coordinate transform
71+
72+
// TODO: maybe to the transform at once (faster?)
73+
if ( ct )
74+
ct->transformInPlace( x, y, z );
75+
mtp.transformInPlace( x, y );
76+
77+
pts[i] = QPointF( x, y );
78+
6779
}
68-
80+
6981
return wkb;
7082
}
7183

72-
static unsigned char* _getPolygon(QPolygonF& pts, QList<QPolygonF>& holes, const QgsMapToPixel& mapToPixel, unsigned char* wkb)
84+
static unsigned char* _getPolygon( QPolygonF& pts, QList<QPolygonF>& holes, QgsRenderContext& context, unsigned char* wkb )
7385
{
7486
wkb++; // jump over endian info
7587
unsigned int wkbType = *(( int* ) wkb );
76-
wkb += sizeof(unsigned int); // jump over wkb type
88+
wkb += sizeof( unsigned int ); // jump over wkb type
7789
unsigned int numRings = *(( int* ) wkb );
78-
wkb += sizeof(unsigned int);
79-
90+
wkb += sizeof( unsigned int );
91+
8092
if ( numRings == 0 ) // sanity check for zero rings in polygon
8193
return wkb;
8294

8395
bool hasZValue = ( wkbType == QGis::WKBPolygon25D );
84-
double x,y;
96+
double x, y;
8597
holes.clear();
8698

99+
const QgsCoordinateTransform* ct = context.coordinateTransform();
100+
const QgsMapToPixel& mtp = context.mapToPixel();
101+
double z = 0; // dummy variable for coordiante transform
102+
87103
for ( unsigned int idx = 0; idx < numRings; idx++ )
88104
{
89105
unsigned int nPoints = *(( int* )wkb );
90-
wkb += sizeof(unsigned int);
106+
wkb += sizeof( unsigned int );
91107

92-
QPolygonF poly(nPoints);
108+
QPolygonF poly( nPoints );
93109

94110
// Extract the points from the WKB and store in a pair of vectors.
95111
for ( unsigned int jdx = 0; jdx < nPoints; jdx++ )
96112
{
97113
x = *(( double * ) wkb ); wkb += sizeof( double );
98114
y = *(( double * ) wkb ); wkb += sizeof( double );
99-
100-
mapToPixel.transformInPlace(x,y);
101-
// TODO: coordinate transform
102115

103-
poly[jdx] = QPointF(x,y);
116+
// TODO: maybe to the transform at once (faster?)
117+
if ( ct )
118+
ct->transformInPlace( x, y, z );
119+
mtp.transformInPlace( x, y );
120+
121+
poly[jdx] = QPointF( x, y );
104122

105123
if ( hasZValue )
106124
wkb += sizeof( double );
107125
}
108-
126+
109127
if ( nPoints < 1 )
110128
continue;
111-
112-
if (idx == 0)
129+
130+
if ( idx == 0 )
113131
pts = poly;
114132
else
115-
holes.append(poly);
133+
holes.append( poly );
116134
}
117-
135+
118136
return wkb;
119137
}
120138

121139

122-
QgsFeatureRendererV2::QgsFeatureRendererV2(QString type)
123-
: mType(type), mUsingSymbolLevels(false)
140+
QgsFeatureRendererV2::QgsFeatureRendererV2( QString type )
141+
: mType( type ), mUsingSymbolLevels( false )
124142
{
125143
}
126144

127-
QgsFeatureRendererV2* QgsFeatureRendererV2::defaultRenderer(QGis::GeometryType geomType)
145+
QgsFeatureRendererV2* QgsFeatureRendererV2::defaultRenderer( QGis::GeometryType geomType )
128146
{
129-
return new QgsSingleSymbolRendererV2( QgsSymbolV2::defaultSymbol(geomType) );
147+
return new QgsSingleSymbolRendererV2( QgsSymbolV2::defaultSymbol( geomType ) );
130148
}
131149

132150

133-
void QgsFeatureRendererV2::renderFeature(QgsFeature& feature, QgsRenderContext& context, int layer)
151+
void QgsFeatureRendererV2::renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer )
134152
{
135-
QgsSymbolV2* symbol = symbolForFeature(feature);
136-
if (symbol == NULL)
153+
QgsSymbolV2* symbol = symbolForFeature( feature );
154+
if ( symbol == NULL )
137155
return;
138156

139157
QgsSymbolV2::SymbolType symbolType = symbol->type();
140-
158+
141159
QgsGeometry* geom = feature.geometry();
142-
switch (geom->wkbType())
160+
switch ( geom->wkbType() )
143161
{
144162
case QGis::WKBPoint:
163+
{
164+
if ( symbolType != QgsSymbolV2::Marker )
145165
{
146-
if (symbolType != QgsSymbolV2::Marker)
147-
{
148-
QgsDebugMsg("point can be drawn only with marker symbol!");
149-
break;
150-
}
151-
QPointF pt;
152-
_getPoint(pt, context.mapToPixel(), geom->asWkb());
153-
((QgsMarkerSymbolV2*)symbol)->renderPoint(pt, context, layer);
166+
QgsDebugMsg( "point can be drawn only with marker symbol!" );
167+
break;
154168
}
155-
break;
156-
169+
QPointF pt;
170+
_getPoint( pt, context, geom->asWkb() );
171+
(( QgsMarkerSymbolV2* )symbol )->renderPoint( pt, context, layer );
172+
}
173+
break;
174+
157175
case QGis::WKBLineString:
176+
{
177+
if ( symbolType != QgsSymbolV2::Line )
158178
{
159-
if (symbolType != QgsSymbolV2::Line)
160-
{
161-
QgsDebugMsg("linestring can be drawn only with line symbol!");
162-
break;
163-
}
164-
QPolygonF pts;
165-
_getLineString(pts, context.mapToPixel(), geom->asWkb());
166-
((QgsLineSymbolV2*)symbol)->renderPolyline(pts, context, layer);
179+
QgsDebugMsg( "linestring can be drawn only with line symbol!" );
180+
break;
167181
}
168-
break;
169-
182+
QPolygonF pts;
183+
_getLineString( pts, context, geom->asWkb() );
184+
(( QgsLineSymbolV2* )symbol )->renderPolyline( pts, context, layer );
185+
}
186+
break;
187+
170188
case QGis::WKBPolygon:
189+
{
190+
if ( symbolType != QgsSymbolV2::Fill )
171191
{
172-
if (symbolType != QgsSymbolV2::Fill)
173-
{
174-
QgsDebugMsg("polygon can be drawn only with fill symbol!");
175-
break;
176-
}
177-
QPolygonF pts;
178-
QList<QPolygonF> holes;
179-
_getPolygon(pts, holes, context.mapToPixel(), geom->asWkb());
180-
((QgsFillSymbolV2*)symbol)->renderPolygon(pts, (holes.count() ? &holes : NULL), context, layer);
192+
QgsDebugMsg( "polygon can be drawn only with fill symbol!" );
193+
break;
181194
}
182-
break;
183-
195+
QPolygonF pts;
196+
QList<QPolygonF> holes;
197+
_getPolygon( pts, holes, context, geom->asWkb() );
198+
(( QgsFillSymbolV2* )symbol )->renderPolygon( pts, ( holes.count() ? &holes : NULL ), context, layer );
199+
}
200+
break;
201+
184202
case QGis::WKBMultiPoint:
203+
{
204+
if ( symbolType != QgsSymbolV2::Marker )
185205
{
186-
if (symbolType != QgsSymbolV2::Marker)
187-
{
188-
QgsDebugMsg("multi-point can be drawn only with marker symbol!");
189-
break;
190-
}
191-
192-
unsigned char* wkb = geom->asWkb();
193-
unsigned int num = *(( int* )(wkb + 5) );
194-
unsigned char* ptr = wkb + 9;
195-
QPointF pt;
196-
197-
for (unsigned int i = 0; i < num; ++i)
198-
{
199-
ptr = _getPoint(pt, context.mapToPixel(), ptr);
200-
((QgsMarkerSymbolV2*)symbol)->renderPoint(pt, context, layer);
201-
}
206+
QgsDebugMsg( "multi-point can be drawn only with marker symbol!" );
207+
break;
202208
}
203-
break;
204-
209+
210+
unsigned char* wkb = geom->asWkb();
211+
unsigned int num = *(( int* )( wkb + 5 ) );
212+
unsigned char* ptr = wkb + 9;
213+
QPointF pt;
214+
215+
for ( unsigned int i = 0; i < num; ++i )
216+
{
217+
ptr = _getPoint( pt, context, ptr );
218+
(( QgsMarkerSymbolV2* )symbol )->renderPoint( pt, context, layer );
219+
}
220+
}
221+
break;
222+
205223
case QGis::WKBMultiLineString:
224+
{
225+
if ( symbolType != QgsSymbolV2::Line )
206226
{
207-
if (symbolType != QgsSymbolV2::Line)
208-
{
209-
QgsDebugMsg("multi-linestring can be drawn only with line symbol!");
210-
break;
211-
}
212-
213-
unsigned char* wkb = geom->asWkb();
214-
unsigned int num = *(( int* )(wkb + 5) );
215-
unsigned char* ptr = wkb + 9;
216-
QPolygonF pts;
217-
218-
for (unsigned int i = 0; i < num; ++i)
219-
{
220-
ptr = _getLineString(pts, context.mapToPixel(), ptr);
221-
((QgsLineSymbolV2*)symbol)->renderPolyline(pts, context, layer);
222-
}
227+
QgsDebugMsg( "multi-linestring can be drawn only with line symbol!" );
228+
break;
223229
}
224-
break;
225-
230+
231+
unsigned char* wkb = geom->asWkb();
232+
unsigned int num = *(( int* )( wkb + 5 ) );
233+
unsigned char* ptr = wkb + 9;
234+
QPolygonF pts;
235+
236+
for ( unsigned int i = 0; i < num; ++i )
237+
{
238+
ptr = _getLineString( pts, context, ptr );
239+
(( QgsLineSymbolV2* )symbol )->renderPolyline( pts, context, layer );
240+
}
241+
}
242+
break;
243+
226244
case QGis::WKBMultiPolygon:
245+
{
246+
if ( symbolType != QgsSymbolV2::Fill )
227247
{
228-
if (symbolType != QgsSymbolV2::Fill)
229-
{
230-
QgsDebugMsg("multi-polygon can be drawn only with fill symbol!");
231-
break;
232-
}
233-
234-
unsigned char* wkb = geom->asWkb();
235-
unsigned int num = *(( int* )(wkb + 5) );
236-
unsigned char* ptr = wkb + 9;
237-
QPolygonF pts;
238-
QList<QPolygonF> holes;
239-
240-
for (unsigned int i = 0; i < num; ++i)
241-
{
242-
ptr = _getPolygon(pts, holes, context.mapToPixel(), ptr);
243-
((QgsFillSymbolV2*)symbol)->renderPolygon(pts, (holes.count() ? &holes : NULL), context, layer);
244-
}
248+
QgsDebugMsg( "multi-polygon can be drawn only with fill symbol!" );
249+
break;
245250
}
246-
break;
247-
251+
252+
unsigned char* wkb = geom->asWkb();
253+
unsigned int num = *(( int* )( wkb + 5 ) );
254+
unsigned char* ptr = wkb + 9;
255+
QPolygonF pts;
256+
QList<QPolygonF> holes;
257+
258+
for ( unsigned int i = 0; i < num; ++i )
259+
{
260+
ptr = _getPolygon( pts, holes, context, ptr );
261+
(( QgsFillSymbolV2* )symbol )->renderPolygon( pts, ( holes.count() ? &holes : NULL ), context, layer );
262+
}
263+
}
264+
break;
265+
248266
default:
249-
QgsDebugMsg("unsupported wkb type for rendering");
267+
QgsDebugMsg( "unsupported wkb type for rendering" );
250268
}
251269
}
252270

@@ -256,32 +274,32 @@ QString QgsFeatureRendererV2::dump()
256274
}
257275

258276

259-
QgsFeatureRendererV2* QgsFeatureRendererV2::load(QDomElement& element)
277+
QgsFeatureRendererV2* QgsFeatureRendererV2::load( QDomElement& element )
260278
{
261279
// <renderer-v2 type=""> ... </renderer-v2>
262280

263-
if (element.isNull())
281+
if ( element.isNull() )
264282
return NULL;
265283

266284
// load renderer
267-
QString rendererType = element.attribute("type");
285+
QString rendererType = element.attribute( "type" );
268286

269-
QgsRendererV2CreateFunc pfCreate = QgsRendererV2Registry::instance()->rendererMetadata(rendererType).createFunction();
287+
QgsRendererV2CreateFunc pfCreate = QgsRendererV2Registry::instance()->rendererMetadata( rendererType ).createFunction();
270288

271289
// unknown renderer type?
272-
if (pfCreate == NULL)
290+
if ( pfCreate == NULL )
273291
return NULL;
274292

275-
return pfCreate(element);
293+
return pfCreate( element );
276294
}
277295

278-
QDomElement QgsFeatureRendererV2::save(QDomDocument& doc)
296+
QDomElement QgsFeatureRendererV2::save( QDomDocument& doc )
279297
{
280298
// create empty renderer element
281-
return doc.createElement(RENDERER_TAG_NAME);
299+
return doc.createElement( RENDERER_TAG_NAME );
282300
}
283301

284-
QgsLegendSymbologyList QgsFeatureRendererV2::legendSymbologyItems(QSize iconSize)
302+
QgsLegendSymbologyList QgsFeatureRendererV2::legendSymbologyItems( QSize iconSize )
285303
{
286304
// empty list by default
287305
return QgsLegendSymbologyList();

0 commit comments

Comments
 (0)
Please sign in to comment.