/[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 894 - (show annotations)
Fri Jun 4 09:19:07 2010 UTC (14 years, 8 months ago) by alfonx
File size: 10240 byte(s)
New mehtod with test in GTUtil

initEPSG() does 
A) trigger the initilaiziation of the EPSG database
B) which may block the thread fro some time, but ensures that later the app runs smoother
C) add unoffical  EPSG codes to GT which are defined in schmitzm/geotools/epsg.properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26