1.pom 依赖
<properties>
<geomesa.version>2.3.0</geomesa.version>
<geotools.version>20.0</geotools.version>
<gson.version>2.8.5</gson.version>
</properties>
<dependencies>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-shapefile</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-epsg-hsql</artifactId>
<version>${geotools.version}</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>阿里云公共仓库</id>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
<repository>
<id>osgeo</id>
<url>https://repo.osgeo.org/repository/release/</url>
</repository>
</repositories>
2.ShpUtil 工具类
package demo;
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.data.store.ContentFeatureCollection;
import org.geotools.data.store.ContentFeatureSource;
import org.geotools.geojson.feature.FeatureJSON;
import org.opengis.feature.simple.SimpleFeature;
import java.io.*;
import java.nio.charset.Charset;
public class ShpUtil {
private ShpUtil() {
}
public static String readShpFileCharset(String shpPath) {
String defaultCharset = "UTF-8";
File file = new File(shpPath);
String shpFileName = file.getName().substring(0, file.getName().lastIndexOf("."));
String shpFilePath = file.getParent();
String separator = System.getProperty("file.separator");
String cpgFilePath = shpFilePath + separator + shpFileName + ".cpg";
BufferedReader bufferedReader = null;
try {
File cpgFile = new File(cpgFilePath);
if (!cpgFile.exists()) {
return defaultCharset;
}
bufferedReader = new BufferedReader(new FileReader(cpgFile));
String charset = bufferedReader.readLine();
String ISOChartSet = "ISO-8859-1";
if (ISOChartSet.equals(charset)) {
return "GBK";
}
return charset;
} catch (Exception ignored) {
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException ignored) {
}
}
}
return defaultCharset;
}
public static void shpToGeojson(String shpFile, String shpCharset, String outputGeojson, String geojsonCharset) {
try {
ShapefileDataStore shapefileDataStore = new ShapefileDataStore(new File(shpFile).toURI().toURL());
shapefileDataStore.setCharset(Charset.forName(shpCharset));
final ContentFeatureSource featureSource = shapefileDataStore.getFeatureSource();
final ContentFeatureCollection features = featureSource.getFeatures();
try (final OutputStream outputStream = new FileOutputStream(outputGeojson);
final OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, geojsonCharset);
final BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
final SimpleFeatureIterator featureIterator = features.features()) {
bufferedWriter.write("{\"type\":\"FeatureCollection\",\"features\":[");
int counter = 0;
StringBuilder stringBuilder = new StringBuilder();
int batchSize = 100;
boolean firstFeature = true;
while (featureIterator.hasNext()) {
final SimpleFeature simpleFeature = featureIterator.next();
FeatureJSON featureJson = new FeatureJSON();
StringWriter writer = new StringWriter();
featureJson.writeFeature(simpleFeature, writer);
String featureContent = writer.toString();
writer.close();
if (!firstFeature) {
stringBuilder.append(",");
}
stringBuilder.append(featureContent);
counter++;
if (counter == batchSize) {
bufferedWriter.write(stringBuilder.toString());
counter = 0;
stringBuilder = new StringBuilder();
}
firstFeature = false;
}
if (counter > 0) {
bufferedWriter.write(stringBuilder.toString());
}
bufferedWriter.write("]}");
bufferedWriter.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.测试运行
public class Application {
public static void main(String[] args) {
String shpFile = "D:\\haiceng\\海城地震.shp";
String outputGeojson = "D:\\haiceng\\output.geojson";
ShpUtil.shpToGeojson(shpFile, "GBK", outputGeojson, "UTF-8");
}
}