svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.symbology / org.gvsig.symbology.lib / org.gvsig.symbology.lib.impl / src / main / java / org / gvsig / symbology / fmap / mapcontext / rendering / dynamiclegend / DefaultDynamicLabelingStrategy.java @ 47476
History | View | Annotate | Download (20.3 KB)
1 |
/*
|
---|---|
2 |
* To change this license header, choose License Headers in Project Properties.
|
3 |
* To change this template file, choose Tools | Templates
|
4 |
* and open the template in the editor.
|
5 |
*/
|
6 |
package org.gvsig.symbology.fmap.mapcontext.rendering.dynamiclegend; |
7 |
|
8 |
import java.awt.Color; |
9 |
import java.awt.Font; |
10 |
import java.awt.Graphics2D; |
11 |
import java.awt.image.BufferedImage; |
12 |
import java.util.ArrayList; |
13 |
import java.util.List; |
14 |
import org.cresques.cts.ICoordTrans; |
15 |
import org.cresques.cts.IProjection; |
16 |
import org.gvsig.compat.print.PrintAttributes; |
17 |
import org.gvsig.expressionevaluator.Expression; |
18 |
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator; |
19 |
import org.gvsig.expressionevaluator.MutableSymbolTable; |
20 |
import org.gvsig.expressionevaluator.SymbolTable; |
21 |
import org.gvsig.fmap.dal.DALLocator; |
22 |
import org.gvsig.fmap.dal.exception.ReadException; |
23 |
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable; |
24 |
import org.gvsig.fmap.dal.feature.Feature; |
25 |
import org.gvsig.fmap.dal.feature.FeatureQuery; |
26 |
import org.gvsig.fmap.dal.feature.FeatureSelection; |
27 |
import org.gvsig.fmap.dal.feature.FeatureSet; |
28 |
import org.gvsig.fmap.dal.feature.FeatureStore; |
29 |
import org.gvsig.fmap.geom.Geometry; |
30 |
import org.gvsig.fmap.geom.exception.CreateGeometryException; |
31 |
import org.gvsig.fmap.geom.primitive.Envelope; |
32 |
import org.gvsig.fmap.geom.primitive.Point; |
33 |
import org.gvsig.fmap.mapcontext.MapContext; |
34 |
import org.gvsig.fmap.mapcontext.ViewPort; |
35 |
import org.gvsig.fmap.mapcontext.layers.FLayer; |
36 |
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect; |
37 |
import org.gvsig.fmap.mapcontext.layers.vectorial.SpatialEvaluatorsFactory; |
38 |
import org.gvsig.fmap.mapcontext.rendering.legend.styling.ILabelingMethod; |
39 |
import org.gvsig.fmap.mapcontext.rendering.legend.styling.IPlacementConstraints; |
40 |
import org.gvsig.fmap.mapcontext.rendering.legend.styling.IZoomConstraints; |
41 |
import org.gvsig.symbology.fmap.mapcontext.rendering.legend.styling.AttrInTableLabelingStrategy; |
42 |
import static org.gvsig.symbology.fmap.mapcontext.rendering.legend.styling.AttrInTableLabelingStrategy.MIN_TEXT_SIZE; |
43 |
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.impl.AbstractCartographicSupport; |
44 |
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.impl.CartographicSupportToolkit; |
45 |
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.text.impl.SimpleTextSymbol; |
46 |
import org.gvsig.tools.dispose.DisposableIterator; |
47 |
import org.gvsig.tools.evaluator.Evaluator; |
48 |
import org.gvsig.tools.exception.BaseException; |
49 |
import org.gvsig.tools.persistence.PersistentState; |
50 |
import org.gvsig.tools.persistence.exception.PersistenceException; |
51 |
import org.gvsig.tools.task.Cancellable; |
52 |
import org.slf4j.Logger; |
53 |
import org.slf4j.LoggerFactory; |
54 |
|
55 |
/**
|
56 |
*
|
57 |
* @author osc
|
58 |
*/
|
59 |
public class DefaultDynamicLabelingStrategy extends AbstractCartographicSupport implements DynamicLabelingStrategy { |
60 |
|
61 |
private Feature feature;
|
62 |
public String LROTATION = "LROTATION"; |
63 |
public String LTEXT = "LTEXT"; |
64 |
public String LHEIGHT = "LHEIGHT"; |
65 |
public String LCOLOR = "LCOLOR"; |
66 |
public String LFONT = "LFONT"; |
67 |
public String LFONTSTYLE = "LFONTS"; |
68 |
|
69 |
public static Expression expRotation = null; |
70 |
public static Expression expText = null; |
71 |
public static Expression expHeight = null; |
72 |
public static Expression expColor = null; |
73 |
public static Expression expFont = null; |
74 |
public static Expression expFontStyle = null; |
75 |
public static Expression expUnit; |
76 |
public static Expression expReferenceSystem; |
77 |
|
78 |
private MutableSymbolTable symbolTable = null; |
79 |
private FeatureSymbolTable featureSymbolTable = null; |
80 |
private FLyrVect layer;
|
81 |
private List<Geometry> drawnGeometryLabels; |
82 |
private final boolean printMode = false; |
83 |
private final IZoomConstraints zoom = null; |
84 |
private static final Logger logger = LoggerFactory.getLogger(AttrInTableLabelingStrategy.class); |
85 |
|
86 |
|
87 |
public SymbolTable getFeatureSymbolTable() {
|
88 |
if (symbolTable == null) { |
89 |
MutableSymbolTable s = ExpressionEvaluatorLocator.getManager().createSymbolTable(); |
90 |
featureSymbolTable = DALLocator.getDataManager().createFeatureSymbolTable(); |
91 |
s.addSymbolTable(featureSymbolTable); |
92 |
if (feature!=null) { |
93 |
featureSymbolTable.setFeature(feature); |
94 |
} |
95 |
symbolTable = s; |
96 |
} |
97 |
return symbolTable;
|
98 |
|
99 |
} |
100 |
|
101 |
// private Expression getExpressionFromString(String value) {
|
102 |
// Expression expression = ExpressionEvaluatorLocator.getManager().createExpression();
|
103 |
// expression.setPhrase(value);
|
104 |
// return expression;
|
105 |
// }
|
106 |
private Object getValueFromExpression(Expression exp) { |
107 |
if (exp == null) { |
108 |
return null; |
109 |
} |
110 |
Object value = exp.execute(getFeatureSymbolTable());
|
111 |
return value;
|
112 |
} |
113 |
|
114 |
public Object getComputedValue(String field) { |
115 |
Object value;
|
116 |
value = feature.get(field); |
117 |
|
118 |
return value;
|
119 |
} |
120 |
|
121 |
@Override
|
122 |
public Expression getRotation() { |
123 |
return expRotation;
|
124 |
} |
125 |
|
126 |
@Override
|
127 |
public int getComputedRotation() { |
128 |
Integer value = (Integer) getValueFromExpression(getRotation()); |
129 |
return value;
|
130 |
} |
131 |
|
132 |
@Override
|
133 |
public Expression getText() { |
134 |
return expText;
|
135 |
} |
136 |
|
137 |
@Override
|
138 |
public String getComputedText() { |
139 |
String value = (String) getValueFromExpression(getText()); |
140 |
return value;
|
141 |
} |
142 |
|
143 |
@Override
|
144 |
public Expression getHeight() { |
145 |
return expHeight;
|
146 |
} |
147 |
|
148 |
@Override
|
149 |
public int getComputedHeight() { |
150 |
int value = (int) getValueFromExpression(getHeight()); |
151 |
return value;
|
152 |
} |
153 |
|
154 |
@Override
|
155 |
public Expression getColor() { |
156 |
return expColor;
|
157 |
} |
158 |
|
159 |
@Override
|
160 |
public Color getComputedColor() { |
161 |
int rgbcolor = (int) getColor().execute(getFeatureSymbolTable()); |
162 |
Color color = new Color(rgbcolor, true); |
163 |
return color;
|
164 |
} |
165 |
|
166 |
@Override
|
167 |
public Expression getFixedSize() { |
168 |
return expHeight;
|
169 |
} |
170 |
|
171 |
@Override
|
172 |
public double getComputedFixedSize() { |
173 |
double value = (double) getValueFromExpression(getFixedSize()); |
174 |
return value;
|
175 |
} |
176 |
|
177 |
@Override
|
178 |
public int getComputedUnit() { |
179 |
int value = (int) getValueFromExpression(getUnitExp()); |
180 |
return value;
|
181 |
} |
182 |
|
183 |
@Override
|
184 |
public void setText(Expression expression) { |
185 |
expText = expression; |
186 |
} |
187 |
|
188 |
@Override
|
189 |
public void setRotation(Expression expression) { |
190 |
expRotation = expression; |
191 |
} |
192 |
|
193 |
@Override
|
194 |
public void setHeight(Expression expression) { |
195 |
expHeight = expression; |
196 |
} |
197 |
|
198 |
@Override
|
199 |
public void setColor(Expression expression) { |
200 |
expColor = expression; |
201 |
} |
202 |
|
203 |
@Override
|
204 |
public void setUsesFixedSize(boolean b) { |
205 |
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. |
206 |
} |
207 |
|
208 |
@Override
|
209 |
public boolean usesFixedSize() { |
210 |
return false; |
211 |
} |
212 |
|
213 |
@Override
|
214 |
public void setFixedSize(double fixedSize) { |
215 |
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. |
216 |
} |
217 |
|
218 |
@Override
|
219 |
public void setUsesFixedColor(boolean b) { |
220 |
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. |
221 |
} |
222 |
|
223 |
@Override
|
224 |
public boolean usesFixedColor() { |
225 |
return true; |
226 |
} |
227 |
|
228 |
@Override
|
229 |
public Expression getFixedColor() { |
230 |
return expColor;
|
231 |
} |
232 |
|
233 |
@Override
|
234 |
public Color getComputedFixedColor() { |
235 |
int rgbcolor = (int) getFixedColor().execute(getFeatureSymbolTable()); |
236 |
Color color = new Color(rgbcolor, true); |
237 |
return color;
|
238 |
} |
239 |
|
240 |
@Override
|
241 |
public void setFixedColor(Color fixedColor) { |
242 |
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. |
243 |
} |
244 |
|
245 |
@Override
|
246 |
public Expression getColorFont() { |
247 |
return expColor;
|
248 |
} |
249 |
|
250 |
@Override
|
251 |
public Color getComputedColorFont() { |
252 |
int rgbcolor = (int) getColorFont().execute(getFeatureSymbolTable()); |
253 |
Color color = new Color(rgbcolor, true); |
254 |
return color;
|
255 |
} |
256 |
|
257 |
@Override
|
258 |
public void setColorFont(Color colorFont) { |
259 |
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. |
260 |
} |
261 |
|
262 |
@Override
|
263 |
public Expression getFont() { |
264 |
return expFont;
|
265 |
} |
266 |
|
267 |
@Override
|
268 |
public Font getComputedFont() { |
269 |
String value = (String) getFont().execute(getFeatureSymbolTable()); |
270 |
Font font = new Font(value, getComputedFontStyle(), getComputedHeight()); |
271 |
return font;
|
272 |
} |
273 |
|
274 |
@Override
|
275 |
public void setFont(Font selFont) { |
276 |
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. |
277 |
} |
278 |
|
279 |
@Override
|
280 |
public Expression getFontStyle() { |
281 |
return expFontStyle;
|
282 |
} |
283 |
|
284 |
@Override
|
285 |
public int getComputedFontStyle() { |
286 |
int value = (int) getFontStyle().execute(getFeatureSymbolTable()); |
287 |
return value;
|
288 |
} |
289 |
|
290 |
@Override
|
291 |
public void setFontStyle(Expression expression) { |
292 |
expFontStyle = expression; |
293 |
} |
294 |
|
295 |
@Override
|
296 |
public void setFeature(Feature f) { |
297 |
feature = f; |
298 |
if (featureSymbolTable==null) { |
299 |
getFeatureSymbolTable(); |
300 |
} |
301 |
featureSymbolTable.setFeature(f); |
302 |
} |
303 |
|
304 |
@Override
|
305 |
public ILabelingMethod getLabelingMethod() {
|
306 |
throw new UnsupportedOperationException("Not supported yet."); |
307 |
} |
308 |
|
309 |
@Override
|
310 |
public void setLabelingMethod(ILabelingMethod method) { |
311 |
throw new UnsupportedOperationException("Not supported yet."); |
312 |
} |
313 |
|
314 |
@Override
|
315 |
public IPlacementConstraints getPlacementConstraints() {
|
316 |
throw new UnsupportedOperationException("Not supported yet."); |
317 |
} |
318 |
|
319 |
@Override
|
320 |
public void setPlacementConstraints(IPlacementConstraints constraints) { |
321 |
throw new UnsupportedOperationException("Not supported yet."); |
322 |
} |
323 |
|
324 |
@Override
|
325 |
public IZoomConstraints getZoomConstraints() {
|
326 |
throw new UnsupportedOperationException("Not supported yet."); |
327 |
} |
328 |
|
329 |
@Override
|
330 |
public void setZoomConstraints(IZoomConstraints constraints) { |
331 |
throw new UnsupportedOperationException("Not supported yet."); |
332 |
} |
333 |
|
334 |
@Override
|
335 |
public Expression getUnitExp() { |
336 |
return expUnit;
|
337 |
} |
338 |
|
339 |
public Expression getReferenceSystemExp() { |
340 |
return expReferenceSystem;
|
341 |
} |
342 |
|
343 |
private org.gvsig.fmap.geom.primitive.Point createLabelPoint(org.gvsig.fmap.geom.Geometry geom)
|
344 |
throws CreateGeometryException {
|
345 |
|
346 |
try {
|
347 |
return geom.centroid();
|
348 |
} catch (Exception e) { |
349 |
return null; |
350 |
} |
351 |
} |
352 |
|
353 |
@Override
|
354 |
public void draw(BufferedImage mapImage, Graphics2D mapGraphics, double scale, ViewPort viewPort, Cancellable cancel, double dpi) throws ReadException { |
355 |
PrintAttributes props = null;
|
356 |
if (layer == null) { |
357 |
return;
|
358 |
} |
359 |
|
360 |
if (zoom == null |
361 |
|| (zoom.isUserDefined() && (scale >= zoom.getMaxScale()) |
362 |
&& (scale <= zoom.getMinScale()))) { |
363 |
FeatureSet set = null;
|
364 |
DisposableIterator iterator = null;
|
365 |
try {
|
366 |
|
367 |
// limit the labeling to the visible extent
|
368 |
List<String> fields = new ArrayList<>(); |
369 |
|
370 |
FeatureStore featureStore = layer.getFeatureStore(); |
371 |
ICoordTrans ct = layer.getCoordTrans(); |
372 |
|
373 |
String geomName = featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName();
|
374 |
//TODO
|
375 |
fields.add(LCOLOR); |
376 |
fields.add(LFONT); |
377 |
fields.add(LFONTSTYLE); |
378 |
fields.add(LHEIGHT); |
379 |
fields.add(LROTATION); |
380 |
fields.add(LTEXT); |
381 |
fields.add(geomName); |
382 |
|
383 |
FeatureQuery featureQuery = layer.createFeatureQuery(); |
384 |
|
385 |
if (viewPort.getAdjustedEnvelope().contains(
|
386 |
layer.getFullEnvelope())) { |
387 |
/*
|
388 |
* viewport contains layer completely
|
389 |
*/
|
390 |
set = featureStore.getFeatureSet(featureQuery); |
391 |
} else {
|
392 |
/*
|
393 |
* view port does not contain layer completely
|
394 |
*/
|
395 |
Evaluator iee = null;
|
396 |
|
397 |
IProjection data_proj = null;
|
398 |
Envelope env_in_store_crs = null;
|
399 |
|
400 |
if (ct == null) { |
401 |
env_in_store_crs = viewPort.getAdjustedEnvelope(); |
402 |
data_proj = viewPort.getProjection(); |
403 |
} else {
|
404 |
env_in_store_crs = viewPort.getAdjustedEnvelope().convert( |
405 |
ct.getInverted()); |
406 |
data_proj = ct.getPOrig(); |
407 |
} |
408 |
iee = SpatialEvaluatorsFactory.getInstance().intersects( |
409 |
env_in_store_crs, |
410 |
data_proj, |
411 |
featureStore |
412 |
); |
413 |
featureQuery.setAttributeNames((String[]) fields.toArray(new String[fields.size()])); |
414 |
featureQuery.setFilter(iee); |
415 |
set = featureStore.getFeatureSet(featureQuery); |
416 |
} |
417 |
|
418 |
/*
|
419 |
* 'set' now has the features that have to be labeled
|
420 |
*/
|
421 |
FeatureSelection selection = this.layer.getFeatureStore().getFeatureSelection();
|
422 |
iterator = set.fastIterator(); |
423 |
while (iterator.hasNext()) {
|
424 |
if (cancel.isCanceled()) {
|
425 |
return;
|
426 |
} |
427 |
try {
|
428 |
Feature feat = (Feature) iterator.next(); |
429 |
Geometry geom = feat.getDefaultGeometry(); |
430 |
if (geom == null) { |
431 |
continue;
|
432 |
} |
433 |
|
434 |
double size = 0; |
435 |
Color color = null; |
436 |
this.setFeature(feat);
|
437 |
if ("".equals(getComputedText())) { |
438 |
continue;
|
439 |
} else if (getComputedText() == null) { |
440 |
continue;
|
441 |
} |
442 |
|
443 |
SimpleTextSymbol sym = new SimpleTextSymbol();
|
444 |
sym.setFont(getComputedFont()); |
445 |
sym.setUnit(getComputedUnit()); |
446 |
sym.setReferenceSystem(getComputedReferenceSystem()); |
447 |
if (this.usesFixedSize()) { //(useFixedSize) { |
448 |
// uses fixed size
|
449 |
size = getComputedFixedSize();// * fontScaleFactor;
|
450 |
} else if (true) { //(getComputedHeight() ) { |
451 |
// text size is defined in the table
|
452 |
size = getComputedHeight(); |
453 |
// } else {
|
454 |
// // otherwise will use the size in the symbol
|
455 |
// size = sym.getFont().getSize();
|
456 |
} |
457 |
|
458 |
double the_dpi = viewPort.getDPI();
|
459 |
if (props != null) { |
460 |
int len = PrintAttributes.PRINT_QUALITY_DPI.length;
|
461 |
int priq = props.getPrintQuality();
|
462 |
if (priq < 0 || priq >= len) { |
463 |
throw new ReadException(featureStore.getName(), |
464 |
new Exception("Bad print quality value: " + priq)); |
465 |
} else {
|
466 |
the_dpi = PrintAttributes.PRINT_QUALITY_DPI[priq]; |
467 |
} |
468 |
} |
469 |
|
470 |
size = CartographicSupportToolkit.getCartographicLength(this,
|
471 |
size, |
472 |
viewPort, |
473 |
the_dpi); |
474 |
if (size <= MIN_TEXT_SIZE) {
|
475 |
// label is too small to be readable, will be skipped
|
476 |
// this speeds up the rendering in wider zooms
|
477 |
continue;
|
478 |
} |
479 |
|
480 |
/*
|
481 |
* ym.setFontSize(int) assumes dpi = 72
|
482 |
*/
|
483 |
double font_size = size * 72 / the_dpi; |
484 |
sym.setFontSize(font_size); |
485 |
|
486 |
if (selection.isSelected(feat)) {
|
487 |
color = MapContext.getSelectionColor(); |
488 |
} else {
|
489 |
color = getComputedColorFont(); |
490 |
} |
491 |
|
492 |
sym.setTextColor(color); |
493 |
|
494 |
if (ct != null) { |
495 |
/*
|
496 |
* Reproject from store CRS to view CRS
|
497 |
*/
|
498 |
geom = geom.cloneGeometry(); |
499 |
geom.reProject(ct); |
500 |
} |
501 |
|
502 |
Point p = null; |
503 |
// text rotation is defined in the table
|
504 |
double rotation = -Math.toRadians(((Number) getComputedRotation()).doubleValue()); |
505 |
p = createLabelPoint(geom); |
506 |
|
507 |
sym.setText(getComputedText()); |
508 |
sym.setRotation(rotation); |
509 |
|
510 |
if (p != null) { |
511 |
if (props == null) { |
512 |
sym.draw(mapGraphics, viewPort.getAffineTransform(), p, feat, cancel); |
513 |
} else {
|
514 |
sym.print(mapGraphics, viewPort.getAffineTransform(), p, props); |
515 |
} |
516 |
} |
517 |
} catch (Exception ex) { |
518 |
logger.warn("", ex);
|
519 |
} |
520 |
} |
521 |
|
522 |
} catch (BaseException e) {
|
523 |
throw new ReadException( |
524 |
"Could not draw annotation in the layer.", e);
|
525 |
} finally {
|
526 |
if (iterator != null) { |
527 |
iterator.dispose(); |
528 |
} |
529 |
if (set != null) { |
530 |
set.dispose(); |
531 |
} |
532 |
|
533 |
} |
534 |
|
535 |
} |
536 |
|
537 |
} |
538 |
|
539 |
@Override
|
540 |
public void print(Graphics2D g, double scale, ViewPort viewPort, Cancellable cancel, PrintAttributes properties) throws ReadException { |
541 |
throw new UnsupportedOperationException("Not supported yet."); |
542 |
} |
543 |
|
544 |
@Override
|
545 |
public String[] getUsedFields() { |
546 |
throw new UnsupportedOperationException("Not supported yet."); |
547 |
} |
548 |
|
549 |
@Override
|
550 |
public void setLayer(FLayer flayer) { |
551 |
layer = (FLyrVect) flayer; |
552 |
} |
553 |
|
554 |
@Override
|
555 |
public boolean shouldDrawLabels(double scale) { |
556 |
return true; |
557 |
} |
558 |
|
559 |
@Override
|
560 |
public void saveToState(PersistentState state) throws PersistenceException { |
561 |
throw new UnsupportedOperationException("Not supported yet."); |
562 |
} |
563 |
|
564 |
@Override
|
565 |
public void loadFromState(PersistentState state) throws PersistenceException { |
566 |
throw new UnsupportedOperationException("Not supported yet."); |
567 |
} |
568 |
|
569 |
@Override
|
570 |
public void setUnit(int unitIndex) { |
571 |
throw new UnsupportedOperationException("Not supported yet."); |
572 |
} |
573 |
|
574 |
@Override
|
575 |
public void setUnit(Expression expression) { |
576 |
expUnit = expression; |
577 |
} |
578 |
|
579 |
@Override
|
580 |
public int getUnit() { |
581 |
return getComputedUnitExp();
|
582 |
} |
583 |
|
584 |
public int getComputedUnitExp() { |
585 |
int value = (int) getValueFromExpression(getUnitExp()); |
586 |
return value;
|
587 |
} |
588 |
|
589 |
|
590 |
public int getComputedReferenceSystem() { |
591 |
int value = (int) getValueFromExpression(getReferenceSystemExp()); |
592 |
return value;
|
593 |
} |
594 |
|
595 |
@Override
|
596 |
public int getReferenceSystem() { |
597 |
return getComputedReferenceSystem();
|
598 |
} |
599 |
|
600 |
@Override
|
601 |
public void setReferenceSystem(int referenceSystem) { |
602 |
// this.referenceSystem = referenceSystem;
|
603 |
} |
604 |
|
605 |
@Override
|
606 |
public void setFont(Expression expression) { |
607 |
expFont = expression; |
608 |
} |
609 |
|
610 |
@Override
|
611 |
public void setFontStyle(int style) { |
612 |
|
613 |
} |
614 |
|
615 |
@Override
|
616 |
public void setReferenceSystem(Expression expression) { |
617 |
expReferenceSystem = expression; |
618 |
} |
619 |
|
620 |
} |