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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/src/skrueger/geotools/StyledFS.java revision 2 by mojays, Tue Feb 24 22:43:52 2009 UTC branches/2.0-RC1/src/skrueger/geotools/StyledFS.java revision 620 by alfonx, Mon Jan 25 17:46:06 2010 UTC
# Line 1  Line 1 
1  package skrueger.geotools;  /*******************************************************************************
2     * Copyright (c) 2009 Martin O. J. Schmitz.
3  import java.io.File;   *
4  import java.io.FileNotFoundException;   * This file is part of the SCHMITZM library - a collection of utility
5  import java.io.IOException;   * classes based on Java 1.6, focusing (not only) on Java Swing
6  import java.net.URL;   * and the Geotools library.
7  import java.util.Date;   *
8  import java.util.HashMap;   * The SCHMITZM project is hosted at:
9  import java.util.Map;   * http://wald.intevation.org/projects/schmitzm/
10  import java.util.Random;   *
11     * This program is free software; you can redistribute it and/or
12  import javax.swing.ImageIcon;   * modify it under the terms of the GNU Lesser General Public License
13  import javax.swing.JPanel;   * as published by the Free Software Foundation; either version 3
14     * of the License, or (at your option) any later version.
15  import org.apache.log4j.Logger;   *
16  import org.geotools.data.FeatureSource;   * This program is distributed in the hope that it will be useful,
17  import org.geotools.feature.AttributeType;   * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  import org.geotools.styling.Style;   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  import org.opengis.referencing.crs.CoordinateReferenceSystem;   * GNU General Public License for more details.
20     *
21  import schmitzm.geotools.styling.StylingUtil;   * You should have received a copy of the GNU Lesser General Public License (license.txt)
22  import skrueger.AttributeMetaData;   * along with this program; if not, write to the Free Software
23  import skrueger.i8n.Translation;   * 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  import com.vividsolutions.jts.geom.Envelope;   *
26     * Contributors:
27  /**   *     Martin O. J. Schmitz - initial API and implementation
28   * This class enables a non Atlas context to use the Atlas LayerPanel   *     Stefan A. Krüger - additional utility classes
29   * {@link JPanel} as a {@link MapContextManagerInterface}   ******************************************************************************/
30   *  package skrueger.geotools;
31   * @author <a href="mailto:[email protected]">Stefan Alfons Kr&uuml;ger</a>  
32   */  import java.io.File;
33  public class StyledFS implements StyledFeatureSourceInterface {  import java.io.FileNotFoundException;
34          private static final Logger LOGGER = Logger.getLogger(StyledFS.class);  import java.io.IOException;
35    import java.net.URL;
36          private final FeatureSource fs;  import java.util.Date;
37    import java.util.Random;
38          /**  
39           * A unique ID which identifies the Layer in the Atlas. It's more important  import javax.swing.ImageIcon;
40           * than it should be ;-)  import javax.swing.JPanel;
41           */  import javax.xml.transform.TransformerException;
42          private String id;  
43    import org.apache.log4j.Logger;
44          private Style style;  import org.geotools.data.FeatureSource;
45    import org.geotools.feature.FeatureCollection;
46          private Translation title;  import org.geotools.styling.Style;
47    import org.jfree.util.AttributedStringUtilities;
48          private Translation desc;  import org.opengis.feature.simple.SimpleFeature;
49    import org.opengis.feature.simple.SimpleFeatureType;
50          private File sldFile;  import org.opengis.feature.type.AttributeDescriptor;
51    import org.opengis.filter.Filter;
52          private HashMap<Integer, AttributeMetaData> map;  import org.opengis.referencing.crs.CoordinateReferenceSystem;
53    
54          /**  import schmitzm.geotools.io.GeoImportUtil;
55           * This class enables a non Atlas context to use the Atlas LayerPanel  import schmitzm.geotools.styling.StylingUtil;
56           * {@link JPanel} as a {@link MapContextManagerInterface}  import skrueger.AttributeMetadata;
57           *  import skrueger.i8n.Translation;
58           * @param fs  
59           *            {@link FeatureSource} that is beeing styled.  import com.vividsolutions.jts.geom.Envelope;
60           *  
61           * @param sldFile  /**
62           *            may be <code>null</code>. Otherwise the SLD {@link File} to   * This class enables a non Atlas context to use the Atlas LayerPanel
63           *            import and associate with this {@link StyledFS}   * {@link JPanel} as a {@link MapContextManagerInterface}
64           */   *
65          public StyledFS(FeatureSource fs, File sldFile) {   * @author <a href="mailto:[email protected]">Stefan Alfons Kr&uuml;ger</a>
66     *
67                  super();   * TODO Rename to StyledShapefile
68                  this.fs = fs;   */
69                  id = StyledFS.class.getSimpleName()  public class StyledFS implements StyledFeatureSourceInterface {
70                                  + new Random(new Date().getTime()).nextInt(10000000);          private static final Logger LOGGER = Logger.getLogger(StyledFS.class);
71    
72                  this.sldFile = sldFile;          private final FeatureSource<SimpleFeatureType, SimpleFeature> fs;
73            
74                  if ((sldFile != null) && (sldFile.exists())) {          /** Caching the CRS of the layer **/
75                          try {          CoordinateReferenceSystem crs = null;
76                                  style = StylingUtil.loadSLD(sldFile)[0];  
77                          } catch (FileNotFoundException e) {          /**
78                                  LOGGER           * A unique ID which identifies the Layer in the Atlas. It's more important
79                                                  .debug("The SLD file passed was empty. Leaving the Style untouched. (We are in the constructor.. so its null");           * than it should be ;-)
80                          }           */
81                  }          private String id;
82    
83                  title = new Translation();          private Style style;
84                  title.fromOneLine(sldFile.getName());  
85            private Translation title;
86                  desc = new Translation();  
87                  desc.fromOneLine(sldFile.getAbsolutePath());          private Translation desc;
88          }  
89            private File sldFile;
90          public void dispose() {  
91          }          private AttributeMetadataMap map;
92    
93          /**          private Filter filter = Filter.INCLUDE;
94           * Returnes human readable {@link String} of the CRS natively used by this  
95           * {@link DpLayer}          /**
96           *           * This class enables a non Atlas context to use the Atlas LayerPanel
97           * If crs == null, it will call {@link #getGeoObject()}           * {@link JPanel} as a {@link MapContextManagerInterface}
98           *           *
99           */           * @param fs
100          public String getCRSString() {           *            {@link FeatureSource} that is beeing styled.
101                  if (getCrs() == null)           *
102                          return "CRS?";           * @param sldFile
103             *            may be <code>null</code>. Otherwise the SLD {@link File} to
104                  return getCrs().getName().getCode();           *            import and associate with this {@link StyledFS}
105          }           */
106            public StyledFS(FeatureSource<SimpleFeatureType, SimpleFeature> fs,
107          public CoordinateReferenceSystem getCrs() {                          File sldFile) {
108                  return fs.getSchema().getDefaultGeometry().getCoordinateSystem();  
109          }                  this.fs = fs;
110    
111          public Translation getDesc() {                  id = StyledFS.class.getSimpleName()
112                  return desc;                                  + new Random(new Date().getTime()).nextInt(10000000);
113          }  
114                    this.sldFile = sldFile;
115          public Envelope getEnvelope() {  
116                  try {                  // datei existiert, dann lesen
117                          return fs.getBounds();                  if (sldFile != null && sldFile.exists()) {
118                  } catch (IOException e) {                          try {
119                          e.printStackTrace();                                  style = StylingUtil.loadSLD(sldFile)[0];
120                          return null;                          } catch (Exception e) {
121                  }                                  LOGGER.warn("Reading SLD failed: " + sldFile, e);
122          }                                  style = null;
123                            }
124          public FeatureSource getGeoObject() throws Exception {                  }
125                  return fs;  
126          }                  title = new Translation();
127                    desc = new Translation();
128          public String getId() {  
129                  return id;                  if (sldFile != null) {
130          }                          title.fromOneLine(sldFile.getName());
131                            desc.fromOneLine(sldFile.getAbsolutePath());
132          public ImageIcon getImageIcon() {                  }
133                  return null;  
134          }          }
135    
136          public URL getInfoURL() {          public StyledFS(FeatureSource<SimpleFeatureType, SimpleFeature> fs) {
137                  return null;                  this(fs, null);
138          }          }
139    
140          public Translation getKeywords() {          public void dispose() {
141                  return null;          }
142          }  
143            /**
144          public Style getStyle() {           * Returns human readable {@link String} of the CRS natively used by this
145                  return style;           * {@link DpLayer}
146          }           *
147             * If CRS == null, it will call {@link #getGeoObject()}
148          public Translation getTitle() {           *
149                  return title;           */
150          }          public String getCRSString() {
151                    if (getCrs() == null)
152          public boolean isDisposed() {                          return "CRS?";
153                  return false;  
154          }                  return getCrs().getName().getCode();
155            }
156          public boolean isHideInLegend() {  
157                  return false;          public CoordinateReferenceSystem getCrs() {
158          }                  if (crs == null) {
159                            crs = fs.getSchema()
160          public void setDesc(Translation dec) {                                          .getCoordinateReferenceSystem();
161                  this.desc = dec;                          if (fs.getSchema().getCoordinateReferenceSystem() == null) {
162          }                                  LOGGER.warn("Could not determine the CRS of " + getTitle()
163                                                    + ". Using default " + GeoImportUtil.getDefaultCRS());
164          public void setImageIcon(ImageIcon icon) {                                  crs = GeoImportUtil.getDefaultCRS();
165                  // TODO Auto-generated method stub                          }
166                    }
167          }                  return crs;
168            }
169          public void setKeywords(Translation keywords) {  
170          }          public Translation getDesc() {
171                    return desc;
172          public void setStyle(Style style) {          }
173                  this.style = style;  
174            public Envelope getEnvelope() {
175          }                  try {
176                            return fs.getBounds();
177          public void setTitle(Translation title) {                  } catch (IOException e) {
178                  this.title = title;                          e.printStackTrace();
179                            return null;
180          }                  }
181            }
182          public void uncache() {  
183          }          public FeatureSource<SimpleFeatureType, SimpleFeature> getGeoObject() {
184                    return fs;
185          public Map<Integer, AttributeMetaData> getAttributeMetaDataMap() {          }
186                  if (map == null) {  
187                          map = new HashMap<Integer, AttributeMetaData>();          public String getId() {
188                                            return id;
189                          // Leaving out the first one, it will be the_geom          }
190                          for (int i = 1; i < fs.getSchema().getAttributeCount(); i++) {  
191                                  AttributeType att = fs.getSchema().getAttributeType(i);          public ImageIcon getImageIcon() {
192                                                    return null;
193                                  AttributeMetaData attMetaData = new AttributeMetaData(i, att.getLocalName());          }
194                                  map.put(i, attMetaData);  
195                          }          public URL getInfoURL() {
196                  }                  return null;
197                  return map;          }
198          }  
199            public Translation getKeywords() {
200          /**                  return null;
201           * @return The {@link File} where the SLD was loaded from or          }
202           *         <code>null</code> if there didn't exist a {@link File}. (It  
203           *         could be a WFS or a PostGIS          public Style getStyle() {
204           *                  return style;
205           * @author <a href="mailto:[email protected]">Stefan Alfons Kr&uuml;ger</a>          }
206           */  
207          public File getSldFile() {          public Translation getTitle() {
208                  return sldFile;                  return title;
209          }          }
210    
211          public void setSldFile(File sldFile) {          public boolean isDisposed() {
212                  this.sldFile = sldFile;                  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    }

Legend:
Removed from v.2  
changed lines
  Added in v.620

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26