From a6fe405947004d6571806edabd8f14357e144cfa Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期一, 14 十月 2024 17:31:31 +0800 Subject: [PATCH] 1 --- src/main/java/com/se/simu/helper/ShpHelper.java | 144 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 144 insertions(+), 0 deletions(-) diff --git a/src/main/java/com/se/simu/helper/ShpHelper.java b/src/main/java/com/se/simu/helper/ShpHelper.java index 21f7f21..f9f8778 100644 --- a/src/main/java/com/se/simu/helper/ShpHelper.java +++ b/src/main/java/com/se/simu/helper/ShpHelper.java @@ -7,10 +7,16 @@ import com.se.simu.domain.dto.GeLayer; import lombok.extern.slf4j.Slf4j; 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; /** @@ -31,6 +37,113 @@ } return options; + } + + 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; + try { + driver = ogr.GetDriverByName("ESRI shapefile"); + if (null == driver) return false; + + dataSource = driver.CreateDataSource(filePath, null); + if (null == dataSource) return false; + + 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); + + return true; + } catch (Exception ex) { + log.error(ex.getMessage(), ex); + return false; + } finally { + GdalHelper.delete(layer, dataSource, driver); + } + } + + 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))) { + double[] dmin = fromWgs84(sr, minx, miny); + double[] dmax = fromWgs84(sr, maxx, maxy); + minx = dmin[0]; + miny = dmin[1]; + maxx = dmax[0]; + maxy = dmax[1]; + } + + Geometry ring = new Geometry(ogr.wkbLinearRing); + ring.AddPoint_2D(minx, maxy); + ring.AddPoint_2D(maxx, maxy); + ring.AddPoint_2D(maxx, miny); + ring.AddPoint_2D(minx, miny); + ring.AddPoint_2D(minx, maxy); + + Geometry poly = new Geometry(ogr.wkbPolygon); + poly.AddGeometry(ring); + + return poly; } public static boolean createShp(String filePath, GeLayer geLayer) { @@ -186,4 +299,35 @@ return ogr.OFTString; } } + + private String getEpsg(SpatialReference sr) { + return sr.GetAuthorityCode(null); + } + + /** + * 杞崲涓篧GS84鍧愭爣 + */ + public static Geometry toWgs84(SpatialReference sr, double x, double y) { + Geometry point = new Geometry(ogr.wkbPoint); + point.AssignSpatialReference(sr); + point.AddPoint(x, y); + + point.TransformTo(GdalHelper.SR4326); + //point.SwapXY(); + + return point; + } + + /** + * WGS84杞崲涓虹洰鏍囧潗鏍� + */ + public static double[] fromWgs84(SpatialReference sr, double x, double y) { + // https://blog.csdn.net/weixin_34910922/article/details/129208661 + CoordinateTransformation ct = new CoordinateTransformation(GdalHelper.SR4326, sr); + if (sr.IsProjected() != 1) { + sr.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER); + } + + return ct.TransformPoint(x, y); + } } -- Gitblit v1.9.3