Statistics
| Revision:

svn-gvsig-desktop / branches / v02_desarrollo / libraries / sld / temp / org.gvsig.sldconverter / org.gvsig.sldconverter.lib / org.gvsig.sldconverter.lib.impl / src / main / java / org / gvsig / sldconverter / impl / symbol / PointSymbolUtils.java @ 40864

History | View | Annotate | Download (9.58 KB)

1
package org.gvsig.sldconverter.impl.symbol;
2

    
3
import java.awt.Color;
4
import java.net.URL;
5
import java.util.List;
6

    
7
import org.gvsig.fmap.geom.Geometry;
8
import org.gvsig.fmap.mapcontext.rendering.symbols.IMultiLayerSymbol;
9
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
10
import org.gvsig.sldconverter.exception.UnsupportedSymbolException;
11
import org.gvsig.sldconverter.impl.util.BasicUtils;
12
import org.gvsig.sldsupport.exception.UnsupportedSLDObjectException;
13
import org.gvsig.sldsupport.sld.filter.expression.operator.SLDLiteral;
14
import org.gvsig.sldsupport.sld.graphic.SLDExternalGraphic;
15
import org.gvsig.sldsupport.sld.graphic.SLDGraphic;
16
import org.gvsig.sldsupport.sld.graphic.SLDGraphicStackElement;
17
import org.gvsig.sldsupport.sld.graphic.SLDMark;
18
import org.gvsig.sldsupport.sld.symbol.SLDPointSymbol;
19
import org.gvsig.sldsupport.sld.symbol.misc.SLDFill;
20
import org.gvsig.sldsupport.sld.symbol.misc.SLDParameterValue;
21
import org.gvsig.sldsupport.sld.symbol.misc.SLDStroke;
22
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker.IMarkerSymbol;
23
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker.IPictureMarkerSymbol;
24
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker.ISimpleMarkerSymbol;
25

    
26
public class PointSymbolUtils {
27
        
28
        public static ISymbol toMarkerSymbol(SLDPointSymbol sym)
29
                        throws UnsupportedSLDObjectException {
30
                
31
                SLDGraphic gra = sym.getGraphic();
32
                List<SLDGraphicStackElement> list = gra.getElementStack();
33
                if (list.size() == 1) {
34
                        
35
                        Integer alpha = BasicUtils.getAlphaValue(gra.getOpacity());
36
                        Double sz = BasicUtils.getDouble(gra.getSize());
37
                        IMarkerSymbol msym = toMarkerSymbol(list.get(0));
38
                        if (alpha != null) {
39
                                msym.setAlpha(alpha.intValue());
40
                        }
41
                        if (sz != null) {
42
                                msym.setSize(sz.doubleValue());
43
                        }
44
                        return msym;
45
                } else {
46

    
47
                        IMultiLayerSymbol resp = BasicUtils.syMan().createMultiLayerSymbol(
48
                                        Geometry.TYPES.POINT);
49
                        for (int i=0; i<list.size(); i++) {
50
                                resp.addLayer(toMarkerSymbol(list.get(i)));
51
                        }
52
                        return resp;
53
                }
54
        }
55
        
56
        
57
        private static IMarkerSymbol toMarkerSymbol(SLDExternalGraphic extgra)
58
                        throws UnsupportedSLDObjectException {
59

    
60
                if (extgra.isOnlineResource()) {
61
                        URL u = null;
62
                        IPictureMarkerSymbol pms = null;
63
                        try {
64
                                u = new URL(extgra.getOnlineResource()); 
65
                                pms = BasicUtils.symMan().createPictureMarkerSymbol(u,u);
66
                        } catch (Exception exc) {
67
                                throw new UnsupportedSLDObjectException(exc,
68
                                                "SLDExternalGraphic", "Creating picture marker symbol from URL");
69
                        }
70
                        return pms;
71
                } else {
72
                        // TODO Not supported yet
73
                        throw new UnsupportedSLDObjectException(
74
                                        "SLDExternalGraphic",
75
                                        "Inline content not supported.");
76
                }
77
        }
78

    
79
        private static IMarkerSymbol toMarkerSymbol(SLDGraphicStackElement elem)
80
                        throws UnsupportedSLDObjectException {
81
                
82
                if (elem == null) {
83
                        throw new UnsupportedSLDObjectException("SLDGraphicStackElement", "Null");
84
                }
85
                
86
                if (elem instanceof SLDExternalGraphic) {
87
                        return toMarkerSymbol((SLDExternalGraphic) elem);
88
                } else {
89
                        if (elem instanceof SLDMark) {
90
                                return toMarkerSymbol((SLDMark) elem);
91
                        } else {
92
                                throw new UnsupportedSLDObjectException(
93
                                                "SLDGraphicStackElement",
94
                                                "Unexpected class: " + elem.getClass().getName());
95
                        }
96
                }
97
        }
98
        
99
        
100
        private static IMarkerSymbol toMarkerSymbol(SLDMark mk)
101
                        throws UnsupportedSLDObjectException {
102

    
103
                switch (mk.getMarkType()) {
104
                case SLDMark.MARK_TYPE_INLINE_CONTENT:
105
                        throw new UnsupportedSLDObjectException(
106
                                        "SLDMark",
107
                                        "Inline content not supported.");
108
                        // ============================================
109
                case SLDMark.MARK_TYPE_ONLINE_RESOURCE:
110
                        URL u = null;
111
                        IPictureMarkerSymbol pms = null;
112
                        try {
113
                                u = new URL(mk.getOnlineResource()); 
114
                                pms = BasicUtils.symMan().createPictureMarkerSymbol(u,u);
115
                        } catch (Exception exc) {
116
                                throw new UnsupportedSLDObjectException(exc, "SLDMark",
117
                                                "Creating picture marker symbol from URL");
118
                        }
119
                        return pms;                        
120
                        // ============================================
121
                case SLDMark.MARK_TYPE_WELL_KNOWN_NAME:
122
                        String wkn = mk.getWellKnownName();
123
                        int t = getMarkerSymbolType(wkn);
124
                        ISimpleMarkerSymbol resp = BasicUtils.symMan().createSimpleMarkerSymbol();
125
                        resp.setStyle(t);
126
                        
127
                        SLDFill fill = mk.getFill();
128
                        Color co = null;
129
                        Double dob = null;
130
                        if (fill != null) {
131
                                co = BasicUtils.toColor(fill.getFillColor());
132
                                if (co != null) {
133
                                        resp.setColor(co);
134
                                }
135
                        }
136
                        SLDStroke stro = mk.getStroke();
137
                        if (stro != null) {
138
                                co = BasicUtils.toColor(stro.getColor());
139
                                if (co != null) {
140
                                        resp.setOutlineColor(co);
141
                                }
142
                                dob = BasicUtils.toDouble(stro.getWidth());
143
                                if (dob != null) {
144
                                        resp.setOutlineSize(dob.doubleValue());
145
                                }
146
                        }
147
                        return resp;
148
                        // ============================================
149
                default:
150
                        IMarkerSymbol ms = BasicUtils.symMan().createSimpleMarkerSymbol();
151
                        SLDStroke str = mk.getStroke();
152
                        Color col = BasicUtils.getColor(str.getColor());
153
                        if (col != null) {
154
                                ms.setColor(col);
155
                        }
156
                        Double sz = BasicUtils.toDouble(str.getWidth());
157
                        if (sz != null) {
158
                                ms.setSize(sz.doubleValue());
159
                        }
160
                        return ms;
161
                }
162

    
163
        }
164
        
165
        private static int getMarkerSymbolType(String wkn) {
166
                
167
                if (wkn.compareToIgnoreCase("circle") == 0)
168
                        return IMarkerSymbol.CIRCLE_STYLE;
169
                else if (wkn.compareToIgnoreCase("x") == 0)
170
                        return IMarkerSymbol.X_STYLE;
171
                else if (wkn.compareToIgnoreCase("cross") == 0)
172
                        return IMarkerSymbol.CROSS_STYLE;
173
                else if (wkn.compareToIgnoreCase("triangle") == 0)
174
                        return IMarkerSymbol.TRIANGLE_STYLE;
175
                else if (wkn.compareToIgnoreCase("star") == 0)
176
                        return IMarkerSymbol.STAR_STYLE;
177
                return IMarkerSymbol.SQUARE_STYLE;
178
        }
179

    
180
        public static ISymbol toMarkerSymbol(SLDGraphic gra) 
181
                        throws UnsupportedSLDObjectException {
182
                
183
                IMarkerSymbol resp = null;
184
                List<SLDGraphicStackElement> list = gra.getElementStack();
185
                
186
                Integer alpha = BasicUtils.getAlphaValue(gra.getOpacity());
187
                Double sz = BasicUtils.getDouble(gra.getSize());
188

    
189
                if (list.size() == 0) {
190
                        // Get data from css/svg params
191
                        ISimpleMarkerSymbol sms = BasicUtils.symMan().createSimpleMarkerSymbol();
192
                        if (alpha != null) {
193
                                sms.setAlpha(alpha.intValue());
194
                        }
195
                        if (sz != null) {
196
                                sms.setSize(sz.doubleValue());
197
                        }
198
                        // color? default?
199
                        return sms;
200

    
201
                } else {
202
                        
203
                        if (list.size() == 1) {
204
                                IMarkerSymbol msym = toMarkerSymbol(list.get(0));
205
                                if (alpha != null) {
206
                                        msym.setAlpha(alpha.intValue());
207
                                }
208
                                if (sz != null) {
209
                                        msym.setSize(sz.doubleValue());
210
                                }
211
                                return msym;
212
                        } else {
213
                                
214
                                IMultiLayerSymbol mls = BasicUtils.syMan().createMultiLayerSymbol(Geometry.TYPES.POINT);
215
                                for (int i=0; i<list.size(); i++) {
216
                                        mls.addLayer(toMarkerSymbol(list.get(i)));
217
                                }
218
                                return mls;
219
                        }
220
                }
221
        }
222
        
223
        
224
        
225
        private static String getMarkWellKnownName(int style) {
226
                
227
                if (style == IMarkerSymbol.CIRCLE_STYLE)
228
                        return "circle";
229
                else if (style == IMarkerSymbol.CROSS_STYLE)
230
                        return "cross";
231
                else if (style == IMarkerSymbol.SQUARE_STYLE)
232
                        return "square";
233
                else if (style == IMarkerSymbol.TRIANGLE_STYLE)
234
                        return "triangle";
235
                else if (style == IMarkerSymbol.STAR_STYLE)
236
                        return "star";
237
                else if (style == IMarkerSymbol.X_STYLE)
238
                        return "x";
239
                
240
                return "square";        
241
        }        
242
        
243
        public static SLDPointSymbol toSLDPointSymbol(IMarkerSymbol sym)
244
                        throws UnsupportedSymbolException {
245
                
246
                if (sym instanceof IPictureMarkerSymbol) {
247
                        
248
                        IPictureMarkerSymbol aux = (IPictureMarkerSymbol) sym;
249
                        SLDExternalGraphic egra = new SLDExternalGraphic();
250
                        egra.setIsOnline(true);
251
                        egra.setOnlineResource(aux.getSource().toString());
252
                        egra.setFormat(BasicUtils.getFormat(aux.getSource()));
253
                        SLDGraphic gra = new SLDGraphic();
254
                        gra.getElementStack().add(egra);
255
                        SLDPointSymbol resp = new SLDPointSymbol();
256
                        resp.setGraphic(gra);
257
                        return resp;
258
                        
259
                } else {
260
                        if (sym instanceof ISimpleMarkerSymbol) {
261
                                
262
                                ISimpleMarkerSymbol aux = (ISimpleMarkerSymbol) sym;
263
                                
264
                                SLDMark mark = new SLDMark();
265
                                mark.setMarkType(SLDMark.MARK_TYPE_WELL_KNOWN_NAME);
266
                                String wkn = getMarkWellKnownName(aux.getStyle());
267
                                mark.setWellKnownName(wkn);
268
                                
269
                                Color fillColor = aux.getColor();
270
                                Color borderColor = aux.getOutlineColor();
271
                                double size = aux.getSize();
272
                                double borderw = aux.getOutlineSize();
273
                                double rot = aux.getRotation();
274
                                // from (radians,anticlockwise) to (degrees,clockwise) 
275
                                rot = -rot * 180.0 / Math.PI;
276
                                // ===============
277
                                SLDFill fill = new SLDFill();
278
                                if (fillColor == null) {
279
                                        fillColor = SLDFill.DEFAULT_FILL_COLOR;
280
                                }
281

    
282
                                fill.setFillColor(fillColor);
283
                                mark.setFill(fill);
284
                                // ===
285
                                SLDStroke stro = new SLDStroke();
286
                                stro.setColor(borderColor);
287
                                
288
                                stro.setWidth(new SLDLiteral(BasicUtils.df.format(borderw)));
289
                                mark.setStroke(stro);
290
                                // ===============
291
                                SLDGraphic gra = new SLDGraphic();
292
                                // ===============
293
                                SLDParameterValue pv = new SLDParameterValue();
294
                                pv.getExpressionList().add(new SLDLiteral(BasicUtils.df.format(size)));
295
                                gra.setSize(pv);
296
                                // ===
297
                                pv = new SLDParameterValue();
298
                                pv.getExpressionList().add(new SLDLiteral(BasicUtils.df.format(rot)));
299
                                gra.setRotation(pv);
300
                                // ===============
301
                                gra.getElementStack().add(mark);
302
                                SLDPointSymbol resp = new SLDPointSymbol();
303
                                resp.setGraphic(gra);
304
                                return resp;
305
                                
306
                        } else {
307
                                throw new UnsupportedSymbolException(
308
                                                sym.getClass().getName(),
309
                                                "Unsupported class for conversion to SLD");
310
                        }
311
                }
312
        }
313
        
314
        
315
        
316
}