/[schmitzm]/branches/2.0-RC1/src/skrueger/geotools/labelsearch/LabelSearch.java
ViewVC logotype

Annotation of /branches/2.0-RC1/src/skrueger/geotools/labelsearch/LabelSearch.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 417 - (hide annotations)
Fri Sep 25 16:34:10 2009 UTC (15 years, 5 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: 7110 byte(s)
* AV-Feature: Search button only appears if there are labels to search in the map
* AV-Feature: "Beautified" the AtlasMapView a bit.. less lines.. smoother text rendering..

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 alfonx 417 final List<TextSymbolizer> allTS = StylingUtil.getVisibleTextSymbolizers(ml
122 alfonx 139 .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 alfonx 417
129 alfonx 335 final FeatureSource<SimpleFeatureType, SimpleFeature> featureSource = (FeatureSource<SimpleFeatureType, SimpleFeature>) ml.getFeatureSource();
130    
131     final String typeName = featureSource.getSchema()
132     .getName().getLocalPart();
133 alfonx 139
134     // Expression labelExp = ts.getLabel();
135     // ff.like(labelExp, "*"+searchMe+"*");
136     // FeatureCollection features =
137     // ml.getFeatureSource().getFeatures(
138     // new DefaultQuery(typeName, ff.like(labelExp,
139     // "*"+searchMe+"*"), properties));
140    
141 alfonx 335 final FeatureCollection<SimpleFeatureType, SimpleFeature> features = featureSource.getFeatures(
142 alfonx 139 new DefaultQuery(typeName, Filter.INCLUDE));
143    
144     // new MemoryDataStore().getFeatureSource(typeName)
145    
146     /**
147     * We do the comparison NOT with a ff.like, because that doesn't
148     * support case insensitivity and i don't find a lower or UPPER
149     * function.
150     */
151 alfonx 318 final Iterator<SimpleFeature> fi = features.iterator();
152 alfonx 139 while (fi.hasNext()) {
153 alfonx 318 final SimpleFeature f = fi.next();
154 alfonx 139
155     final TextSymbolizer ts = StylingUtil.getTextSymbolizer(ml
156     .getStyle(), f);
157     if (ts == null)
158     continue;
159    
160 alfonx 417 // TODO Evaluate the Rule that belongs to the TextSymbolizer against the feature...
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