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.*; import static com.dji.sample.patches.utils.TimerUtil.getNowDay; import static com.dji.sample.patches.utils.TimerUtil.getNowTimeName; 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 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 list = new ArrayList<>(); Map 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 source = dataStore.getFeatureSource(typeName); Filter filter = Filter.INCLUDE; FeatureCollection collection = source.getFeatures(filter); return collection; } catch (Exception e) { throw e; } } /** * @param zipFile: * @return JSONObject * @description 通过shp压缩文件,将其转换为GeoJson格式 */ //将解压后的文件转换成GeoJson格式 public static List shpToGeoJson(File zipFile) throws IOException, ParseException { List 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").getString("coordinates")); if ((json.getJSONObject("geometry").get("type")) != null) { shpDTO.setGEO(json.getJSONObject("geometry").getString("type")); } if ((json.getJSONObject("properties").get("XZQDM")) != null) { shpDTO.setXZQDM(json.getJSONObject("properties").getString("XZQDM")); } if ((json.getJSONObject("properties").getDouble("XZB")) != null && json.getJSONObject("properties").getDouble("YZB") != null) { double[] xy = getLongitudeLatitude(CoordinateSystemUtil.pointCGCStoWGS( json.getJSONObject("properties").getDouble("XZB"), json.getJSONObject("properties").getDouble("YZB"))); shpDTO.setXZB(xy[0]); shpDTO.setYZB(xy[1]); } if ((json.getJSONObject("properties").getString("JCBH") != null)) { shpDTO.setDKBH(json.getJSONObject("properties").getString("JCBH")); }else { shpDTO.setDKBH(getNowDay()); } if (json.getJSONObject("properties").getDouble("JCMC") != null) { shpDTO.setJCMJ(json.getJSONObject("properties").getDouble("JCMC")); } if (json.getJSONObject("properties").getString("TBLX") != null) { shpDTO.setTBLX(json.getJSONObject("properties").getString("TBLX")); } if (json.getJSONObject("properties").getString("DDTC") != null) { shpDTO.setDDTC(json.getJSONObject("properties").getString("DDTC")); } if (json.getJSONObject("properties").getString("HSX") != null) { shpDTO.setHSX(json.getJSONObject("properties").getString("HSX")); } if (json.getJSONObject("properties").getString("JCLX") != null) { 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."); } } }