@Testvoid contextLoads() {System.out.println(System.currentTimeMillis());//1716516228057 1716516228798String zipFilePath = "C:\\code\\risk\\risk_management_backend\\edatope-app\\src\\main\\resources\\新中心范圍SHP導入模板.zip";String destDir = "C:\\code\\risk\\risk_management_backend\\edatope-app\\src\\main\\resources\\tt";Boolean unzip = unzip(zipFilePath, destDir);if(!unzip) try {throw new Exception("解壓失敗");} catch (Exception e) {throw new RuntimeException(e);}// 創建一個File對象,指向你的ShapefileFile file = new File("C:\\code\\risk\\risk_management_backend\\edatope-app\\src\\main\\resources\\tt\\地塊1984.shp");// 使用FileDataStoreFinder來查找和創建FileDataStoreFileDataStore store = null;try {store = FileDataStoreFinder.getDataStore(file);// 獲取FeatureSourceSimpleFeatureSource featureSource = store.getFeatureSource();// 獲取所有的FeaturesSimpleFeatureCollection featureCollection = featureSource.getFeatures();// 使用SimpleFeatureIterator遍歷featuresList<SimpleFeature> featuresList = new ArrayList<>();SimpleFeatureIterator iterator = featureCollection.features();try {while (iterator.hasNext()) {SimpleFeature feature = iterator.next();// 獲取幾何信息System.out.println("Geometry: " + feature.getDefaultGeometry());// 獲取屬性信息System.out.println("Properties: ");feature.getProperties().forEach(prop -> {System.out.println(prop.getName().toString() + ": " + feature.getAttribute(prop.getName()));});}} finally {// 請記住關閉迭代器以釋放資源iterator.close();}} catch (IOException e) {throw new RuntimeException(e);}System.out.println(System.currentTimeMillis());}public static Boolean unzip(String zipFilePath, String destDirectory) {File dir = new File(destDirectory);// 如果目標文件夾不存在,則創建if (!dir.exists()) {dir.mkdirs();}byte[] buffer = new byte[1024];try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFilePath),Charset.forName("GBK"))) {ZipEntry zipEntry = zis.getNextEntry();while (zipEntry != null) {File newFile = newFile(dir, zipEntry);if (zipEntry.isDirectory()) {// 創建目錄newFile.mkdirs();} else {// 創建父目錄newFile.getParentFile().mkdirs();// 寫入文件try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newFile))) {int len;while ((len = zis.read(buffer)) > 0) {bos.write(buffer, 0, len);}}}zipEntry = zis.getNextEntry();}zis.closeEntry();} catch (IOException e) {e.printStackTrace();}return true;}// 保護文件路徑,防止ZipPathTraversal攻擊private static File newFile(File destinationDir, ZipEntry zipEntry) throws IOException {File destFile = new File(destinationDir, zipEntry.getName());String destDirPath = destinationDir.getCanonicalPath();String destFilePath = destFile.getCanonicalPath();if (!destFilePath.startsWith(destDirPath + File.separator)) {throw new IOException("Entry is outside of the target directory: " + zipEntry.getName());}return destFile;}
注意
引入依賴不起作用,需要去geotools官網下載jar包導入項目
GeoTools
![](https://img-blog.csdnimg.cn/direct/cf07eb8b594b40b09b24e2bf8eb090cc.png