package com.dji.sample.patches.utils;
|
|
import cn.hutool.core.io.FileUtil;
|
import com.alibaba.fastjson.JSONObject;
|
import com.dji.sample.patches.model.dto.ShpDTO;
|
import com.dji.sample.territory.utils.CoordinateSystemUtil;
|
import org.geotools.data.DataStore;
|
import org.geotools.data.DataStoreFinder;
|
import org.geotools.data.FeatureSource;
|
import org.geotools.feature.FeatureCollection;
|
import org.geotools.feature.FeatureIterator;
|
import org.geotools.geojson.feature.FeatureJSON;
|
import org.locationtech.jts.geom.Geometry;
|
import org.locationtech.jts.geom.Point;
|
import org.locationtech.jts.io.ParseException;
|
import org.opengis.feature.simple.SimpleFeature;
|
import org.opengis.feature.simple.SimpleFeatureType;
|
import org.opengis.filter.Filter;
|
|
import java.io.File;
|
import java.io.IOException;
|
import java.io.StringWriter;
|
import java.util.*;
|
|
public class ShapeFileUtil {
|
|
//将文件解压
|
public static FeatureCollection getFeatureCollectionByShpFile(File zipFile) throws IOException {
|
try {
|
String tempDir = FileUtil.getTmpDirPath();
|
File shapeDir = new File(tempDir + File.separator + new Date().getTime());
|
shapeDir.mkdir();
|
List<String> files = ZipUtil.unZipFiles(zipFile, shapeDir.getPath() + File.separator);
|
String shapFileName = "";
|
for (String fileName : files) {
|
String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
|
if ("shp".equals(suffix)) {
|
shapFileName = fileName;
|
}
|
}
|
File shapeFile = new File(shapFileName);
|
List<SimpleFeature> list = new ArrayList<>();
|
Map<String, Object> shapeFileParams = new HashMap();
|
shapeFileParams.put("url", shapeFile.toURI().toURL());
|
// 设置编码
|
shapeFileParams.put("charset", "GBK");
|
DataStore dataStore = DataStoreFinder.getDataStore(shapeFileParams);
|
if (dataStore == null) {
|
throw new RuntimeException("couldn't load the damn data store: " + shapeFileParams);
|
}
|
String typeName = dataStore.getTypeNames()[0];
|
FeatureSource<SimpleFeatureType, SimpleFeature> source = dataStore.getFeatureSource(typeName);
|
Filter filter = Filter.INCLUDE;
|
FeatureCollection<SimpleFeatureType, SimpleFeature> collection = source.getFeatures(filter);
|
return collection;
|
} catch (Exception e) {
|
throw e;
|
}
|
}
|
|
/**
|
* @param zipFile:
|
* @return JSONObject
|
* @description 通过shp压缩文件,将其转换为GeoJson格式
|
*/
|
//将解压后的文件转换成GeoJson格式
|
public static List<ShpDTO> shpToGeoJson(File zipFile) throws IOException, ParseException {
|
List<ShpDTO> dtoList = new ArrayList<>();
|
FeatureJSON fjson = new FeatureJSON();
|
JSONObject geoJsonObject = new JSONObject();
|
geoJsonObject.put("type", "FeatureCollection");
|
// 获取FeatureCollection
|
FeatureCollection collection = getFeatureCollectionByShpFile(zipFile);
|
|
FeatureIterator iterator = collection.features();
|
//遍历feature转为json对象
|
while (iterator.hasNext()) {
|
ShpDTO shpDTO = new ShpDTO();
|
SimpleFeature feature = (SimpleFeature) iterator.next();
|
StringWriter writer = new StringWriter();
|
fjson.writeFeature(feature, writer);
|
String temp = writer.toString();
|
byte[] b = temp.getBytes("iso8859-1");
|
temp = new String(b, "gbk");
|
JSONObject json = JSONObject.parseObject(temp);
|
shpDTO.setDKFW(json.getJSONObject("geometry").get("coordinates").toString());
|
shpDTO.setGEO(json.getJSONObject("geometry").get("type").toString());
|
shpDTO.setXZQDM(json.getJSONObject("properties").get("XZQDM").toString());
|
double[] xy = getLongitudeLatitude(CoordinateSystemUtil.pointCGCStoWGS(
|
json.getJSONObject("properties").getDouble("XZB"),
|
json.getJSONObject("properties").getDouble("YZB")));
|
shpDTO.setXZB(xy[0]);
|
shpDTO.setYZB(xy[1]);
|
shpDTO.setDKBH(json.getJSONObject("properties").getString("JCBH"));
|
shpDTO.setJCMJ(json.getJSONObject("properties").getDouble("JCMC"));
|
shpDTO.setTBLX(json.getJSONObject("properties").getString("TBLX"));
|
shpDTO.setDDTC(json.getJSONObject("properties").getString("DDTC"));
|
shpDTO.setHSX(json.getJSONObject("properties").getString("HSX"));
|
shpDTO.setJCLX(json.getJSONObject("properties").getString("JCLX"));
|
dtoList.add(shpDTO);
|
}
|
iterator.close();
|
return dtoList;
|
}
|
|
public static void main(String[] args) throws IOException, ParseException {
|
File file = new File("D:\\ceshi\\ceshi.zip");
|
shpToGeoJson(file);
|
}
|
|
public static double[] getLongitudeLatitude(Geometry wktPoint) throws ParseException {
|
Geometry geometry = wktPoint;
|
if (geometry instanceof Point) {
|
Point point = (Point) geometry;
|
double longitude = point.getX();
|
double latitude = point.getY();
|
return new double[]{longitude, latitude};
|
} else {
|
throw new IllegalArgumentException("The geometry is not a point.");
|
}
|
}
|
}
|