Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.labeling.app / org.gvsig.labeling.app.mainplugin / src / main / java / org / gvsig / labeling / placements / MarkerPlacementAroundPoint.java @ 43510

History | View | Annotate | Download (6.69 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.labeling.placements;
25

    
26
import java.awt.Rectangle;
27
import java.awt.geom.NoninvertibleTransformException;
28
import java.util.ArrayList;
29

    
30
import org.gvsig.fmap.geom.Geometry;
31
import org.gvsig.fmap.geom.Geometry.TYPES;
32
import org.gvsig.fmap.geom.GeometryLocator;
33
import org.gvsig.fmap.geom.GeometryManager;
34
import org.gvsig.fmap.geom.primitive.Point;
35
import org.gvsig.fmap.mapcontext.ViewPort;
36
import org.gvsig.fmap.mapcontext.rendering.legend.styling.ILabelClass;
37
import org.gvsig.fmap.mapcontext.rendering.legend.styling.IPlacementConstraints;
38
import org.gvsig.symbology.fmap.mapcontext.rendering.legend.styling.LabelLocationMetrics;
39
import org.gvsig.tools.task.Cancellable;
40
import org.slf4j.Logger;
41
import org.slf4j.LoggerFactory;
42

    
43
public class MarkerPlacementAroundPoint implements ILabelPlacement {
44

    
45
        private static Logger logger =
46
                        LoggerFactory.getLogger(MarkerPlacementAroundPoint.class);
47
        private static final MarkerPlacementOnPoint pos = new MarkerPlacementOnPoint();
48

    
49
    @Override
50
        public ArrayList<LabelLocationMetrics> guess(
51
                        ILabelClass lc,
52
                        Geometry geom,
53
                        IPlacementConstraints placementConstraints,
54
                        double cartographicSymbolSize, Cancellable cancel, ViewPort vp) {
55
                
56
        if (cancel.isCanceled()) {
57
        return CannotPlaceLabel.NO_PLACES;
58
    }
59

    
60
        Geometry shp = geom.cloneGeometry();
61
        shp.transform(vp.getAffineTransform());
62

    
63
                if (placementConstraints instanceof PointPlacementConstraints) {
64
                        PointPlacementConstraints ppc = (PointPlacementConstraints) placementConstraints;
65
                        PointLabelPositioner plp = ppc.getPositioner();
66

    
67
                        if (plp != null) {
68
                                Point po_screen = null;
69
                                try {
70
                                    po_screen = shp.centroid();
71
                                } catch (Exception exc) {
72
                                        logger.error("While getting centroid.", exc);
73
                                }
74
                                
75
                                int[] preferredPositions = plp.getPreferenceVector();
76
                                ArrayList<LabelLocationMetrics> highPreference = new ArrayList<LabelLocationMetrics>();
77
                                ArrayList<LabelLocationMetrics> normalPreference = new ArrayList<LabelLocationMetrics>();
78
                                ArrayList<LabelLocationMetrics> lowPreference = new ArrayList<LabelLocationMetrics>();
79
                                Rectangle bounds = lc.getBounds();
80
                                double width = bounds.getWidth()*.5; // + 2; //?por qu? el +2?
81
                                double heigth = bounds.getHeight()*.5;
82

    
83
                                double offsetX = 0, offsetY = 0;
84
                                for (int i = 0; i < preferredPositions.length; i++) {
85
                                    
86
                                    Point po_aux = (Point) po_screen.cloneGeometry();
87
                                        switch (i) {
88
                                        case 0:
89
                                        case 3:
90
                                        case 5:
91
                                                // left
92
                                                offsetX = -width;
93
                                                break;
94
                                        case 2:
95
                                        case 4:
96
                                        case 7:
97
                                                // rigth
98
                                                offsetX = width;
99
                                                break;
100
                                        case 1:
101
                                        case 6:
102
                                        default:
103
                                                // horizontally centered
104
                                                offsetX = 0;
105
                                                break;
106
                                        }
107
                                        switch (i) {
108
                                        case 0:
109
                                        case 1:
110
                                        case 2:
111
                                                // top
112
                                                offsetY = -heigth;
113
                                                break;
114
                                        case 5:
115
                                        case 6:
116
                                        case 7:
117
                                                // below
118
                                                offsetY = heigth;
119
                                                break;
120
                                        case 3:
121
                                        case 4:
122
                                        default:
123
                                                // vertically centered
124
                                                offsetY = 0;
125
                                                break;
126

    
127
                                        }
128
//                                        // xOffset
129
//                                        switch (i % 3) {
130
//                                        case 0:
131
//                                                // left
132
//                                                offsetX = -width;
133
//                                                break;
134
//                                        case 2:
135
//                                                // rigth
136
//                                                offsetX = width;
137
//                                                break;
138
//                                        case 1:
139
//                                        default:
140
//                                                // horizontally centered
141
//                                                offsetX = 0;
142
//                                                break;
143
//
144
//                                        }
145
//
146
//                                        switch (i / 3) {
147
//                                        case 0:
148
//                                                // top
149
//                                                offsetY = -heigth;
150
//                                                break;
151
//                                        case 2:
152
//                                                // below
153
//                                                offsetY = heigth;
154
//                                                break;
155
//                                        case 1:
156
//                                        default:
157
//                                                // vertically centered
158
//                                                offsetY = 0;
159
//                                                break;
160
//
161
//                                        }
162
                                        
163
                                        po_aux.setX(po_aux.getX() + offsetX);
164
                                        po_aux.setY(po_aux.getY() + offsetY);
165
                                        try {
166
                                            /*
167
                                             * Back to map coordinates
168
                                             */
169
                                            po_aux.transform(vp.getAffineTransform().createInverse());
170
                                        } catch (NoninvertibleTransformException e) {
171
                                                logger.error("uninvertible matrix.", e);
172
                                        }
173

    
174
                                        switch (preferredPositions[i]) {
175
                                        case PointLabelPositioner.FORBIDDEN:
176
                                                break;
177
                                        case PointLabelPositioner.PREFERENCE_HIGH:
178
                                                highPreference.addAll(
179
                                                                pos.guess(lc, po_aux, placementConstraints, cartographicSymbolSize, cancel,vp));
180
                                                break;
181
                                        case PointLabelPositioner.PREFERENCE_NORMAL:
182

    
183
                                                normalPreference.addAll(
184
                                                                pos.guess(lc, po_aux, placementConstraints, cartographicSymbolSize, cancel,vp));
185
                                                break;
186
                                        case PointLabelPositioner.PREFERENCE_LOW:
187
                                                lowPreference.addAll(
188
                                                                pos.guess(lc, po_aux, placementConstraints, cartographicSymbolSize, cancel,vp));
189
                                                break;
190

    
191
                                        default:
192
                                                throw new Error("unrecognised label position preference value: "+preferredPositions[i]);
193
                                        }
194
                                }
195

    
196
                                ArrayList<LabelLocationMetrics> guessed = new ArrayList<LabelLocationMetrics>();
197
                                for (int j = 0; j < highPreference.size(); j++)                guessed.add(highPreference.get(j));
198
                                for (int j = 0; j < normalPreference.size(); j++)        guessed.add(normalPreference.get(j));
199
                                for (int j = 0; j < lowPreference.size(); j++)                guessed.add(lowPreference.get(j));
200
                                return guessed;
201
                        }
202
                }
203

    
204
                return CannotPlaceLabel.NO_PLACES;
205
        }
206

    
207

    
208

    
209
    @Override
210
        public boolean isSuitableFor(IPlacementConstraints placementConstraints,
211
                        int shapeType) {
212
                
213
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
214
        if( geomManager.isSubtype(TYPES.POINT, shapeType) ||
215
            geomManager.isSubtype(TYPES.MULTIPOINT, shapeType) ) {
216
                        // TODO (09/01/08) is this correct? if not fix it also in PlacementManager, PlacementProperties
217
                        return placementConstraints != null && placementConstraints.isAroundThePoint();
218
                } else {
219
                        return false;
220
                }
221
                
222
        }
223

    
224

    
225

    
226
}