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

Annotation of /trunk/src/skrueger/geotools/labelsearch/LabelSearch.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 341 - (hide annotations)
Mon Aug 31 10:16:40 2009 UTC (15 years, 6 months ago) by alfonx
Original Path: branches/1.0-gt2-2.6/src/skrueger/geotools/labelsearch/LabelSearch.java
File MIME type: text/plain
File size: 7025 byte(s)
Migrating to GT2.6... only 46 compile errors left...
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 alfonx 139 package skrueger.geotools.labelsearch;
31    
32     import java.io.IOException;
33     import java.util.ArrayList;
34     import java.util.Collections;
35     import java.util.Iterator;
36     import java.util.List;
37     import java.util.Locale;
38    
39     import org.apache.log4j.Logger;
40     import org.geotools.data.DefaultQuery;
41 alfonx 335 import org.geotools.data.FeatureSource;
42 alfonx 139 import org.geotools.feature.FeatureCollection;
43     import org.geotools.map.MapLayer;
44     import org.geotools.styling.Style;
45     import org.geotools.styling.TextSymbolizer;
46 mojays 325 import org.opengis.feature.simple.SimpleFeature;
47     import org.opengis.feature.simple.SimpleFeatureType;
48 alfonx 332 import org.opengis.feature.type.AttributeDescriptor;
49 alfonx 139 import org.opengis.filter.Filter;
50     import org.opengis.filter.expression.Expression;
51     import org.opengis.filter.expression.PropertyName;
52    
53     import schmitzm.geotools.styling.StylingUtil;
54     import schmitzm.lang.LangUtil;
55     import schmitzm.lang.ResourceProvider;
56    
57     /**
58     * 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
60     * attribute. This field is then searched for every feature.
61     *
62     * @author Stefan A. Krüger
63     *
64     */
65     public class LabelSearch {
66     final static private Logger LOGGER = Logger.getLogger(LabelSearch.class);
67    
68     public static ResourceProvider RESOURCE = new ResourceProvider(LangUtil
69     .extendPackagePath(LabelSearch.class,
70     "labelsearch"), Locale.ENGLISH);
71    
72    
73    
74    
75     public static String R(String key, Object... values) {
76     return RESOURCE.getString(key, values);
77     }
78    
79     protected final schmitzm.geotools.gui.JMapPane mapPane;
80    
81     public LabelSearch(final schmitzm.geotools.gui.JMapPane mapPane) {
82     this.mapPane = mapPane;
83     }
84    
85 alfonx 335 /**
86     * The Attribute that provides the labels for this text symbolizer.
87     */
88 alfonx 332 private AttributeDescriptor getLabelAttribute(final TextSymbolizer ts,
89 alfonx 318 final SimpleFeatureType schema) {
90 alfonx 139 if (ts == null) {
91     // This layer has no labels
92     return null;
93     }
94 alfonx 335
95 alfonx 139 final Expression labelExp = ts.getLabel();
96     if (labelExp instanceof PropertyName) {
97     final PropertyName pn = (PropertyName) labelExp;
98     final String propertyName = pn.getPropertyName();
99 alfonx 335 return schema.getDescriptor(propertyName);
100 alfonx 139 } else {
101     // When does this happen
102 alfonx 335 throw new RuntimeException("labelExp "+labelExp+" IS NOT instanceof PropertyName!");
103 alfonx 139 }
104    
105     }
106    
107     public List<SearchResult> search(final String string) {
108    
109     final String searchMe = string.toLowerCase();
110    
111     final ArrayList<SearchResult> hits = new ArrayList<SearchResult>();
112    
113     for (final MapLayer ml : mapPane.getContext().getLayers()) {
114     try {
115    
116     // System.out.println("layer = "+ml.getTitle());
117    
118     if (!ml.isVisible())
119     continue;
120    
121     final List<TextSymbolizer> allTS = StylingUtil.getTextSymbolizers(ml
122     .getStyle());
123     if (allTS.size() == 0) {
124     // A layer without any TextSymbolizer doesn't have to be
125     // searched any more.
126     continue;
127     }
128    
129 alfonx 335 // 26 CAST!
130     final FeatureSource<SimpleFeatureType, SimpleFeature> featureSource = (FeatureSource<SimpleFeatureType, SimpleFeature>) ml.getFeatureSource();
131    
132     final String typeName = featureSource.getSchema()
133     .getName().getLocalPart();
134 alfonx 139
135     // Expression labelExp = ts.getLabel();
136     // ff.like(labelExp, "*"+searchMe+"*");
137     // FeatureCollection features =
138     // ml.getFeatureSource().getFeatures(
139     // new DefaultQuery(typeName, ff.like(labelExp,
140     // "*"+searchMe+"*"), properties));
141    
142 alfonx 335 final FeatureCollection<SimpleFeatureType, SimpleFeature> features = featureSource.getFeatures(
143 alfonx 139 new DefaultQuery(typeName, Filter.INCLUDE));
144    
145     // new MemoryDataStore().getFeatureSource(typeName)
146    
147     /**
148     * We do the comparison NOT with a ff.like, because that doesn't
149     * support case insensitivity and i don't find a lower or UPPER
150     * function.
151     */
152 alfonx 318 final Iterator<SimpleFeature> fi = features.iterator();
153 alfonx 139 while (fi.hasNext()) {
154 alfonx 318 final SimpleFeature f = fi.next();
155 alfonx 139
156     final TextSymbolizer ts = StylingUtil.getTextSymbolizer(ml
157     .getStyle(), f);
158     if (ts == null)
159     continue;
160    
161 alfonx 335 final AttributeDescriptor labelAttribute = getLabelAttribute(ts, featureSource.getSchema());
162 alfonx 139
163     if (labelAttribute == null) {
164     continue;
165     }
166    
167     // System.out.println("labelAttrib local name" +
168     // labelAttribute.getLocalName());
169    
170     final Object value = f
171     .getAttribute(labelAttribute.getLocalName());
172    
173     // System.out.println("labelAttrib value " + value);
174    
175     if (value == null) {
176     LOGGER.info("Skipping f: getLocalName() is null for feature="+f);
177     continue;
178     }
179    
180     /**
181     * LabelString ist z.B. "IMPETUS pluviograph". Suchwort
182     * "plu" soll treffen. Also wird nach spaces zerlegt und
183     * dann gesucht
184     */
185     final String labelString = value.toString().toLowerCase();
186     if (labelString.startsWith(searchMe)) {
187     hits.add(createSearchResult(f, value.toString(), ml
188 alfonx 153 .getTitle(),ml));
189 alfonx 139 } else {
190     final String[] parts = labelString.trim().split(" ");
191     for (final String part : parts) {
192     if (part.startsWith(searchMe)) {
193     hits.add(createSearchResult(f, value.toString(), ml
194 alfonx 153 .getTitle(), ml));
195 alfonx 139 break;
196     }
197     }
198     }
199    
200     }
201    
202     } catch (final IOException e) {
203     // Searching this layer failed
204     LOGGER.error(e);
205     }
206     } // next layer
207    
208     // Hits from the top-most layer should appear first.
209     Collections.reverse(hits);
210    
211     return hits;
212     }
213    
214 alfonx 318 protected SearchResult createSearchResult(final SimpleFeature f, final String title,
215 alfonx 153 final String inTitle, MapLayer ml) {
216     return new SearchResultFeature(f, title, inTitle, mapPane, ml);
217 alfonx 139 }
218    
219     }

Properties

Name Value
svn:eol-style native
svn:keywords Id
svn:mime-type text/plain

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26