先把对应的中文excel表格整理成txt文本,存储在4-4.txt中。格式形式:中文名称#kind。注:可以直接读取excel表内容,因为原有的excel表格中内容比较复杂,还有其他信息,所以我单独整理出来。
使用程序读取4-4.txt文本,把内容存储成key=val形式
使用程序读取BL.shp文件,添加name字段,循环遍历shape属性,根据kind字段获取2中的中文name,并且存储BL.shpe。
四、Python脚本实现
安装arcgis10.2软件
安装开发工具:pycharm
编写python脚本:执行脚本的python版本必须是arcgis中的python,可以在pycharm中配置能。
python的实现方式在这里我就不赘述,主要是介绍使用java的geotools方式实现。
五、GeoTools实现方式
Java第三方库GeoTools可以操作shape文件,落地实现思路:
使用GeoTools包操作shape文件
前端使用JavaFX框架做简单页面
最终打包成exe文件
5.1 引入GeoTools
在pom.xml中引入geotools相关jar包
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<geotools.version>20.3</geotools.version>
</properties>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-shapefile</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-api</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-geojson</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-geometry</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-jts-wrapper</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-main</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-opengis</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-data</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-referencing</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-swing</artifactId>
<version>${geotools.version}</version>
</dependency>
5.2 读取shape文件
读取shape中属性列表,下边是主要代码:
//源shape文件
ShapefileDataStore shapeDS = (ShapefileDataStore) new ShapefileDataStoreFactory().createDataStore(new File(srcfilepath).toURI().toURL())
// 设置属性
SimpleFeatureSource fs = shapeDS.getFeatureSource(shapeDS.getTypeNames()[0])
SimpleFeatureType schema = fs.getSchema()
List<AttributeDescriptor> attributeDescriptors = schema.getAttributeDescriptors()
5.3 构建输出shape文件
根据原shape构建新的shape文件,原来shape中投影、编码集、属性字段都一样,只是新增name属性字段,主要代码如下:
FileDataStoreFactorySpi factory = new ShapefileDataStoreFactory()
params.put(ShapefileDataStoreFactory.URLP.key, new File(destfilepath).toURI().toURL())
ShapefileDataStore ds = (ShapefileDataStore) factory.createNewDataStore(params)
ds.setCharset(Charset.forName("GBK"))
// 设置属性
SimpleFeatureSource fs = shapeDS.getFeatureSource(shapeDS.getTypeNames()[0])
SimpleFeatureType schema = fs.getSchema()
List<AttributeDescriptor> attributeDescriptors = schema.getAttributeDescriptors()
SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder()
CoordinateReferenceSystem coordinateReferenceSystem = schema.getCoordinateReferenceSystem()
tb.setCRS(coordinateReferenceSystem)
tb.setName(schema.getName())
for (AttributeDescriptor attributeDescriptor : attributeDescriptors) {
String localName = attributeDescriptor.getLocalName()
AttributeType type = attributeDescriptor.getType()
String fieldName = attributeDescriptor.getName().toString()
if (fieldName == "the_geom") {
tb.add("the_geom", schema.getGeometryDescriptor().getType().getBinding())
}else{
int length = (int) ((LiteralExpressionImpl)((IsLessThenOrEqualToImpl)attributeDescriptor.getType().getRestrictions().get(0)).getExpression2()).getValue()
tb.length(length)
tb.add(localName, type.getBinding())
tb.length(128)
tb.add("NAME", String.class)
ds.createSchema(tb.buildFeatureType())
5.4 写入字段信息
根据kind字段关联出来name信息,存储shape中
//写记录
SimpleFeatureIterator it = fs.getFeatures().features()
//设置writer
FeatureWriter<SimpleFeatureType, SimpleFeature> writer = ds.getFeatureWriter(ds.getTypeNames()[0], Transaction.AUTO_COMMIT)
try {
while (it.hasNext()) {
SimpleFeature f = it.next()
SimpleFeature fNew = writer.next()
List arrList = f.getAttributes()
String kind = (String) f.getAttribute("Kind")
String kindstr = kind.split("\|")[0]
String kindName = dictName.get(kindstr)
arrList.add(kindName)
fNew.setAttributes(arrList)
writer.write()
} catch (IOException e) {
e.printStackTrace()
} finally {
it.close()
writer.close()
ds.dispose()
shapeDS.dispose()
六、遇到的问题
6.1 中文乱码
问题:最终得到的shape中,属性是中文的乱码
解决:因为geotools读取shape时默认编码为 ISO-8859-1
,需要设置为GBK
,如下设置:
ds.setCharset(Charset.forName("GBK"));
6.2 shape文件过大
问题:在开发过程中,读取原有的shape,保存为新的shape时,新shape文件超级大,例如:原有的shape(所有关联文件)是1G,新shape达到了10G
解决:这是应为在构建新shape时,属性字段没有设置长度,而且所有的属性字段都是String字符串形式,这样默认长度是255,导致文件存储过大。构建时设置字段长度,设置成原有字段的长度,新字段name设置固定长度。
int length = (int) ((LiteralExpressionImpl)((IsLessThenOrEqualToImpl)attributeDescriptor.getType().getRestrictions().get(0)).getExpression2()).getValue();
tb.length(length);
tb.add(localName, type.getBinding());
tb.length(128);
tb.add("NAME", String.class);
七、最终效果
7.1 主要界面
7.2 执行效果
八、工程源码
下载地址:download.csdn.net/download/ji…