内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

geoserverrest導(dǎo)入shape文件錯誤-創(chuàng)新互聯(lián)

使用rest接口導(dǎo)入shp文件時出錯,
java.io.ioexception: current fid index is null, next must be called before write(),
網(wǎng)上找了一下,找到了一篇文章,地址http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E7%9A%84/14090.shtml

成都創(chuàng)新互聯(lián)主要從事成都網(wǎng)站制作、網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)惠來,十載網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575

自己又仔細(xì)研究了一下出錯的地方的源碼,先貼一下在講原因

org.geotools.data.shapefile.dbf.DbaseFileWriter

public String getFieldString(int size, String s) {
            try {
                buffer.replace(0, size, emptyString);
                buffer.setLength(size);
                // international characters must be accounted for so size != length.
                int maxSize = size;
                if (s != null) {
                    buffer.replace(0, size, s);
                    int currentBytes =
                            s.substring(0, Math.min(size, s.length()))
                                    .getBytes(charset.name())
                                    .length;
                    if (currentBytes > size) {
                        char[] c = new char[1];
                        for (int index = size - 1; currentBytes > size; index--) {
                            c[0] = buffer.charAt(index);
                            String string = new String(c);
                            buffer.deleteCharAt(index);
                            currentBytes -= string.getBytes().length;
                            maxSize--;
                        }
                    } else {
                        if (s.length() < size) {
                            maxSize = size - (currentBytes - s.length());
                            for (int i = s.length(); i < size; i++) {
                                buffer.append(' ');
                            }
                        }
                    }
                }

                buffer.setLength(maxSize);

                return buffer.toString();
            } catch (UnsupportedEncodingException e) {
                throw new RuntimeException("This error should never occurr", e);
            }
        }

以下是個人分析,可能有不對的地方,見諒:
主要原因是有中文字符引起的
dbf文件中是按字節(jié)存儲的,而一個漢字,GBK是2個字節(jié),UTF-8是三個字節(jié),StringBuffer 里的charAt是按字符算的,geoserver rest上傳文件的過程,不是直接按字節(jié)保存的,而是讀取shape的全部內(nèi)容,包括dbf,然后再寫入到一個新的shape文件中。

如果遇到String類型的屬性,會調(diào)用 getFieldString(int size,String s)方法,截取掉多余的字節(jié),下面舉一個真實的例子,size 20,s是"福建省福州市羅源縣",UTF-8編碼轉(zhuǎn)換為字節(jié)是27,27大于字段長度20,需要截取出前20個字符來。
但是方法內(nèi)部是用的從末尾刪除的方法,具體看下面圖片。
geoserver rest 導(dǎo)入shape文件錯誤

大家可以仔細(xì)研究一下代碼,總結(jié)一下:
如果是UTF-8編碼,則字段長度必須設(shè)計為value長度的3倍
如果是GBK邊框,則字段長度必須設(shè)計為value長度的2倍
,否則的話如果存儲的中文字段getBytes之后超過字段的length,則會報錯。

java.lang.StringIndexOutOfBoundsException: String index out of range: 19

不知道修改下代碼,強(qiáng)行把多余的字符寫入到dbf文件中是否會報錯,因為這個本來就是存儲在dbf文件中的,但是是從其他軟件中導(dǎo)出的,不是用geotools生成的。

如果哪位大神知道,請留言解釋一下。

自己想了個解決方案
在調(diào)用rest接口之前,把dbf文件重寫一遍,定義字段的時候,字段長度定義為原來的3倍,這樣geoserver在遇見中文的時候就不會報錯了。

貼一下簡單的代碼

<dependency>
        <groupId>com.github.albfernandez</groupId>
        <artifactId>javadbf</artifactId>
        <version>1.9.2</version>
 </dependency>
public static void changeStringLength(String dbfName, String dbfCharest, String ndbfName,
      String newCharset)
      throws Exception {

    try (DBFReader reader = new DBFReader(
        new FileInputStream(dbfName), Charset.forName(dbfCharest));
        DBFWriter writer = new DBFWriter(new FileOutputStream(ndbfName),
            Charset.forName(newCharset))
    ) {

      int numberOfFields = reader.getFieldCount();

      //改變字符串字段的長度
      List<DBFField> fields = Lists.newArrayList();

      for (int i = 0; i < numberOfFields; i++) {
        DBFField field = reader.getField(i);
        //處理字段字符串字段  乘以3,為了適應(yīng)UTF8是3個字節(jié)的問題
        if (field.getType().equals(DBFDataType.CHARACTER) || field.getType()
            .equals(DBFDataType.VARCHAR)) {
          int maxLength = field.getLength() * 3;
          if (maxLength > field.getType().getMaxSize()) {
            maxLength = field.getType().getMaxSize();
          }
          field.setLength(maxLength);
        }
        fields.add(field);
      }

      //設(shè)置新文件的頭
     writer.setFields(fields.toArray(new DBFField[fields.size()]));

      Object[] rowObjects;

     while ((rowObjects = reader.nextRecord()) != null) {
       writer.addRecord(rowObjects);
      }

    }

  }

通過以上方案暫時解決了中文字符過長的問題,但是不知道會不會觸發(fā)其他的bug。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

本文標(biāo)題:geoserverrest導(dǎo)入shape文件錯誤-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://www.rwnh.cn/article10/poogo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站Google、品牌網(wǎng)站制作營銷型網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)
正定县| 丘北县| 盐亭县| 普兰店市| 桂林市| 海丰县| 灵石县| 富蕴县| 拉萨市| 浦东新区| 新宁县| 深圳市| 三台县| 黄山市| 兴化市| 莫力| 韩城市| 宾川县| 井冈山市| 元朗区| 曲沃县| 霍山县| 微山县| 日喀则市| 墨脱县| 古交市| 保山市| 沈丘县| 金华市| 扬中市| 女性| 鄯善县| 福州市| 肃南| 滦南县| 德庆县| 北川| 宿迁市| 玛多县| 油尖旺区| 延川县|