/[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 464 - (show annotations)
Tue Oct 13 13:22:31 2009 UTC (15 years, 4 months ago) by alfonx
Original Path: branches/1.0-gt2-2.6/src/skrueger/geotools/StyledFS.java
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 /*******************************************************************************
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 attDesc = fs.getSchema().getDescriptor(i);
253
254 AttributeMetadata attMetaData = new AttributeMetadata(attDesc.getName());
255 map.put(attDesc.getName(), attMetaData);
256 }
257 }
258 return map;
259 }
260
261 /**
262 * @return The {@link File} where the SLD was loaded from or
263 * <code>null</code> if there didn't exist a {@link File}.
264 *
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 public FeatureCollection<SimpleFeatureType, SimpleFeature> getFeatureCollection() {
283 FeatureCollection<SimpleFeatureType, SimpleFeature> features;
284 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 public FeatureSource<SimpleFeatureType, SimpleFeature> getFeatureSource() {
301 return getGeoObject();
302 }
303
304 @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 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26