/[schmitzm]/branches/2.0-RC2/src/skrueger/geotools/StyledFS.java
ViewVC logotype

Contents of /branches/2.0-RC2/src/skrueger/geotools/StyledFS.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 621 - (show annotations)
Thu Jan 28 10:06:05 2010 UTC (15 years, 1 month ago) by alfonx
File size: 8960 byte(s)
2.0-RC2 ist für die weiterentwicklung und soll bald in den trunk mergen
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 import javax.xml.transform.TransformerException;
42
43 import org.apache.log4j.Logger;
44 import org.geotools.data.FeatureSource;
45 import org.geotools.feature.FeatureCollection;
46 import org.geotools.styling.Style;
47 import org.jfree.util.AttributedStringUtilities;
48 import org.opengis.feature.simple.SimpleFeature;
49 import org.opengis.feature.simple.SimpleFeatureType;
50 import org.opengis.feature.type.AttributeDescriptor;
51 import org.opengis.filter.Filter;
52 import org.opengis.referencing.crs.CoordinateReferenceSystem;
53
54 import schmitzm.geotools.io.GeoImportUtil;
55 import schmitzm.geotools.styling.StylingUtil;
56 import skrueger.AttributeMetadata;
57 import skrueger.i8n.Translation;
58
59 import com.vividsolutions.jts.geom.Envelope;
60
61 /**
62 * This class enables a non Atlas context to use the Atlas LayerPanel
63 * {@link JPanel} as a {@link MapContextManagerInterface}
64 *
65 * @author <a href="mailto:[email protected]">Stefan Alfons Kr&uuml;ger</a>
66 *
67 * TODO Rename to StyledShapefile
68 */
69 public class StyledFS implements StyledFeatureSourceInterface {
70 private static final Logger LOGGER = Logger.getLogger(StyledFS.class);
71
72 private final FeatureSource<SimpleFeatureType, SimpleFeature> fs;
73
74 /** Caching the CRS of the layer **/
75 CoordinateReferenceSystem crs = null;
76
77 /**
78 * A unique ID which identifies the Layer in the Atlas. It's more important
79 * than it should be ;-)
80 */
81 private String id;
82
83 private Style style;
84
85 private Translation title;
86
87 private Translation desc;
88
89 private File sldFile;
90
91 private AttributeMetadataMap map;
92
93 private Filter filter = Filter.INCLUDE;
94
95 /**
96 * This class enables a non Atlas context to use the Atlas LayerPanel
97 * {@link JPanel} as a {@link MapContextManagerInterface}
98 *
99 * @param fs
100 * {@link FeatureSource} that is beeing styled.
101 *
102 * @param sldFile
103 * may be <code>null</code>. Otherwise the SLD {@link File} to
104 * import and associate with this {@link StyledFS}
105 */
106 public StyledFS(FeatureSource<SimpleFeatureType, SimpleFeature> fs,
107 File sldFile) {
108
109 this.fs = fs;
110
111 id = StyledFS.class.getSimpleName()
112 + new Random(new Date().getTime()).nextInt(10000000);
113
114 this.sldFile = sldFile;
115
116 // datei existiert, dann lesen
117 if (sldFile != null && sldFile.exists()) {
118 try {
119 style = StylingUtil.loadSLD(sldFile)[0];
120 } catch (Exception e) {
121 LOGGER.warn("Reading SLD failed: " + sldFile, e);
122 style = null;
123 }
124 }
125
126 title = new Translation();
127 desc = new Translation();
128
129 if (sldFile != null) {
130 title.fromOneLine(sldFile.getName());
131 desc.fromOneLine(sldFile.getAbsolutePath());
132 }
133
134 }
135
136 public StyledFS(FeatureSource<SimpleFeatureType, SimpleFeature> fs) {
137 this(fs, null);
138 }
139
140 public void dispose() {
141 }
142
143 /**
144 * Returns human readable {@link String} of the CRS natively used by this
145 * {@link DpLayer}
146 *
147 * If CRS == null, it will call {@link #getGeoObject()}
148 *
149 */
150 public String getCRSString() {
151 if (getCrs() == null)
152 return "CRS?";
153
154 return getCrs().getName().getCode();
155 }
156
157 public CoordinateReferenceSystem getCrs() {
158 if (crs == null) {
159 crs = fs.getSchema()
160 .getCoordinateReferenceSystem();
161 if (fs.getSchema().getCoordinateReferenceSystem() == null) {
162 LOGGER.warn("Could not determine the CRS of " + getTitle()
163 + ". Using default " + GeoImportUtil.getDefaultCRS());
164 crs = GeoImportUtil.getDefaultCRS();
165 }
166 }
167 return crs;
168 }
169
170 public Translation getDesc() {
171 return desc;
172 }
173
174 public Envelope getEnvelope() {
175 try {
176 return fs.getBounds();
177 } catch (IOException e) {
178 e.printStackTrace();
179 return null;
180 }
181 }
182
183 public FeatureSource<SimpleFeatureType, SimpleFeature> getGeoObject() {
184 return fs;
185 }
186
187 public String getId() {
188 return id;
189 }
190
191 public ImageIcon getImageIcon() {
192 return null;
193 }
194
195 public URL getInfoURL() {
196 return null;
197 }
198
199 public Translation getKeywords() {
200 return null;
201 }
202
203 public Style getStyle() {
204 return style;
205 }
206
207 public Translation getTitle() {
208 return title;
209 }
210
211 public boolean isDisposed() {
212 return false;
213 }
214
215 /**
216 * If true, this layer will not be shown in the legend. Default = false
217 */
218 /**
219 *
220 * Killed by SK: 6. April 09: Ein Layer soll nicht generell auf
221 * verstecken/nicht verstecken gestellt werden können. Das sind
222 * Eigenschaften der Karte/MapContext, ebenso wie die Reihenfolge der Layer.
223 * Im Atlas verwaltet deshalb nun die Klasse skrueger.atlas.Map welche Layer
224 * nicht in der Legende auftauchen sollen. Meines Wissens hat keiner bisher
225 * die Funktion genutzt.
226 *
227 * // public boolean isHideInLegend() { // return false; // }
228 */
229
230 public void setDesc(Translation dec) {
231 this.desc = dec;
232 }
233
234 public void setImageIcon(ImageIcon icon) {
235 }
236
237 public void setKeywords(Translation keywords) {
238 }
239
240 public void setStyle(Style style) {
241 this.style = style;
242
243 }
244
245 public void setTitle(Translation title) {
246 this.title = title;
247
248 }
249
250 public void uncache() {
251 }
252
253 /**
254 *
255 */
256 public AttributeMetadataMap getAttributeMetaDataMap() {
257 if (map == null) {
258
259 map = new AttributeMetadataMap(new String[] { Translation
260 .getActiveLang() });
261
262 // Leaving out the first one, it will be the_geom
263 for (int i = 1; i < fs.getSchema().getAttributeCount(); i++) {
264 AttributeDescriptor attDesc = fs.getSchema().getDescriptor(i);
265
266 AttributeMetadata attMetaData = new AttributeMetadata(attDesc
267 .getName(), map.getLanguages());
268 map.put(attDesc.getName(), attMetaData);
269 }
270 }
271 return map;
272 }
273
274 /**
275 * @return The {@link File} where the SLD was loaded from or
276 * <code>null</code> if there didn't exist a {@link File}.
277 *
278 * @author <a href="mailto:[email protected]">Stefan Alfons
279 * Kr&uuml;ger</a>
280 */
281 public File getSldFile() {
282 return sldFile;
283 }
284
285 public void setSldFile(File sldFile) {
286 this.sldFile = sldFile;
287 }
288
289 /**
290 * Returns the features of the {@link FeatureSource}.
291 *
292 * @see {@link StyledFeaturesInterface}
293 */
294 @Override
295 public FeatureCollection<SimpleFeatureType, SimpleFeature> getFeatureCollection() {
296 FeatureCollection<SimpleFeatureType, SimpleFeature> features;
297 try {
298 features = getGeoObject().getFeatures();
299 } catch (IOException e) {
300 throw new RuntimeException(
301 "Error getting the features of the FeatureSource");
302 }
303 return features;
304 }
305
306 /**
307 * Same as {@link #getGeoObject()} method, but complies to the
308 * {@link StyledFeaturesInterface}
309 *
310 * @see {@link StyledFeaturesInterface}
311 */
312 @Override
313 public FeatureSource<SimpleFeatureType, SimpleFeature> getFeatureSource() {
314 return getGeoObject();
315 }
316
317 @Override
318 public FeatureCollection<SimpleFeatureType, SimpleFeature> getFeatureCollectionFiltered() {
319 // final FeatureCollection<SimpleFeatureType, SimpleFeature> fc =
320 // getFeatureCollection();
321 // if (filter == Filter.EXCLUDE)
322 // return new EmptyFeatureCollection(fc.getSchema());
323 // if (filter == Filter.INCLUDE)
324 // return fc;
325 // return fc.subCollection(filter);
326
327 try {
328 return getFeatureSource().getFeatures(filter);
329 } catch (IOException e) {
330 throw new RuntimeException(e);
331 }
332 }
333
334 @Override
335 public Filter getFilter() {
336 return filter;
337 }
338
339 @Override
340 public void setFilter(Filter filter) {
341 this.filter = filter;
342 }
343
344 @Override
345 public SimpleFeatureType getSchema() {
346 return getGeoObject().getSchema();
347 }
348
349 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26