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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 894 - (hide annotations)
Fri Jun 4 09:19:07 2010 UTC (14 years, 9 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 alfonx 244 /*******************************************************************************
2     * Copyright (c) 2009 Martin O. J. Schmitz.
3     *
4     * This file is part of the SCHMITZM library - a collection of utility
5 alfonx 256 * classes based on Java 1.6, focusing (not only) on Java Swing
6 alfonx 244 * 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 alfonx 862 * Stefan A. Tzeggai - additional utility classes
29 alfonx 244 ******************************************************************************/
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 alfonx 770 import org.geotools.feature.NameImpl;
45 alfonx 244 import org.geotools.styling.Style;
46 alfonx 336 import org.opengis.feature.simple.SimpleFeature;
47     import org.opengis.feature.simple.SimpleFeatureType;
48 alfonx 332 import org.opengis.feature.type.AttributeDescriptor;
49 alfonx 426 import org.opengis.filter.Filter;
50 alfonx 244 import org.opengis.referencing.crs.CoordinateReferenceSystem;
51    
52 alfonx 454 import schmitzm.geotools.io.GeoImportUtil;
53 alfonx 244 import schmitzm.geotools.styling.StylingUtil;
54 alfonx 769 import skrueger.AttributeMetadataImpl;
55 alfonx 244 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 alfonx 888 * @author <a href="mailto:[email protected]">Stefan Alfons Tzeggai</a>
64 alfonx 620 *
65 alfonx 863 * TODO Rename to StyledShapefile
66 alfonx 244 */
67     public class StyledFS implements StyledFeatureSourceInterface {
68     private static final Logger LOGGER = Logger.getLogger(StyledFS.class);
69    
70 alfonx 336 private final FeatureSource<SimpleFeatureType, SimpleFeature> fs;
71 alfonx 863
72 alfonx 620 /** Caching the CRS of the layer **/
73     CoordinateReferenceSystem crs = null;
74 alfonx 244
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 alfonx 863 /** A map of simple attribute names to their meta-data **/
90     private AttributeMetadataMap<AttributeMetadataImpl> map;
91 alfonx 244
92 alfonx 426 private Filter filter = Filter.INCLUDE;
93    
94 alfonx 244 /**
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 alfonx 426 public StyledFS(FeatureSource<SimpleFeatureType, SimpleFeature> fs,
106     File sldFile) {
107 alfonx 244
108     this.fs = fs;
109 alfonx 620
110 alfonx 244 id = StyledFS.class.getSimpleName()
111     + new Random(new Date().getTime()).nextInt(10000000);
112    
113     this.sldFile = sldFile;
114    
115 alfonx 620 // datei existiert, dann lesen
116 alfonx 336 if (sldFile != null && sldFile.exists()) {
117 alfonx 244 try {
118     style = StylingUtil.loadSLD(sldFile)[0];
119     } catch (Exception e) {
120     LOGGER.warn("Reading SLD failed: " + sldFile, e);
121 alfonx 620 style = null;
122 alfonx 244 }
123     }
124 alfonx 620
125 alfonx 244 title = new Translation();
126 alfonx 426 desc = new Translation();
127 alfonx 244
128 alfonx 426 if (sldFile != null) {
129     title.fromOneLine(sldFile.getName());
130     desc.fromOneLine(sldFile.getAbsolutePath());
131     }
132    
133 alfonx 244 }
134    
135 alfonx 426 public StyledFS(FeatureSource<SimpleFeatureType, SimpleFeature> fs) {
136     this(fs, null);
137     }
138    
139 alfonx 244 public void dispose() {
140     }
141    
142     /**
143 alfonx 336 * Returns human readable {@link String} of the CRS natively used by this
144 alfonx 244 * {@link DpLayer}
145     *
146 alfonx 336 * If CRS == null, it will call {@link #getGeoObject()}
147 alfonx 244 *
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 alfonx 620 if (crs == null) {
158 alfonx 863 crs = fs.getSchema().getCoordinateReferenceSystem();
159 alfonx 894 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 alfonx 620 }
171 alfonx 454 }
172     return crs;
173 alfonx 244 }
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 alfonx 336 public FeatureSource<SimpleFeatureType, SimpleFeature> getGeoObject() {
189 alfonx 244 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 alfonx 863 public AttributeMetadataMap<AttributeMetadataImpl> getAttributeMetaDataMap() {
262 alfonx 244 if (map == null) {
263    
264 alfonx 769 map = new AttributeMetadataImplMap();
265 alfonx 244
266 alfonx 863 // // 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 alfonx 244 // Leaving out the first one, it will be the_geom
278     for (int i = 1; i < fs.getSchema().getAttributeCount(); i++) {
279 alfonx 464 AttributeDescriptor attDesc = fs.getSchema().getDescriptor(i);
280 alfonx 244
281 alfonx 863 // 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 alfonx 775 // For Strings we add the "" as NODATA values
290     attMetaData.addNodataValue("");
291     }
292 alfonx 464 map.put(attDesc.getName(), attMetaData);
293 alfonx 244 }
294     }
295     return map;
296     }
297    
298     /**
299     * @return The {@link File} where the SLD was loaded from or
300 alfonx 426 * <code>null</code> if there didn't exist a {@link File}.
301 alfonx 244 *
302 alfonx 894 * @author <a href="mailto:[email protected]">Stefan Alfons Tzeggai</a>
303 alfonx 244 */
304     public File getSldFile() {
305     return sldFile;
306     }
307 alfonx 863
308 alfonx 244 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 alfonx 447 public FeatureCollection<SimpleFeatureType, SimpleFeature> getFeatureCollection() {
319     FeatureCollection<SimpleFeatureType, SimpleFeature> features;
320 alfonx 244 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 alfonx 426 public FeatureSource<SimpleFeatureType, SimpleFeature> getFeatureSource() {
337 alfonx 244 return getGeoObject();
338     }
339    
340 alfonx 426 @Override
341     public FeatureCollection<SimpleFeatureType, SimpleFeature> getFeatureCollectionFiltered() {
342 alfonx 620 // 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 alfonx 607 try {
351     return getFeatureSource().getFeatures(filter);
352     } catch (IOException e) {
353     throw new RuntimeException(e);
354     }
355 alfonx 426 }
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 alfonx 863 /**
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 alfonx 894 *
376 alfonx 863 * @return <code>true</code> is style was loaded
377     */
378     public boolean loadStyle() {
379     if (getSldFile() == null)
380     return false;
381 alfonx 894
382 alfonx 863 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 alfonx 244 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26