geoserver rest 导入shape文件错误

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

自己又仔细研究了一下出错的地方的源码,先贴一下在讲原因

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文件中是按自己存储的,而一个汉字,GBK是2个字节,UTF-8是三个字节,StringBuffer 里的charAt是按字符算的,geoserver rest上传文件的过程,不是直接按字节保存的,而是读取shape的全部内如,包括dbf,然后再写入到一个新的shape文件中。

如果遇到String类型的属性,会调用 getFieldString(int size,String s)方法,截取调多余的字节,下面举一个真实的例子,size 20,s是"福建省福州市罗源县",UTF-8编码转换为字节是27,27大于字段长度20,需要截取出前20个字符来。
但是方法内部是用的从末尾删除的方法,具体看下面图片。

大家可以仔细研究一下代码,总结一下:
如果是UTF-8编码,则字段长度必须设计为value长度的3倍
如果是GBK边框,则字段长度必须设计为value长度的2倍
,否则的话如果存储的中文字段getBytes之后超过字段的length,则会报错。

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

不知道修改下代码,强行把多余的字符写入到dbf文件中是否会报错,因为这个本来就是存储在dbf文件中的,但是是从其他软件中导出的,不是用geotools生成的。

如果哪位大神知道,请留言解释一下。

原文地址:https://blog.51cto.com/luhaiyou/2357647

时间: 2024-10-01 20:47:51

geoserver rest 导入shape文件错误的相关文章

解决Visual Studio 2010 “无法导入以下密钥文件” 错误

错误原文: "错误 1 无法导入以下密钥文件: SamplePlugin.pfx.该密钥文件可能受密码保护.若要更正此问题,请尝试再次导入证书,或手动将证书安装到具有以下密钥容器名称的强名称 CSP: VS_KEY_AB11B965483B8730SamplePlugin" 要解决此问题: 打开Visual Studio 命令提示(2010): 开始->Microsoft Visual Studio 2010->Visual Studio Tools->Visual

通过assets像安卓程序目录中导入数据库文件出现错误的解决办法

错误提示如下,下面的错误信息 08-13 07:36:31.396: W/System.err(9814): java.io.IOException 08-13 07:36:31.416: W/System.err(9814):  at android.content.res.AssetManager.readAsset(Native Method) 08-13 07:36:31.416: W/System.err(9814):  at android.content.res.AssetMana

MYSQL 编码方式 ------导入 .sql 文件 报编码错误

在做计量泵上位机时,利用MYSQL存储数据,建表hisruninfo(计量泵历史运行数据表). 表格式为utf8,查过数据库 格式 同样为utf8 导入该hisruninfo.sql文件时,并没有报错,表能建起来,但是,导入另外一个插入数据的data1.sql文件时,报错--中文字符不能识别. 插入内容并没有错 后来是将data1.sql 另存为.sql 文件时,编码方式该位 utf8  之后就能导入!  导入.sql文件 命令:source

【开发者笔记】利用shp2pgsql将shape文件导入到postgresql中

导入shp文件到postgresql中 1.首先,你需要让shp2pgsql命令可用,百度下载,加入环境变量即可. 下载地址:https://download.osgeo.org/postgis/windows/pg96/ 如图,打开网址,下载目标文件,解压得到如下目录: 将该目录添加到环境变量,然后cmd可运行shp2pgsql即可. 2.命令如下: shp2pgsql -s 3857 -a -W GBK 文件名.shp 命名空间名.表名 | psql -h localhost -U post

[转]MATLAB导入Excel数据错误

今天在向Matlab 2013b中导入office2013 Excel文件时出现了如下图错误: 为此,通过在网上查找发现了解决办法,主要是因为Excel加载项中的" FoxitReader PDF Creator COM Add-in"选项引起的. 因此可以尝试以下解决办法来修改Excel文件加载项: 1.进入到"文件"->"选项": 2.点击"加载项"选项卡: (错误产生就是由于此加载项是活动的.) 3.在当前选项卡下

php导入sql文件

sql php php导入sql文件 基本思路 1.打开sql文件,放入一个变量(字符串类型)当中 2.使用正则替换掉当中的注释("--"与"/**/") 3.使用explode分割成为一个数组并去除每行的空格 4.链接数据库之后使用my_query()执行sql 代码 <?php // +--------------------------------------------------------------------------------------

Oracle导入外部文件

一.使用PL/SQL的导入工具导入excel文件1.打开pl/sql,点击菜单栏中的T00LS->ODBC Imtorper,打开ODBC Importer选项框;2.在Data fromODBC页中选择需要导入的文件的格式,选择ExcelFiles.输入用户名密码.然后点击Connect;3.在跳出的选择工作簿对话框,选择所要导入的Excel文件,点击确定; 在出现的Table/Query中的Import Table中单击表名,可以在下方的ResultPreview中看到所要导入的表格的内容;

Xcode6导入.pch文件(Precompile Prefix Header)

Xcode5中创建一个工程的时候,系统会自动创建一个以以工程名为名字的pch(Precompile Prefix Header)文件,开发的过程中可以将广泛使用的头文件以及宏包含在该文件下,编译器就会自动的将pch文件中的头文件添加到所有的源文件中去,这样在需要使用相关类的时候不需要使用import就可以直接使用头文件中的内容,很大程度上给程序员带来了编程的便利性.但是在Xcode6中去掉Precompile Prefix Header文件. Xcode6去掉Precompile Prefix

java:JSP(JSPWeb.xml的配置,动态和静态导入JSP文件,重定项和请求转发,使用JSP实现数据库的增删改查实例)

1.JSP的配置: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":&qu