日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

解决GeoTools中CQL解析中文字段名的问题

發布時間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解决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解析中文字段名的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。