/[schmitzm]/trunk/src/skrueger/geotools/StyledFS.java
ViewVC logotype

Contents of /trunk/src/skrueger/geotools/StyledFS.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 454 - (show annotations)
Sun Oct 11 16:12:05 2009 UTC (15 years, 4 months ago) by alfonx
Original Path: branches/1.0-gt2-2.6/src/skrueger/geotools/StyledFS.java
File size: 8660 byte(s)
* Some frickeling in AtlasStyler...
1 /*******************************************************************************
2 * Copyright (c) 2009 Martin O. J. Schmitz.
3 *
4 * This file is part of the SCHMITZM library - a collection of utility
5 * classes based on Java 1.6, focusing (not only) on Java Swing
6 * and the Geotools library.
7 *
8 * The SCHMITZM project is hosted at:
9 * http://wald.intevation.org/projects/schmitzm/
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public License
13 * as published by the Free Software Foundation; either version 3
14 * of the License, or (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public License (license.txt)
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
24 * or try this link: http://www.gnu.org/licenses/lgpl.html
25 *
26 * Contributors:
27 * Martin O. J. Schmitz - initial API and implementation
28 * Stefan A. Krüger - additional utility classes
29 ******************************************************************************/
30 package skrueger.geotools;
31
32 import java.io.File;
33 import java.io.FileNotFoundException;
34 import java.io.IOException;
35 import java.net.URL;
36 import java.util.Date;
37 import java.util.Random;
38
39 import javax.swing.ImageIcon;
40 import javax.swing.JPanel;
41
42 import org.apache.log4j.Logger;
43 import org.geotools.data.FeatureSource;
44 import org.geotools.data.store.EmptyFeatureCollection;
45 import org.geotools.feature.FeatureCollection;
46 import org.geotools.styling.Style;
47 import org.opengis.feature.simple.SimpleFeature;
48 import org.opengis.feature.simple.SimpleFeatureType;
49 import org.opengis.feature.type.AttributeDescriptor;
50 import org.opengis.filter.Filter;
51 import org.opengis.referencing.crs.CoordinateReferenceSystem;
52
53 import schmitzm.geotools.io.GeoImportUtil;
54 import schmitzm.geotools.styling.StylingUtil;
55 import skrueger.AttributeMetaData;
56 import skrueger.i8n.Translation;
57
58 import com.vividsolutions.jts.geom.Envelope;
59
60 /**
61 * This class enables a non Atlas context to use the Atlas LayerPanel
62 * {@link JPanel} as a {@link MapContextManagerInterface}
63 *
64 * @author <a href="mailto:[email protected]">Stefan Alfons Kr&uuml;ger</a>
65 */
66 public class StyledFS implements StyledFeatureSourceInterface {
67 private static final Logger LOGGER = Logger.getLogger(StyledFS.class);
68
69 private final FeatureSource<SimpleFeatureType, SimpleFeature> fs;
70
71 /**
72 * A unique ID which identifies the Layer in the Atlas. It's more important
73 * than it should be ;-)
74 */
75 private String id;
76
77 private Style style;
78
79 private Translation title;
80
81 private Translation desc;
82
83 private File sldFile;
84
85 private AttributeMetadataMap map;
86
87 private Filter filter = Filter.INCLUDE;
88
89 /**
90 * This class enables a non Atlas context to use the Atlas LayerPanel
91 * {@link JPanel} as a {@link MapContextManagerInterface}
92 *
93 * @param fs
94 * {@link FeatureSource} that is beeing styled.
95 *
96 * @param sldFile
97 * may be <code>null</code>. Otherwise the SLD {@link File} to
98 * import and associate with this {@link StyledFS}
99 */
100 public StyledFS(FeatureSource<SimpleFeatureType, SimpleFeature> fs,
101 File sldFile) {
102
103 this.fs = fs;
104 id = StyledFS.class.getSimpleName()
105 + new Random(new Date().getTime()).nextInt(10000000);
106
107 this.sldFile = sldFile;
108
109 if (sldFile != null && sldFile.exists()) {
110 try {
111 style = StylingUtil.loadSLD(sldFile)[0];
112 } catch (FileNotFoundException e) {
113 LOGGER
114 .debug("The SLD file passed was empty. Leaving the Style untouched. (We are in the constructor.. so its null");
115 } catch (Exception e) {
116 LOGGER.warn("Reading SLD failed: " + sldFile, e);
117 }
118 }
119 title = new Translation();
120 desc = new Translation();
121
122 if (sldFile != null) {
123 title.fromOneLine(sldFile.getName());
124 desc.fromOneLine(sldFile.getAbsolutePath());
125 }
126
127 }
128
129 public StyledFS(FeatureSource<SimpleFeatureType, SimpleFeature> fs) {
130 this(fs, null);
131 }
132
133 public void dispose() {
134 }
135
136 /**
137 * Returns human readable {@link String} of the CRS natively used by this
138 * {@link DpLayer}
139 *
140 * If CRS == null, it will call {@link #getGeoObject()}
141 *
142 */
143 public String getCRSString() {
144 if (getCrs() == null)
145 return "CRS?";
146
147 return getCrs().getName().getCode();
148 }
149
150 public CoordinateReferenceSystem getCrs() {
151 CoordinateReferenceSystem crs = fs.getSchema().getCoordinateReferenceSystem();
152 if (fs.getSchema().getCoordinateReferenceSystem() == null) {
153 LOGGER.warn("Could not determine the CRS of "+getTitle()+". Using default "+GeoImportUtil.getDefaultCRS());
154 crs = GeoImportUtil.getDefaultCRS();
155 }
156 return crs;
157 }
158
159 public Translation getDesc() {
160 return desc;
161 }
162
163 public Envelope getEnvelope() {
164 try {
165 return fs.getBounds();
166 } catch (IOException e) {
167 e.printStackTrace();
168 return null;
169 }
170 }
171
172 public FeatureSource<SimpleFeatureType, SimpleFeature> getGeoObject() {
173 return fs;
174 }
175
176 public String getId() {
177 return id;
178 }
179
180 public ImageIcon getImageIcon() {
181 return null;
182 }
183
184 public URL getInfoURL() {
185 return null;
186 }
187
188 public Translation getKeywords() {
189 return null;
190 }
191
192 public Style getStyle() {
193 return style;
194 }
195
196 public Translation getTitle() {
197 return title;
198 }
199
200 public boolean isDisposed() {
201 return false;
202 }
203
204 /**
205 * If true, this layer will not be shown in the legend. Default = false
206 */
207 /**
208 *
209 * Killed by SK: 6. April 09: Ein Layer soll nicht generell auf
210 * verstecken/nicht verstecken gestellt werden können. Das sind
211 * Eigenschaften der Karte/MapContext, ebenso wie die Reihenfolge der Layer.
212 * Im Atlas verwaltet deshalb nun die Klasse skrueger.atlas.Map welche Layer
213 * nicht in der Legende auftauchen sollen. Meines Wissens hat keiner bisher
214 * die Funktion genutzt.
215 *
216 * // public boolean isHideInLegend() { // return false; // }
217 */
218
219 public void setDesc(Translation dec) {
220 this.desc = dec;
221 }
222
223 public void setImageIcon(ImageIcon icon) {
224 }
225
226 public void setKeywords(Translation keywords) {
227 }
228
229 public void setStyle(Style style) {
230 this.style = style;
231
232 }
233
234 public void setTitle(Translation title) {
235 this.title = title;
236
237 }
238
239 public void uncache() {
240 }
241
242 /**
243 *
244 */
245 public AttributeMetadataMap getAttributeMetaDataMap() {
246 if (map == null) {
247
248 map = new AttributeMetadataMap();
249
250 // Leaving out the first one, it will be the_geom
251 for (int i = 1; i < fs.getSchema().getAttributeCount(); i++) {
252 AttributeDescriptor att = fs.getSchema().getDescriptor(i);
253
254 AttributeMetaData attMetaData = new AttributeMetaData(i, att
255 .getLocalName());
256 map.put(i, attMetaData);
257 }
258 }
259 return map;
260 }
261
262 /**
263 * @return The {@link File} where the SLD was loaded from or
264 * <code>null</code> if there didn't exist a {@link File}.
265 *
266 * @author <a href="mailto:[email protected]">Stefan Alfons
267 * Kr&uuml;ger</a>
268 */
269 public File getSldFile() {
270 return sldFile;
271 }
272
273 public void setSldFile(File sldFile) {
274 this.sldFile = sldFile;
275 }
276
277 /**
278 * Returns the features of the {@link FeatureSource}.
279 *
280 * @see {@link StyledFeaturesInterface}
281 */
282 @Override
283 public FeatureCollection<SimpleFeatureType, SimpleFeature> getFeatureCollection() {
284 FeatureCollection<SimpleFeatureType, SimpleFeature> features;
285 try {
286 features = getGeoObject().getFeatures();
287 } catch (IOException e) {
288 throw new RuntimeException(
289 "Error getting the features of the FeatureSource");
290 }
291 return features;
292 }
293
294 /**
295 * Same as {@link #getGeoObject()} method, but complies to the
296 * {@link StyledFeaturesInterface}
297 *
298 * @see {@link StyledFeaturesInterface}
299 */
300 @Override
301 public FeatureSource<SimpleFeatureType, SimpleFeature> getFeatureSource() {
302 return getGeoObject();
303 }
304
305 @Override
306 public FeatureCollection<SimpleFeatureType, SimpleFeature> getFeatureCollectionFiltered() {
307 final FeatureCollection<SimpleFeatureType, SimpleFeature> fc = getFeatureCollection();
308 if (filter == Filter.EXCLUDE)
309 return new EmptyFeatureCollection(fc.getSchema());
310 if (filter == Filter.INCLUDE)
311 return fc;
312 return fc.subCollection(filter);
313 }
314
315 @Override
316 public Filter getFilter() {
317 return filter;
318 }
319
320 @Override
321 public void setFilter(Filter filter) {
322 this.filter = filter;
323 }
324
325 @Override
326 public SimpleFeatureType getSchema() {
327 return getGeoObject().getSchema();
328 }
329
330 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26