/[schmitzm]/branches/2.4.x/src/skrueger/geotools/labelsearch/LabelSearch.java
ViewVC logotype

Diff of /branches/2.4.x/src/skrueger/geotools/labelsearch/LabelSearch.java

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

revision 244 by alfonx, Wed Jul 29 09:33:33 2009 UTC revision 886 by alfonx, Thu Jun 3 10:16:07 2010 UTC
# Line 2  Line 2 
2   * Copyright (c) 2009 Martin O. J. Schmitz.   * Copyright (c) 2009 Martin O. J. Schmitz.
3   *   *
4   * This file is part of the SCHMITZM library - a collection of utility   * This file is part of the SCHMITZM library - a collection of utility
5   * classes based on Java 1.6, focussing (not only) on Java Swing   * classes based on Java 1.6, focusing (not only) on Java Swing
6   * and the Geotools library.   * and the Geotools library.
7   *   *
8   * The SCHMITZM project is hosted at:   * The SCHMITZM project is hosted at:
# Line 25  Line 25 
25   *   *
26   * Contributors:   * Contributors:
27   *     Martin O. J. Schmitz - initial API and implementation   *     Martin O. J. Schmitz - initial API and implementation
28   *     Stefan A. Krüger - additional utility classes   *     Stefan A. Tzeggai - additional utility classes
29   ******************************************************************************/   ******************************************************************************/
30  package skrueger.geotools.labelsearch;  package skrueger.geotools.labelsearch;
31    
# Line 34  import java.util.ArrayList; Line 34  import java.util.ArrayList;
34  import java.util.Collections;  import java.util.Collections;
35  import java.util.Iterator;  import java.util.Iterator;
36  import java.util.List;  import java.util.List;
 import java.util.Locale;  
37    
38  import org.apache.log4j.Logger;  import org.apache.log4j.Logger;
39  import org.geotools.data.DefaultQuery;  import org.geotools.data.DefaultQuery;
40  import org.geotools.feature.AttributeType;  import org.geotools.data.FeatureSource;
 import org.geotools.feature.Feature;  
41  import org.geotools.feature.FeatureCollection;  import org.geotools.feature.FeatureCollection;
42  import org.geotools.feature.FeatureType;  import org.geotools.filter.text.cql2.CQL;
43    import org.geotools.filter.text.cql2.CQLException;
44  import org.geotools.map.MapLayer;  import org.geotools.map.MapLayer;
45  import org.geotools.styling.Style;  import org.geotools.styling.Style;
46  import org.geotools.styling.TextSymbolizer;  import org.geotools.styling.TextSymbolizer;
47    import org.opengis.feature.simple.SimpleFeature;
48    import org.opengis.feature.simple.SimpleFeatureType;
49  import org.opengis.filter.Filter;  import org.opengis.filter.Filter;
 import org.opengis.filter.expression.Expression;  
50  import org.opengis.filter.expression.PropertyName;  import org.opengis.filter.expression.PropertyName;
51    
52    import schmitzm.geotools.feature.FeatureUtil;
53    import schmitzm.geotools.gui.GeotoolsGUIUtil;
54  import schmitzm.geotools.styling.StylingUtil;  import schmitzm.geotools.styling.StylingUtil;
55  import schmitzm.lang.LangUtil;  import schmitzm.lang.LangUtil;
 import schmitzm.lang.ResourceProvider;  
