| | |
| | | package org.springblade.common.utils; |
| | | |
| | | import cn.hutool.core.io.FileUtil; |
| | | import cn.hutool.core.map.MapUtil; |
| | | import cn.hutool.core.text.CharSequenceUtil; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import org.geotools.data.DataStore; |
| | | import org.geotools.data.DataStoreFinder; |
| | | import org.geotools.data.FeatureSource; |
| | | import org.geotools.data.*; |
| | | import org.geotools.data.shapefile.ShapefileDataStore; |
| | | import org.geotools.data.shapefile.ShapefileDataStoreFactory; |
| | | import org.geotools.feature.FeatureCollection; |
| | | import org.geotools.feature.FeatureIterator; |
| | | import org.geotools.feature.simple.SimpleFeatureTypeBuilder; |
| | | import org.geotools.geojson.feature.FeatureJSON; |
| | | import org.locationtech.jts.geom.Geometry; |
| | | import org.locationtech.jts.geom.Point; |
| | | import org.geotools.referencing.CRS; |
| | | import org.locationtech.jts.geom.*; |
| | | import org.locationtech.jts.io.ParseException; |
| | | import org.locationtech.jts.io.WKTReader; |
| | | import org.opengis.feature.simple.SimpleFeature; |
| | | import org.opengis.feature.simple.SimpleFeatureType; |
| | | import org.opengis.filter.Filter; |
| | | import org.opengis.referencing.FactoryException; |
| | | import org.opengis.referencing.crs.CoordinateReferenceSystem; |
| | | import org.springblade.core.log.exception.ServiceException; |
| | | |
| | | import java.io.File; |
| | | import java.io.IOException; |
| | | import java.io.Serializable; |
| | | import java.io.StringWriter; |
| | | import java.nio.charset.StandardCharsets; |
| | | import java.util.*; |
| | | |
| | | public class ShapeFileUtil { |
| | | |
| | | /** |
| | | * 导出shp文件 |
| | | * |
| | | * @param dataPropertiesList 属性列表{属性名:属性值} |
| | | * @param fileName 导出shp文件名 |
| | | * @param geomType geometry类型 |
| | | * @param saveFolder 导出位置 |
| | | */ |
| | | private static void exportShp(List<Map<String, Object>> dataPropertiesList, String fileName, String geomType,String saveFolder) { |
| | | //创建保存shp文件夹 |
| | | File dir = new File(saveFolder); |
| | | if (!dir.exists()) { |
| | | FileUtil.mkdir(dir); |
| | | } |
| | | //shp文件路径 |
| | | String shpFileName = fileName + ".shp"; |
| | | String fileUrl = saveFolder + shpFileName; |
| | | File file = new File(fileUrl); |
| | | |
| | | FeatureWriter<SimpleFeatureType, SimpleFeature> writer = null; |
| | | ShapefileDataStore ds = null; |
| | | try { |
| | | Map<String, Serializable> params = new HashMap<>(); |
| | | params.put(ShapefileDataStoreFactory.URLP.key, file.toURI().toURL()); |
| | | ds = (ShapefileDataStore) new ShapefileDataStoreFactory().createNewDataStore(params); |
| | | |
| | | //定义图形信息和属性信息 |
| | | SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder(); |
| | | //设置坐标系 |
| | | CoordinateReferenceSystem crs84 = CRS.decode("EPSG:4326", true); |
| | | tb.setCRS(crs84); |
| | | //设置文件名 |
| | | tb.setName(fileName); |
| | | |
| | | //定义导出shp文件地块属性名称 |
| | | String geomProperty = "the_geom"; |
| | | String idProperty = "ID"; |
| | | String nameProperty = "name"; |
| | | String descriptionProperty = "desc"; |
| | | |
| | | //设置图形类型 |
| | | if ("Polygon".equals(geomType)) { |
| | | tb.add(geomProperty, Polygon.class); |
| | | } else if ("MultiPolygon".equals(geomType)) { |
| | | tb.add(geomProperty, MultiPolygon.class); |
| | | } else if ("Point".equals(geomType)) { |
| | | tb.add(geomProperty, Point.class); |
| | | } else if ("MultiPoint".equals(geomType)) { |
| | | tb.add(geomProperty, MultiPoint.class); |
| | | } else if ("LineString".equals(geomType)) { |
| | | tb.add(geomProperty, LineString.class); |
| | | } else if ("MultiLineString".equals(geomType)) { |
| | | tb.add(geomProperty, MultiLineString.class); |
| | | } else { |
| | | throw new ServiceException("Geometry中没有该类型:" + geomType); |
| | | } |
| | | //设置对应属性类型 |
| | | tb.add(idProperty, String.class); |
| | | tb.add(nameProperty, String.class); |
| | | tb.add(descriptionProperty, String.class); |
| | | |
| | | //设置默认geometry |
| | | tb.setDefaultGeometry(geomProperty); |
| | | //创建 |
| | | ds.createSchema(tb.buildFeatureType()); |
| | | ds.setCharset(StandardCharsets.UTF_8); |
| | | |
| | | //设置Writer |
| | | writer = ds.getFeatureWriter(ds.getTypeNames()[0], |
| | | Transaction.AUTO_COMMIT); |
| | | SimpleFeature feature; |
| | | for (Map<String, Object> map : dataPropertiesList) { |
| | | feature = writer.next(); |
| | | //属性赋值 geometry要赋值wkt格式的 |
| | | feature.setAttribute(geomProperty, new WKTReader().read((MapUtil.getStr(map, "geometry")))); |
| | | feature.setAttribute(idProperty, MapUtil.getStr(map, idProperty)); |
| | | feature.setAttribute(nameProperty, MapUtil.getStr(map, "名称")); |
| | | String description = MapUtil.getStr(map, "描述"); |
| | | if (CharSequenceUtil.isNotBlank(description)) { |
| | | feature.setAttribute(descriptionProperty, description); |
| | | } |
| | | } |
| | | writer.write(); |
| | | } catch (IOException | FactoryException | ParseException e) { |
| | | e.printStackTrace(); |
| | | } finally { |
| | | //关闭相关流 |
| | | try { |
| | | if (writer != null) { |
| | | writer.close(); |
| | | } |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | if (ds != null) { |
| | | ds.dispose(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 将文件解压 |
| | |
| | | |
| | | |
| | | public static void main(String[] args) throws IOException, ParseException { |
| | | File file = new File("F:\\test4jdata\\shp\\zrq.zip"); |
| | | // File file = new File("F:\\test4jdata\\shp\\import\\zrq.zip"); |
| | | File file = new File("F:\\test4jdata\\shp\\export\\test.zip"); |
| | | List<Map<String, Object>> list = shpToGeoJson(file); |
| | | System.out.println("list = " + list); |
| | | |
| | | // 导出shp 文件 |
| | | List<Map<String,Object>> propertyList = new ArrayList<>(); |
| | | for (int i = 0; i < 3; i++) { |
| | | Map<String,Object> map = new HashMap<>(); |
| | | map.put("ID", i); |
| | | map.put("名称", "test" + i); |
| | | map.put("描述", "测试shp导出" + i); |
| | | map.put("geometry", "MULTILINESTRING ((114.0888763800001 22.549298400000055, 114.0897166200001 22.54931240800005, 114.09006708000004 22.549318250000056, 114.09104754000009 22.549328150000065))"); |
| | | propertyList.add(map); |
| | | } |
| | | String exportPath = "F:\\test4jdata\\shp\\export\\"; |
| | | exportShp(propertyList, "test", "MultiLineString",exportPath); |
| | | } |
| | | |
| | | public static double[] getLongitudeLatitude(Geometry wktPoint) throws ParseException { |