解决GeoTools中CQL解析中文字段名的问题
GeoTools中CQL無法解析中文字段名的過濾條件,會報異常錯誤,經過一個下午的努力,終于通過簡單有效的方式解決啦
String filterCondition = "temp='" + gbCodeString + "'"; //使用臨時英文字段名temp作為字段名,若為中文字段名則無法正確創建Filter
??Filter filter =ECQL.toFilter(filterCondition); //創建Filter
??//解決字段名為中文的情況
??FilterUtil.decodeFilter(filter,fieldName); //用真正的中文字段名fieldName來替換臨時字段名temp
??SimpleFeatureCollection features = source.getFeatures(filter);
?
public class FilterUtil {
?@SuppressWarnings("unchecked")
?public static void decodeFilter(Filter filter,String fieldName)
???throws UnsupportedEncodingException {
???if (filter instanceof IsEqualsToImpl) {
???IsEqualsToImpl impl = (IsEqualsToImpl) filter;
???decodeExpression(impl.getExpression1(),fieldName);
???}
?}
?private static void decodeExpression(Expression exp,String fieldName)
???throws UnsupportedEncodingException {
?
??if (exp instanceof AttributeExpressionImpl)
??{
???AttributeExpressionImpl impl = (AttributeExpressionImpl) exp;
???impl.setPropertyName(fieldName);
??}
?}
}
?
解決問題過程中參考了http://blog.csdn.net/warrenwyf/article/details/5864667中的FilterUtil類,但該類無法直接使用,存在一些問題,且對于一般應用過于繁瑣。
原始類代碼轉載如下:
?
原始FilterUtil類 package?com.gi.engine.util.gt;import?java.io.UnsupportedEncodingException;
import?java.net.URLDecoder;
import?java.net.URLEncoder;
import?java.util.Iterator;
import?org.geotools.filter.AndImpl;
import?org.geotools.filter.IsEqualsToImpl;
import?org.geotools.filter.IsNotEqualToImpl;
import?org.geotools.filter.LikeFilterImpl;
import?org.geotools.filter.LiteralExpressionImpl;
import?org.geotools.filter.NotImpl;
import?org.geotools.filter.OrImpl;
import?org.geotools.filter.text.ecql.ECQL;
import?org.opengis.filter.Filter;
import?org.opengis.filter.expression.Expression;
public?class?FilterUtil?{
????private?static?char?startMark?=?0x02;
????private?static?char?endMark?=?0x03;
????public?static?Filter?whereclauseToFilter(String?where)?{
????????Filter?filter?=?null;
????????try?{
????????????StringBuilder?sb?=?new?StringBuilder();
????????????for?(int?i?=?0,?count?=?where.length();?i?<?count;?i++)?{
????????????????char?c?=?where.charAt(i);
????????????????if?(c?<?256)?{
????????????????????sb.append(c);
????????????????}?else?{
????????????????????String?enc?=?URLEncoder.encode(String.valueOf(c),?"UTF-8");
????????????????????enc?=?enc.replaceAll("\\%",?"");
????????????????????sb.append(startMark?+?enc?+?endMark);
????????????????}
????????????}
????????????String?encode?=?sb.toString();
????????????Filter?f?=?ECQL.toFilter(encode);
????????????decodeFilter(f);
????????????filter?=?f;
????????}?catch?(Exception?ex)?{
????????????ex.printStackTrace();
????????}
????????return?filter;
????}
????@SuppressWarnings("unchecked")
????private?static?void?decodeFilter(Filter?filter)
????????????throws?UnsupportedEncodingException?{
????????if?(filter?instanceof?OrImpl)?{
????????????OrImpl?impl?=?(OrImpl)?filter;
????????????for?(Iterator<Filter>?itr?=?impl.getFilterIterator();?itr.hasNext();)?{
????????????????Filter?f?=?itr.next();
????????????????decodeFilter(f);
????????????}
????????}?else?if?(filter?instanceof?AndImpl)?{
????????????AndImpl?impl?=?(AndImpl)?filter;
????????????for?(Iterator<Filter>?itr?=?impl.getFilterIterator();?itr.hasNext();)?{
????????????????Filter?f?=?itr.next();
????????????????decodeFilter(f);
????????????}
????????}?else?if?(filter?instanceof?NotImpl)?{
????????????NotImpl?impl?=?(NotImpl)?filter;
????????????Filter?f?=?impl.getFilter();
????????????decodeFilter(f);
????????}?else?if?(filter?instanceof?LikeFilterImpl)?{
????????????LikeFilterImpl?impl?=?(LikeFilterImpl)?filter;
????????????String?encode?=?impl.getLiteral();
????????????impl.setLiteral(decodeString(encode));
????????}?else?if?(filter?instanceof?IsEqualsToImpl)?{
????????????IsEqualsToImpl?impl?=?(IsEqualsToImpl)?filter;
????????????decodeExpression(impl.getExpression1());
????????????decodeExpression(impl.getExpression2());
????????}?else?if?(filter?instanceof?IsNotEqualToImpl)?{
????????????IsNotEqualToImpl?impl?=?(IsNotEqualToImpl)?filter;
????????????decodeExpression(impl.getExpression1());
????????????decodeExpression(impl.getExpression2());
????????}
????}
????private?static?void?decodeExpression(Expression?exp)
????????????throws?UnsupportedEncodingException?{
????????if?(exp?instanceof?LiteralExpressionImpl)?{
????????????LiteralExpressionImpl?impl?=?(LiteralExpressionImpl)?exp;
????????????String?encode?=?String.valueOf(impl.getValue());
????????????impl.setValue(decodeString(encode));
????????}
????}
????private?static?String?decodeString(String?encode)
????????????throws?UnsupportedEncodingException?{
????????StringBuilder?sb?=?new?StringBuilder();
????????int?i?=?0,?count?=?encode.length();
????????while?(i?<?count)?{
????????????int?start?=?encode.indexOf(startMark,?i);
????????????if?(start?>=?0)?{
????????????????sb.append(encode.substring(i,?start));
????????????}?else?{
????????????????sb.append(encode.substring(i));
????????????????return?sb.toString();
????????????}
????????????int?end?=?encode.indexOf(endMark,?i);
????????????if?(end?>?0)?{
????????????????i?=?end?+?1;
????????????????String?enc?=?encode.substring(start?+?1,?end);
????????????????StringBuilder?sbEnc?=?new?StringBuilder();
????????????????for?(int?j?=?0,?l?=?enc.length();?j?<?l;?j?+=?2)?{
????????????????????sbEnc.append("%"?+?enc.charAt(j)?+?enc.charAt(j?+?1));
????????????????}
????????????????String?dec?=?URLDecoder.decode(sbEnc.toString(),?"UTF-8");
????????????????sb.append(dec);
????????????}?else?{
????????????????sb.append(encode.substring(i?+?1));
????????????????i?=?count;
????????????}
????????}
????????return?sb.toString();
????}
}
?
本博客聲明:本人的技術探索過程中,得到了國信司南公司支持。今后,本人博客里的所有技術探索成果將歸“無痕客”、“國信司南”和“博客園”三方共同所有,原創作品如需轉載,請注明本博客聲明
?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的解决GeoTools中CQL解析中文字段名的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML简单的自定义属性制作tab切换
- 下一篇: 网络投票轻松实现自动化 - 验证码识别的