geoserver rest 导入shape文件错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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生成的。
如果哪位大神知道,请留言解释一下。
以上是关于geoserver rest 导入shape文件错误的主要内容,如果未能解决你的问题,请参考以下文章