56    
57  /**  /**
58   * This class allows to search for a {@link String} in a map. The algorithm will   * This class allows to search for a {@link String} in a map. The algorithm will
59   * analyze the {@link Style} of every visible(?) layer and determine the label   * analyze the {@link Style} of every visible(?) layer and determine the label
60   * attribute. This field is then searched for every feature.   * attribute. This field is then searched for every feature.
61   *   *
62   * @author Stefan A. Krüger   * @author Stefan A. Tzeggai
63   *   *
64   */   */
65  public class LabelSearch {  public class LabelSearch {
66          final static private Logger LOGGER = Logger.getLogger(LabelSearch.class);          final static private Logger LOGGER = Logger.getLogger(LabelSearch.class);
67            
         public static ResourceProvider RESOURCE = new ResourceProvider(LangUtil  
         .extendPackagePath(LabelSearch.class,  
                         "labelsearch"), Locale.ENGLISH);  
           
           
                           
                           
68          public static String R(String key, Object... values) {          public static String R(String key, Object... values) {
69                  return RESOURCE.getString(key, values);                  return GeotoolsGUIUtil.R(key, values);
70          }          }
71    
72          protected final schmitzm.geotools.gui.JMapPane mapPane;          protected final schmitzm.geotools.gui.SelectableXMapPane mapPane;
73    
74          public LabelSearch(final schmitzm.geotools.gui.JMapPane mapPane) {          public LabelSearch(final schmitzm.geotools.gui.SelectableXMapPane mapPane) {
75                  this.mapPane = mapPane;                  this.mapPane = mapPane;
76          }          }
77    
         private AttributeType getLabelAttribute(final TextSymbolizer ts,  
                         final FeatureType schema) {  
                 if (ts == null) {  
                         // This layer has no labels  
                         return null;  
                 }  
                 final Expression labelExp = ts.getLabel();  
                 if (labelExp instanceof PropertyName) {  
                         final PropertyName pn = (PropertyName) labelExp;  
                         final String propertyName = pn.getPropertyName();  
                         return schema.getAttributeType(propertyName);  
                 } else {  
                         // When does this happen  
                 }  
   
                 return null;  
         }  
   
78          public List<SearchResult> search(final String string) {          public List<SearchResult> search(final String string) {
79    
80                  final String searchMe = string.toLowerCase();                  final String searchMe = string.toUpperCase();
81    
82                  final ArrayList<SearchResult> hits = new ArrayList<SearchResult>();                  final ArrayList<SearchResult> hits = new ArrayList<SearchResult>();
83    
84                  for (final MapLayer ml : mapPane.getContext().getLayers()) {                  for (final MapLayer ml : mapPane.getMapContext().getLayers()) {
85                          try {                          try {
86    
87                                  // System.out.println("layer = "+ml.getTitle());                                  // System.out.println("layer = "+ml.getTitle());
# Line 113  public class LabelSearch { Line 89  public class LabelSearch {
89                                  if (!ml.isVisible())                                  if (!ml.isVisible())
90                                          continue;                                          continue;
91    
92                                  final List<TextSymbolizer> allTS = StylingUtil.getTextSymbolizers(ml                                  final List<TextSymbolizer> allTS = StylingUtil
93                                                  .getStyle());                                                  .getVisibleTextSymbolizers(ml.getStyle());
94                                  if (allTS.size() == 0) {                                  if (allTS.size() == 0) {
95                                          // A layer without any TextSymbolizer doesn't have to be                                          // A layer without any TextSymbolizer doesn't have to be
96                                          // searched any more.                                          // searched any more.
97                                          continue;                                          continue;
98                                  }                                  }
99    
100                                  final String typeName = ml.getFeatureSource().getSchema()                                  // We only deal with one TextSymbolizer so far:
101                                                  .getTypeName();                                  TextSymbolizer ts = allTS.get(0);
102    
103                                  // Expression labelExp = ts.getLabel();                                  final FeatureSource<SimpleFeatureType, SimpleFeature> featureSource = (FeatureSource<SimpleFeatureType, SimpleFeature>) ml
104                                  // ff.like(labelExp, "*"+searchMe+"*");                                                  .getFeatureSource();
                                 // FeatureCollection features =  
                                 // ml.getFeatureSource().getFeatures(  
                                 // new DefaultQuery(typeName, ff.like(labelExp,  
                                 // "*"+searchMe+"*"), properties));  
   
                                 final FeatureCollection features = ml.getFeatureSource().getFeatures(  
                                                 new DefaultQuery(typeName, Filter.INCLUDE));  
   
                                 // new MemoryDataStore().getFeatureSource(typeName)  
   
                                 /**  
                                  * We do the comparison NOT with a ff.like, because that doesn't  
                                  * support case insensitivity and i don't find a lower or UPPER  
                                  * function.  
                                  */  
                                 final Iterator<Feature> fi = features.iterator();  
                                 while (fi.hasNext()) {  
                                         final Feature f = fi.next();  
   
                                         final TextSymbolizer ts = StylingUtil.getTextSymbolizer(ml  
                                                         .getStyle(), f);  
                                         if (ts == null)  
                                                 continue;  
105    
106                                          final AttributeType labelAttribute = getLabelAttribute(ts, ml                                  SimpleFeatureType schema = featureSource.getSchema();
                                                         .getFeatureSource().getSchema());  
107    
108                                          if (labelAttribute == null) {                                  final String typeName = schema.getName().getLocalPart();
                                                 continue;  
                                         }  
109    
110                                          // System.out.println("labelAttrib local name" +                                  PropertyName prop1 = StylingUtil.getFirstPropertyName(schema,
111                                          // labelAttribute.getLocalName());                                                  ts);
112                                    PropertyName prop2 = StylingUtil.getSecondPropertyName(schema,
113                                                    ts);
114    
115                                          final Object value = f                                  if (StylingUtil.getFirstPropertyName(schema, ts) == null) {
116                                                          .getAttribute(labelAttribute.getLocalName());                                          // At least one property field we need
117                                            continue;
118                                    }
119    
120                                          // System.out.println("labelAttrib value " + value);                                  Filter searchFilter;
121                                    String[] properties = new String[] { schema.getGeometryDescriptor().getLocalName(), prop1.getPropertyName() };
122                                    // Only one property used...
123    
124                                    searchFilter = CQL.toFilter("strToUpperCase "
125                                                    + prop1.getPropertyName() + " LIKE '%" + searchMe
126                                                    + "%'");
127    
128                                    if (prop2 != null) {
129                                            Filter searchFilter2 = CQL.toFilter("strToUpperCase "
130                                                            + prop2.getPropertyName() + " LIKE '%" + searchMe
131                                                            + "%'");
132    
133                                          if (value == null) {                                          searchFilter = FeatureUtil.FILTER_FACTORY2.or(searchFilter,
134                                                  LOGGER.info("Skipping f: getLocalName() is null for feature="+f);                                                          searchFilter2);
                                                 continue;  
                                         }  
135    
136                                          /**                                          properties = LangUtil.extendArray(properties, prop2
137                                           * LabelString ist z.B. "IMPETUS pluviograph". Suchwort                                                          .getPropertyName());
138                                           * "plu" soll treffen. Also wird nach spaces zerlegt und                                  }
                                          * dann gesucht  
                                          */  
                                         final String labelString = value.toString().toLowerCase();  
                                         if (labelString.startsWith(searchMe)) {  
                                                 hits.add(createSearchResult(f, value.toString(), ml  
                                                                 .getTitle(),ml));  
                                         } else {  
                                                 final String[] parts = labelString.trim().split(" ");  
                                                 for (final String part : parts) {  
                                                         if (part.startsWith(searchMe)) {  
                                                                 hits.add(createSearchResult(f, value.toString(), ml  
                                                                                 .getTitle(), ml));  
                                                                 break;  
                                                         }  
                                                 }  
                                         }  
139    
140                                    // Add the layer's filter if it exists
141                                    Filter layerFilter = ml.getQuery().getFilter();
142                                    if (layerFilter != null && layerFilter != Filter.INCLUDE) {
143                                            searchFilter = FeatureUtil.FILTER_FACTORY2.and(layerFilter,
144                                                            searchFilter);
145                                  }                                  }
146                                    
147    //                              LOGGER.info("Searching for "+searchFilter.toString());
148    
149                                    FeatureCollection<SimpleFeatureType, SimpleFeature> features = (FeatureCollection<SimpleFeatureType, SimpleFeature>) ml
150                                                    .getFeatureSource().getFeatures(
151                                                                    new DefaultQuery(typeName, searchFilter,
152                                                                                    properties));
153    
154                                    final Iterator<SimpleFeature> fi = features.iterator();
155                                    try {
156                                            while (fi.hasNext()) {
157                                                    final SimpleFeature f = fi.next();
158    
159                                                    String valueString = "";
160                                                    valueString = f.getAttribute(prop1.getPropertyName())
161                                                                    .toString();
162    
163                                                    if (prop2 != null) {
164                                                            String valueString2 = f.getAttribute(
165                                                                            prop2.getPropertyName()).toString();
166    
167                                                            if (valueString2 != null && !valueString2.isEmpty())
168                                                                    valueString += ", " + valueString2;
169                                                    }
170    
171                                                    hits.add(createSearchResult(f, valueString, ml
172                                                                    .getTitle(), ml));
173                                            }
174                                    } finally {
175                                            features.close(fi);
176                                    }
177                          } catch (final IOException e) {                          } catch (final IOException e) {
178                                  // Searching this layer failed                                  // Searching this layer failed
179                                  LOGGER.error(e);                                  LOGGER.error("",e);
180                            } catch (CQLException e) {
181                                    LOGGER.error("",e);
182                          }                          }
183                  } // next layer                  } // next layer
184    
# Line 204  public class LabelSearch { Line 188  public class LabelSearch {
188                  return hits;                  return hits;
189          }          }
190    
191          protected SearchResult createSearchResult(final Feature f, final String title,          protected SearchResult createSearchResult(final SimpleFeature f,
192                          final String inTitle, MapLayer ml) {                          final String title, final String inTitle, MapLayer ml) {
193                  return new SearchResultFeature(f, title, inTitle, mapPane, ml);                  return new SearchResultFeature(f, title, inTitle, mapPane, ml);
194          }          }
195    

Legend:
Removed from v.244  
changed lines
  Added in v.886

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26