Java使用geotools将Geometry导出为shp文件

您所在的位置:网站首页 坐标点转成shp Java使用geotools将Geometry导出为shp文件

Java使用geotools将Geometry导出为shp文件

2024-02-25 01:57| 来源: 网络整理| 查看: 265

将地图要素导出成shp文件,并且打包的方法。

1、maven依赖

14.1 org.geotools gt-shapefile ${geotools.version} org.geotools gt-api ${geotools.version} org.geotools gt-opengis ${geotools.version} org.geotools gt-data ${geotools.version} org.geotools gt-main ${geotools.version} org.geotools gt-referencing 13.2 org.geotools gt-metadata ${geotools.version} com.vividsolutions jts 1.13

2、导出工具类

import com.vividsolutions.jts.geom.Geometry; import org.geotools.data.FeatureWriter; import org.geotools.data.Transaction; import org.geotools.data.shapefile.ShapefileDataStore; import org.geotools.data.shapefile.ShapefileDataStoreFactory; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; import java.io.*; import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ShapeUtil { /** * 生成shape文件 * * @param shpPath 生成shape文件路径(包含文件名称) * @param encode 编码 * @param geoType 图幅类型,Point和Rolygon * @param geoms 图幅集合 */ public static void write2Shape(String shpPath, String encode, String geoType, List geoms) { try { //创建shape文件对象 File file = new File(shpPath); Map params = new HashMap(); params.put(ShapefileDataStoreFactory.URLP.key, file.toURI().toURL()); ShapefileDataStore ds = (ShapefileDataStore) new ShapefileDataStoreFactory().createNewDataStore(params); //定义图形信息和属性信息 SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder(); tb.setCRS(DefaultGeographicCRS.WGS84); tb.setName("shapefile"); if ("Polygon".equals(geoType)) { tb.add("the_geom", Polygon.class); } else if ("MultiPolygon".equals(geoType)) { tb.add("the_geom", MultiPolygon.class); } else if ("Point".equals(geoType)) { tb.add("the_geom", Point.class); } else if ("MultiPoint".equals(geoType)) { tb.add("the_geom", MultiPoint.class); } else if ("LineString".equals(geoType)) { tb.add("the_geom", LineString.class); } else if ("MultiLineString".equals(geoType)) { tb.add("the_geom", MultiLineString.class); } else { throw new Exception("Geometry中没有该类型:" + geoType); } ds.createSchema(tb.buildFeatureType()); //设置编码 Charset charset = Charset.forName(encode); ds.setCharset(charset); //设置Writer FeatureWriter writer = ds.getFeatureWriter(ds.getTypeNames()[0], Transaction.AUTO_COMMIT); for (Geometry geom : geoms) { //String type = geom.getGeometryType(); //写下一条 SimpleFeature feature = writer.next(); feature.setAttribute("the_geom", geom); } writer.write(); writer.close(); ds.dispose(); } catch (Exception e) { e.printStackTrace(); } } /** * 生成shape文件 * * @param shpPath 生成shape文件路径(包含文件名称) * @param encode 编码 * @param geoType 图幅类型,Point和Rolygon * @param shpKey data中图幅的key * @param attrKeys 属性key集合 * @param data 图幅和属性集合 */ public static void write2Shape(String shpPath, String encode, String geoType, String shpKey, List attrKeys, List data) { try { if (data == null || data.size() == 0) { return; } //创建shape文件对象 File file = new File(shpPath); Map params = new HashMap(); params.put(ShapefileDataStoreFactory.URLP.key, file.toURI().toURL()); ShapefileDataStore ds = (ShapefileDataStore) new ShapefileDataStoreFactory().createNewDataStore(params); //定义图形信息和属性信息 SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder(); tb.setCRS(DefaultGeographicCRS.WGS84); tb.setName("shapefile"); if ("Polygon".equals(geoType)) { tb.add("the_geom", Polygon.class); } else if ("MultiPolygon".equals(geoType)) { tb.add("the_geom", MultiPolygon.class); } else if ("Point".equals(geoType)) { tb.add("the_geom", Point.class); } else if ("MultiPoint".equals(geoType)) { tb.add("the_geom", MultiPoint.class); } else if ("LineString".equals(geoType)) { tb.add("the_geom", LineString.class); } else if ("MultiLineString".equals(geoType)) { tb.add("the_geom", MultiLineString.class); } else { throw new Exception("Geometry中没有该类型:" + geoType); } for (String field : attrKeys) { tb.add(field.toUpperCase(), String.class); } ds.createSchema(tb.buildFeatureType()); //设置编码 Charset charset = Charset.forName(encode); ds.setCharset(charset); //设置Writer FeatureWriter writer = ds.getFeatureWriter(ds.getTypeNames()[0], Transaction.AUTO_COMMIT); //写入文件信息 for (int i = 0; i < data.size(); i++) { SimpleFeature feature = writer.next(); Map row = data.get(i); Geometry geom = (Geometry) row.get(shpKey); feature.setAttribute("the_geom", geom); for (String key : row.keySet()) { if (!key.equals(shpKey)) { if (row.get(key) != null) { feature.setAttribute(key.toUpperCase(), row.get(key).toString()); } else { feature.setAttribute(key.toUpperCase(), ""); } } } } writer.write(); writer.close(); ds.dispose(); //添加到压缩文件 //zipShapeFile(shpPath); } catch (Exception e) { e.printStackTrace(); } } /** * 压缩shape文件 * * @param shpPath shape文件路径(包含shape文件名称) */ public static void zipShapeFile(String shpPath) { try { File shpFile = new File(shpPath); String shpRoot = shpFile.getParentFile().getPath(); String shpName = shpFile.getName().substring(0, shpFile.getName().lastIndexOf(".")); String zipPath = shpRoot + File.separator + shpName + ".zip"; File zipFile = new File(zipPath); InputStream input = null; ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile)); // zip的名称为 zipOut.setComment(shpName); String[] shpFiles = new String[]{ shpRoot + File.separator + shpName + ".dbf", shpRoot + File.separator + shpName + ".prj", shpRoot + File.separator + shpName + ".shp", shpRoot + File.separator + shpName + ".shx", shpRoot + File.separator + shpName + ".fix" }; for (int i = 0; i < shpFiles.length; i++) { File file = new File(shpFiles[i]); input = new FileInputStream(file); zipOut.putNextEntry(new ZipEntry(file.getName())); int temp = 0; while ((temp = input.read()) != -1) { zipOut.write(temp); } input.close(); } zipOut.close(); } catch (Exception e) { e.printStackTrace(); } } }

3、测试工具类

import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.io.ParseException; import com.vividsolutions.jts.io.WKTReader; import com.vividsolutions.jts.io.WKTWriter; /** * @ClassName WKTUtil * @Description @TODO * @Date 2019/11/18 12:01 * @Version v1.0 **/ public class WKTUtil { public static String geomToWkt(Geometry geometry) { String wkt = null; WKTWriter writer = new WKTWriter(); wkt = writer.write(geometry); return wkt; } public static Geometry wktToGeom(String wkt) throws ParseException { Geometry geometry = null; WKTReader reader = new WKTReader(); geometry = reader.read(wkt); //geometry.setSRID(4326); return geometry; } } public static void main(String[] args) throws Exception { List list = new ArrayList(); list.add("POLYGON ((116.21278950384274 39.90557982319698, 116.21177234433465 39.90610963061354, 116.21106912279264 39.90264172209895, 116.21399502548638 39.902612822554126, 116.21629305278306 39.905011479365406, 116.21278950384274 39.90557982319698))"); list.add("POLYGON((113.38185597038 34.54828048706,113.38224220848 34.548355588913,113.38249970055 34.548108825684,113.38237095451 34.54787279129,113.38208127594 34.547786960602,113.38185597038 34.54828048706))"); List geometryList = new ArrayList(); for (String str : list) { Geometry geom = WKTUtil.wktToGeom(str); geometryList.add(geom); } String url = "D:\\data\\tmp\\ceshi2222.shp"; ShapeUtil.write2Shape(url, "utf-8", "Polygon", geometryList); ShapeUtil.zipShapeFile(url); }

4、测试结果截图

参考资料:shape文件的生成与打包下载_牛老师讲GIS的博客-CSDN博客 

Geotools使用20以上版本,可参考Java使用Geotools(使用25.4版本)将地图元素导入shape文件_杉叔的博客-CSDN博客



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3