/[schmitzm]/branches/1.0-gt2-2.6/src/skrueger/geotools/StyledFS.java
ViewVC logotype

Annotation of /branches/1.0-gt2-2.6/src/skrueger/geotools/StyledFS.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 464 - (hide annotations)
Tue Oct 13 13:22:31 2009 UTC (15 years, 4 months ago) by alfonx
File size: 8669 byte(s)
* Changed AttributeMetadata and AttributeMetadataMap. It's not based on the attributes colIdx any more, but on the geotools.feature.type.Name. All the XML read/write methods have been adapted. 
This change was needed, as some users tend to change the DBF structure after the shapefile has been imported. Now columns can be moved, inserted and deleted. Just click "reload atlas" in Geopublisher after you changed the table schema. Geopublisher doesn't have to be closed.
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     * 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 alfonx 426 import org.geotools.data.store.EmptyFeatureCollection;
45 alfonx 244 import org.geotools.feature.FeatureCollection;
46     import org.geotools.styling.Style;
47 alfonx 336 import org.opengis.feature.simple.SimpleFeature;
48     import org.opengis.feature.simple.SimpleFeatureType;
49 alfonx 332 import org.opengis.feature.type.AttributeDescriptor;
50 alfonx 426 import org.opengis.filter.Filter;
51 alfonx 244 import org.opengis.referencing.crs.CoordinateReferenceSystem;
52    
53 alfonx 454 import schmitzm.geotools.io.GeoImportUtil;
54 alfonx 244 import schmitzm.geotools.styling.StylingUtil;
55 alfonx 464 import skrueger.AttributeMetadata;
56 alfonx 244 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 alfonx 336 private final FeatureSource<SimpleFeatureType, SimpleFeature> fs;
70 alfonx 244
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 alfonx 420 private AttributeMetadataMap map;
86 alfonx 244
87 alfonx 426 private Filter filter = Filter.INCLUDE;
88    
89 alfonx 244 /**
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 alfonx 426 public StyledFS(FeatureSource<SimpleFeatureType, SimpleFeature> fs,
101     File sldFile) {
102 alfonx 244
103     this.fs = fs;
104     id = StyledFS.class.getSimpleName()
105     + new Random(new Date().getTime()).nextInt(10000000);
106    
107     this.sldFile = sldFile;
108    
109 alfonx 336 if (sldFile != null && sldFile.exists()) {
110 alfonx 244 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 alfonx 426 desc = new Translation();
121 alfonx 244
122 alfonx 426 if (sldFile != null) {
123     title.fromOneLine(sldFile.getName());
124     desc.fromOneLine(sldFile.getAbsolutePath());
125     }
126    
127 alfonx 244 }
128    
129 alfonx 426 public StyledFS(FeatureSource<SimpleFeatureType, SimpleFeature> fs) {
130     this(fs, null);
131     }
132    
133 alfonx 244 public void dispose() {
134     }
135    
136     /**
137 alfonx 336 * Returns human readable {@link String} of the CRS natively used by this
138 alfonx 244 * {@link DpLayer}
139     *
140 alfonx 336 * If CRS == null, it will call {@link #getGeoObject()}
141 alfonx 244 *
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 alfonx 454 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 alfonx 244 }
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 alfonx 336 public FeatureSource<SimpleFeatureType, SimpleFeature> getGeoObject() {
173 alfonx 244 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 alfonx 420 public AttributeMetadataMap getAttributeMetaDataMap() {
246 alfonx 244 if (map == null) {
247    
248 alfonx 420 map = new AttributeMetadataMap();
249 alfonx 244
250     // Leaving out the first one, it will be the_geom
251     for (int i = 1; i < fs.getSchema().getAttributeCount(); i++) {
252 alfonx 464 AttributeDescriptor attDesc = fs.getSchema().getDescriptor(i);
253 alfonx 244
254 alfonx 464 AttributeMetadata attMetaData = new AttributeMetadata(attDesc.getName());
255     map.put(attDesc.getName(), attMetaData);
256 alfonx 244 }
257     }
258     return map;
259     }
260    
261     /**
262     * @return The {@link File} where the SLD was loaded from or
263 alfonx 426 * <code>null</code> if there didn't exist a {@link File}.
264 alfonx 244 *
265     * @author <a href="mailto:[email protected]">Stefan Alfons
266     * Kr&uuml;ger</a>
267     */
268     public File getSldFile() {
269     return sldFile;
270     }
271    
272     public void setSldFile(File sldFile) {
273     this.sldFile = sldFile;
274     }
275    
276     /**
277     * Returns the features of the {@link FeatureSource}.
278     *
279     * @see {@link StyledFeaturesInterface}
280     */
281     @Override
282 alfonx 447 public FeatureCollection<SimpleFeatureType, SimpleFeature> getFeatureCollection() {
283     FeatureCollection<SimpleFeatureType, SimpleFeature> features;
284 alfonx 244 try {
285     features = getGeoObject().getFeatures();
286     } catch (IOException e) {
287     throw new RuntimeException(
288     "Error getting the features of the FeatureSource");
289     }
290     return features;
291     }
292    
293     /**
294     * Same as {@link #getGeoObject()} method, but complies to the
295     * {@link StyledFeaturesInterface}
296     *
297     * @see {@link StyledFeaturesInterface}
298     */
299     @Override
300 alfonx 426 public FeatureSource<SimpleFeatureType, SimpleFeature> getFeatureSource() {
301 alfonx 244 return getGeoObject();
302     }
303    
304 alfonx 426 @Override
305     public FeatureCollection<SimpleFeatureType, SimpleFeature> getFeatureCollectionFiltered() {
306     final FeatureCollection<SimpleFeatureType, SimpleFeature> fc = getFeatureCollection();
307     if (filter == Filter.EXCLUDE)
308     return new EmptyFeatureCollection(fc.getSchema());
309     if (filter == Filter.INCLUDE)
310     return fc;
311     return fc.subCollection(filter);
312     }
313    
314     @Override
315     public Filter getFilter() {
316     return filter;
317     }
318    
319     @Override
320     public void setFilter(Filter filter) {
321     this.filter = filter;
322     }
323    
324     @Override
325     public SimpleFeatureType getSchema() {
326     return getGeoObject().getSchema();
327     }
328    
329 alfonx 244 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26