From 057656be19439c26afeb37c76fc7d28fd4474d03 Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期日, 29 九月 2024 11:28:13 +0800 Subject: [PATCH] 11 --- src/main/java/com/se/simu/helper/ShpHelper.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 58 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/se/simu/helper/ShpHelper.java b/src/main/java/com/se/simu/helper/ShpHelper.java index 98641c5..f9f8778 100644 --- a/src/main/java/com/se/simu/helper/ShpHelper.java +++ b/src/main/java/com/se/simu/helper/ShpHelper.java @@ -6,15 +6,17 @@ import com.se.simu.domain.dto.GeField; import com.se.simu.domain.dto.GeLayer; import lombok.extern.slf4j.Slf4j; -import org.gdal.gdal.Dataset; import org.gdal.ogr.*; import org.gdal.osr.CoordinateTransformation; import org.gdal.osr.SpatialReference; import org.gdal.osr.osr; +import java.math.BigDecimal; import java.sql.Timestamp; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; +import java.util.Map; import java.util.Vector; /** @@ -37,7 +39,7 @@ return options; } - public static boolean createShp(String filePath, SpatialReference sr, Double minx, Double miny, Double maxx, Double maxy) { + public static boolean createShp(String filePath, Map<String, Object> map, SpatialReference sr, Double minx, Double miny, Double maxx, Double maxy) { Driver driver = null; DataSource dataSource = null; Layer layer = null; @@ -51,9 +53,12 @@ layer = dataSource.CreateLayer(FileUtil.getName(filePath), sr, ogr.wkbPolygon, getOptions()); if (null == layer) return false; + if (null != map) createFields(layer, map); + Feature f = new Feature(layer.GetLayerDefn()); Geometry g = createPolygon(sr, minx, miny, maxx, maxy); f.SetGeometry(g); + if (null != map) setValues(f, map); layer.CreateFeature(f); @@ -66,6 +71,57 @@ } } + private static void createFields(Layer layer,Map<String, Object> map) { + for (String key : map.keySet()) { + Object val = map.get(key); + switch (val.getClass().getTypeName()) { + //case "java.math.BigDecimal": + case "java.lang.Double": + case "double": + layer.CreateField(new FieldDefn(key, ogr.OFTReal)); + break; + case "java.lang.Long": + case "long": + layer.CreateField(new FieldDefn(key, ogr.OFTInteger64)); + break; + case "java.lang.Integer": + case "int": + layer.CreateField(new FieldDefn(key, ogr.OFTInteger)); + break; + //case "java.sql.Timestamp": + //case "java.time.LocalDate": + // layer.CreateField(new FieldDefn(key, ogr.OFTDateTime)); + // break; + default: + layer.CreateField(new FieldDefn(key, ogr.OFTString)); + break; + } + } + } + + private static void setValues(Feature f, Map<String, Object> map) { + for (String key : map.keySet()) { + Object val = map.get(key); + switch (val.getClass().getTypeName()) { + case "java.lang.Double": + case "double": + f.SetField(key, Double.parseDouble(val.toString())); + break; + case "java.lang.Long": + case "long": + f.SetField(key, Long.parseLong(val.toString())); + break; + case "java.lang.Integer": + case "int": + f.SetField(key, Integer.parseInt(val.toString())); + break; + default: + f.SetField(key, val.toString()); + break; + } + } + } + private static Geometry createPolygon(SpatialReference sr, Double minx, Double miny, Double maxx, Double maxy) { String epsg = sr.GetAuthorityCode(null); if (!("4326".equals(epsg) || "4490".equals(epsg))) { -- Gitblit v1.9.3