1 package fr.ifremer.dali.ui.swing.util.map;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 import com.vividsolutions.jts.geom.LineString;
38 import com.vividsolutions.jts.geom.MultiLineString;
39 import com.vividsolutions.jts.geom.MultiPolygon;
40 import com.vividsolutions.jts.geom.Polygon;
41 import org.geotools.data.FeatureSource;
42 import org.geotools.data.FileDataStore;
43 import org.geotools.data.FileDataStoreFinder;
44 import org.geotools.factory.CommonFactoryFinder;
45 import org.geotools.map.FeatureLayer;
46 import org.geotools.map.Layer;
47 import org.geotools.map.MapContent;
48 import org.geotools.styling.*;
49 import org.geotools.styling.Stroke;
50 import org.geotools.swing.JMapFrame;
51 import org.geotools.swing.data.JFileDataStoreChooser;
52 import org.geotools.swing.dialog.JExceptionReporter;
53 import org.geotools.swing.styling.JSimpleStyleDialog;
54 import org.opengis.feature.simple.SimpleFeatureType;
55 import org.opengis.filter.FilterFactory;
56
57 import java.awt.*;
58 import java.io.File;
59
60 public class StyleLab {
61
62 static StyleFactory styleFactory = CommonFactoryFinder.getStyleFactory();
63 static FilterFactory filterFactory = CommonFactoryFinder.getFilterFactory();
64
65 public static void main(String[] args) throws Exception {
66 StyleLab me = new StyleLab();
67 me.displayShapefile();
68 }
69
70
71
72
73
74
75
76
77
78 private void displayShapefile() throws Exception {
79 File file = JFileDataStoreChooser.showOpenFile("shp", null);
80 if (file == null) {
81 return;
82 }
83
84 FileDataStore store = FileDataStoreFinder.getDataStore(file);
85 FeatureSource featureSource = store.getFeatureSource();
86
87
88 MapContent map = new MapContent();
89 map.setTitle("StyleLab");
90
91
92 Style style = createStyle(file, featureSource);
93
94
95
96 Layer layer = new FeatureLayer(featureSource, style);
97 map.addLayer(layer);
98
99
100 JMapFrame.showMap(map);
101 }
102
103
104
105
106
107
108
109
110
111
112 private Style createStyle(File file, FeatureSource featureSource) {
113 File sld = toSLDFile(file);
114 if (sld != null) {
115 return createFromSLD(sld);
116 }
117
118 SimpleFeatureType schema = (SimpleFeatureType)featureSource.getSchema();
119 return JSimpleStyleDialog.showDialog(null, schema);
120 }
121
122
123
124
125
126
127
128 public File toSLDFile(File file) {
129 String path = file.getAbsolutePath();
130 String base = path.substring(0,path.length()-4);
131 String newPath = base + ".sld";
132 File sld = new File( newPath );
133 if( sld.exists() ){
134 return sld;
135 }
136 newPath = base + ".SLD";
137 sld = new File( newPath );
138 if( sld.exists() ){
139 return sld;
140 }
141 return null;
142 }
143
144
145
146
147 private Style createFromSLD(File sld) {
148 try {
149 SLDParser stylereader = new SLDParser(styleFactory, sld.toURI().toURL());
150 Style[] style = stylereader.readXML();
151 return style[0];
152
153 } catch (Exception e) {
154 JExceptionReporter.showDialog(e, "Problem creating style");
155 }
156 return null;
157 }
158
159
160
161
162
163
164
165
166
167
168
169 private Style createStyle2(FeatureSource featureSource) {
170 SimpleFeatureType schema = (SimpleFeatureType)featureSource.getSchema();
171 Class geomType = schema.getGeometryDescriptor().getType().getBinding();
172
173 if (Polygon.class.isAssignableFrom(geomType)
174 || MultiPolygon.class.isAssignableFrom(geomType)) {
175 return createPolygonStyle();
176
177 } else if (LineString.class.isAssignableFrom(geomType)
178 || MultiLineString.class.isAssignableFrom(geomType)) {
179 return createLineStyle();
180
181 } else {
182 return createPointStyle();
183 }
184 }
185
186
187
188
189
190
191
192 private Style createPolygonStyle() {
193
194
195 Stroke stroke = styleFactory.createStroke(
196 filterFactory.literal(Color.BLUE),
197 filterFactory.literal(1),
198 filterFactory.literal(0.5));
199
200
201 Fill fill = styleFactory.createFill(
202 filterFactory.literal(Color.CYAN),
203 filterFactory.literal(0.5));
204
205
206
207
208
209 PolygonSymbolizer sym = styleFactory.createPolygonSymbolizer(stroke, fill, null);
210
211 Rule rule = styleFactory.createRule();
212 rule.symbolizers().add(sym);
213 FeatureTypeStyle fts = styleFactory.createFeatureTypeStyle(new Rule[]{rule});
214 Style style = styleFactory.createStyle();
215 style.featureTypeStyles().add(fts);
216
217 return style;
218 }
219
220
221
222
223 private Style createLineStyle() {
224 Stroke stroke = styleFactory.createStroke(
225 filterFactory.literal(Color.BLUE),
226 filterFactory.literal(1));
227
228
229
230
231
232 LineSymbolizer sym = styleFactory.createLineSymbolizer(stroke, null);
233
234 Rule rule = styleFactory.createRule();
235 rule.symbolizers().add(sym);
236 FeatureTypeStyle fts = styleFactory.createFeatureTypeStyle(new Rule[]{rule});
237 Style style = styleFactory.createStyle();
238 style.featureTypeStyles().add(fts);
239
240 return style;
241 }
242
243
244
245
246
247 private Style createPointStyle() {
248 Graphic gr = styleFactory.createDefaultGraphic();
249
250 Mark mark = styleFactory.getCircleMark();
251
252 mark.setStroke(styleFactory.createStroke(
253 filterFactory.literal(Color.BLUE), filterFactory.literal(1)));
254
255 mark.setFill(styleFactory.createFill(filterFactory.literal(Color.CYAN)));
256
257 gr.graphicalSymbols().clear();
258 gr.graphicalSymbols().add(mark);
259 gr.setSize(filterFactory.literal(5));
260
261
262
263
264
265 PointSymbolizer sym = styleFactory.createPointSymbolizer(gr, null);
266
267 Rule rule = styleFactory.createRule();
268 rule.symbolizers().add(sym);
269 FeatureTypeStyle fts = styleFactory.createFeatureTypeStyle(new Rule[]{rule});
270 Style style = styleFactory.createStyle();
271 style.featureTypeStyles().add(fts);
272
273 return style;
274 }
275
276 }
277
278