pom文件:
<dependencies>
<dependency>
<groupId>nl.cloudfarming.client</groupId>
<artifactId>lib-geotools</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-geojson</artifactId>
<version>18.0</version>
</dependency>
</dependencies>
java代码:
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.data.simple.SimpleFeatureSource;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.type.AttributeType;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.math.BigDecimal;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ShapeToCsv {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
System.out.println(startTime);
System.out.println(shape2Geojson("E:\\jingwei\\china_2000.shp","E:\\csv\\北京.csv"));
long endTime = System.currentTimeMillis();
System.out.println(endTime-startTime);
}
/**
* shp转换为Geojson
* @param shpPath
* @return
*/
public static int shape2Geojson(String shpPath, String csvPath){
int size = 0;
try{
BufferedWriter out =new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvPath),"UTF-8"));
File file = new File(shpPath);
ShapefileDataStore shpDataStore = null;
shpDataStore = new ShapefileDataStore(file.toURL());
// 设置编码,防止中文乱码
shpDataStore.setStringCharset(Charset.forName("utf8"));
String typeName = shpDataStore.getTypeNames()[0];
SimpleFeatureSource featureSource = null;
featureSource = shpDataStore.getFeatureSource (typeName);
SimpleFeatureCollection result = featureSource.getFeatures();
Map<String, Class> mapFields = new HashMap();
List<AttributeType > attributeTypes = result.getSchema().getTypes();
// geometry的类型
String geometryType = result.getSchema().getGeometryDescriptor().getType().getName().toString();
List<String> csvHeader = new ArrayList<>();
for (int i=0;i<attributeTypes.size();i++){
AttributeType attributeType = attributeTypes.get(i);
String key = attributeType.getName().toString();
Class classType = attributeType.getBinding();
if (geometryType.equals(key)){
continue;
}
csvHeader.add(key);
out.write(key + ",");
mapFields.put(key,classType);
}
out.write("coords");
out.newLine();
SimpleFeatureIterator itertor = result.features();
while (itertor.hasNext()) {
SimpleFeature feature = itertor.next();
for(int i=0;i<csvHeader.size();i++){
String key = csvHeader.get(i);
String classType = mapFields.get(key).getTypeName();
String oneCsvData = feature.getAttribute(csvHeader.get(i)).toString();
if (classType.contains("Double")){
BigDecimal bd = new BigDecimal(oneCsvData);
oneCsvData = bd.toPlainString();
}
if(oneCsvData.contains(",")){
oneCsvData = "\"" + oneCsvData + "\"";
}
out.write(oneCsvData);
out.write(",");
}
String coords = feature.getDefaultGeometry().toString();
if(coords.contains(",")){
coords = "\"" + coords + "\"";
}
out.write(coords);
out.newLine();
size++;
}
itertor.close();
out.flush();
out.close();
}
catch(Exception e){
System.out.println("转换失败");
e.printStackTrace();
}
return size;
}
}