src/main/java/com/lf/server/helper/GdalHelper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/lf/server/helper/ShpHelper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/lf/server/service/show/InquiryService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/lf/server/service/show/MarkService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/lf/server/helper/GdalHelper.java
@@ -1,8 +1,5 @@ package com.lf.server.helper; import com.lf.server.entity.ctrl.MarkJsonEntity; import com.lf.server.entity.ctrl.ShpRecordEntity; import com.lf.server.entity.data.MetaFileEntity; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.gdal.gdal.Band; @@ -13,8 +10,6 @@ import org.gdal.ogr.*; import org.gdal.osr.SpatialReference; import java.io.File; import java.lang.reflect.Field; import java.sql.Time; import java.sql.Timestamp; import java.time.LocalDate; @@ -33,193 +28,20 @@ public class GdalHelper { private final static Log log = LogFactory.getLog(GdalHelper.class); static { // æ³¨åææçé©±å¨ gdal.AllRegister(); public static void init() { // æ³¨åææçé©±å¨ gdal.AllRegister(); // ä¸ºäºæ¯æä¸æè·¯å¾ï¼è¯·æ·»å ä¸é¢è¿å¥ä»£ç gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); // ä¸ºäºæ¯æä¸æè·¯å¾ï¼è¯·æ·»å ä¸é¢è¿å¥ä»£ç gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); // é ç½®GDAL_DATAè·¯å¾ï¼gdalæ ¹ç®å½ä¸çbin\gdal-dataï¼ // gdal.SetConfigOption("GDAL_DATA", "E:\\terrait\\TianJin\\Zip\\release-1928-x64-dev\\release-1928-x64\\bin\\gdal-data"); // gdal.SetConfigOption("PROJ_LIB", "E:\\terrait\\TianJin\\Zip\\release-1928-x64-dev\\release-1928-x64\\bin\\proj7\\share"); // é ç½®GDAL_DATAè·¯å¾ï¼gdalæ ¹ç®å½ä¸çbin\gdal-dataï¼ // gdal.SetConfigOption("GDAL_DATA", "E:\\terrait\\TianJin\\Zip\\release-1928-x64-dev\\release-1928-x64\\bin\\gdal-data"); // gdal.SetConfigOption("PROJ_LIB", "E:\\terrait\\TianJin\\Zip\\release-1928-x64-dev\\release-1928-x64\\bin\\proj7\\share"); // 为äºä½¿å±æ§è¡¨åæ®µæ¯æä¸æï¼è¯·æ·»å ä¸é¢è¿å¥ï¼CP936 gdal.SetConfigOption("SHAPE_ENCODING", ""); } /** * 读åShpç¬¬ä¸æ¡è®°å½çWKT */ public static ShpRecordEntity readShpFirstRecord(String filePath) { try { org.gdal.ogr.Driver driver = ogr.GetDriverByName("ESRI shapefile"); if (driver == null) { return null; } DataSource dataSource = driver.Open(filePath); Layer layer = dataSource.GetLayer(0); if (layer.GetFeatureCount() < 1) { return null; } SpatialReference spatialReference = layer.GetSpatialRef(); String csid = spatialReference.GetAttrValue("AUTHORITY", 1); Feature feature = layer.GetFeature(0); String wkt = feature.GetGeometryRef().ExportToWkt(); layer.delete(); dataSource.delete(); driver.delete(); return new ShpRecordEntity(wkt, csid); } catch (Exception ex) { log.error(ex.getMessage(), ex); return null; } } /** * 读åShapeFileæä»¶è·åMarkå®ä½ç±» */ public static List<MarkJsonEntity> readShpForMarks(String filePath) { try { org.gdal.ogr.Driver driver = ogr.GetDriverByName("ESRI shapefile"); if (driver == null) { return null; } DataSource dataSource = driver.Open(filePath); Layer layer = dataSource.GetLayer(0); FeatureDefn featureDefn = layer.GetLayerDefn(); Map<Integer, Field> fieldMap = new HashMap(5); for (int i = 0, count = featureDefn.GetFieldCount(); i < count; i++) { try { FieldDefn fieldDefn = featureDefn.GetFieldDefn(i); Field field = MarkJsonEntity.class.getDeclaredField(fieldDefn.GetName().toLowerCase()); field.setAccessible(true); fieldMap.put(i, field); } catch (Exception e) { // } } long count = layer.GetFeatureCount(); if (count == 0 || fieldMap.size() == 0) { return null; } List<MarkJsonEntity> list = new ArrayList<MarkJsonEntity>(); for (int i = 0; i < count; i++) { Feature f = layer.GetFeature(i); MarkJsonEntity me = new MarkJsonEntity(i + 1); for (Integer key : fieldMap.keySet()) { Field field = fieldMap.get(key); switch (field.getType().toString()) { case "double": field.set(me, f.GetFieldAsDouble(i)); break; case "long": field.set(me, f.GetFieldAsInteger64(i)); break; case "int": field.set(me, f.GetFieldAsInteger(i)); break; default: field.set(me, f.GetFieldAsString(i)); break; } } me.setWkt(f.GetGeometryRef().ExportToWkt()); list.add(me); } layer.delete(); driver.delete(); return list; } catch (Exception ex) { log.error(ex.getMessage(), ex); return null; } } /** * å建ShapeFileæä»¶ * * @param list æ ç»JSONå®ä½ç±»éå * @param path è·¯å¾ * @param type ç±»åï¼POINT,LINESTRING,POLYGON * @return ShapeFileæä»¶å */ public static String createShp(List<MarkJsonEntity> list, String path, String type) { try { org.gdal.ogr.Driver driver = ogr.GetDriverByName("ESRI shapefile"); if (driver == null) { return null; } String filePath = path + File.separator + type.toLowerCase() + ".shp"; //DataSource ds = driver.Open(filePath, 0); DataSource ds = driver.CreateDataSource(filePath, null); SpatialReference sr = new SpatialReference(); sr.ImportFromEPSG(4326); int geoType = getGeometryType(type); Layer layer = ds.CreateLayer(type.toLowerCase(), sr, geoType); FieldDefn fdName = new FieldDefn("name", ogr.OFTString); fdName.SetWidth(50); layer.CreateField(fdName, 0); FieldDefn fdProps = new FieldDefn("props", ogr.OFTString); fdProps.SetWidth(1024); // layer.DeleteField(layer.FindFieldIndex("name", 1)); layer.CreateField(fdProps, 1); FeatureDefn featureDefn = layer.GetLayerDefn(); for (MarkJsonEntity mje : list) { Geometry geo = Geometry.CreateFromWkt(mje.getWkt()); Feature f = new Feature(featureDefn); f.SetField(0, mje.getName()); f.SetField(1, mje.getProps()); f.SetGeometry(geo); layer.CreateFeature(f); } layer.delete(); ds.delete(); driver.delete(); return filePath; } catch (Exception ex) { log.error(ex.getMessage(), ex); return null; } } /** * è·åå¾å½¢ç±»å */ private static int getGeometryType(String type) { switch (type) { case "POINT": return 1; case "LINESTRING": return 2; case "POLYGON": return 3; default: return -1; } } // 为äºä½¿å±æ§è¡¨åæ®µæ¯æä¸æï¼è¯·æ·»å ä¸é¢è¿å¥ï¼CP936 gdal.SetConfigOption("SHAPE_ENCODING", ""); } /** * 读åtifæä»¶ src/main/java/com/lf/server/helper/ShpHelper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,196 @@ package com.lf.server.helper; import com.lf.server.entity.ctrl.MarkJsonEntity; import com.lf.server.entity.ctrl.ShpRecordEntity; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.gdal.ogr.*; import org.gdal.osr.SpatialReference; import java.io.File; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * ShapeFile帮å©ç±» * @author WWW */ public class ShpHelper { private final static Log log = LogFactory.getLog(ShpHelper.class); /** * 读åShpç¬¬ä¸æ¡è®°å½çWKT */ public static ShpRecordEntity readShpFirstRecord(String filePath) { try { org.gdal.ogr.Driver driver = ogr.GetDriverByName("ESRI shapefile"); if (driver == null) { return null; } DataSource dataSource = driver.Open(filePath); Layer layer = dataSource.GetLayer(0); if (layer.GetFeatureCount() < 1) { return null; } SpatialReference spatialReference = layer.GetSpatialRef(); String csid = spatialReference.GetAttrValue("AUTHORITY", 1); Feature feature = layer.GetFeature(0); String wkt = feature.GetGeometryRef().ExportToWkt(); layer.delete(); dataSource.delete(); driver.delete(); return new ShpRecordEntity(wkt, csid); } catch (Exception ex) { log.error(ex.getMessage(), ex); return null; } } /** * 读åShapeFileæä»¶è·åMarkå®ä½ç±» */ public static List<MarkJsonEntity> readShpForMarks(String filePath) { try { org.gdal.ogr.Driver driver = ogr.GetDriverByName("ESRI shapefile"); if (driver == null) { return null; } DataSource dataSource = driver.Open(filePath); Layer layer = dataSource.GetLayer(0); FeatureDefn featureDefn = layer.GetLayerDefn(); Map<Integer, Field> fieldMap = new HashMap(5); for (int i = 0, count = featureDefn.GetFieldCount(); i < count; i++) { try { FieldDefn fieldDefn = featureDefn.GetFieldDefn(i); Field field = MarkJsonEntity.class.getDeclaredField(fieldDefn.GetName().toLowerCase()); field.setAccessible(true); fieldMap.put(i, field); } catch (Exception e) { // } } long count = layer.GetFeatureCount(); if (count == 0 || fieldMap.size() == 0) { return null; } List<MarkJsonEntity> list = new ArrayList<MarkJsonEntity>(); for (int i = 0; i < count; i++) { Feature f = layer.GetFeature(i); MarkJsonEntity me = new MarkJsonEntity(i + 1); for (Integer key : fieldMap.keySet()) { Field field = fieldMap.get(key); switch (field.getType().toString()) { case "double": field.set(me, f.GetFieldAsDouble(i)); break; case "long": field.set(me, f.GetFieldAsInteger64(i)); break; case "int": field.set(me, f.GetFieldAsInteger(i)); break; default: field.set(me, f.GetFieldAsString(i)); break; } } me.setWkt(f.GetGeometryRef().ExportToWkt()); list.add(me); } layer.delete(); driver.delete(); return list; } catch (Exception ex) { log.error(ex.getMessage(), ex); return null; } } /** * å建ShapeFileæä»¶ * * @param list æ ç»JSONå®ä½ç±»éå * @param path è·¯å¾ * @param type ç±»åï¼POINT,LINESTRING,POLYGON * @return ShapeFileæä»¶å */ public static String createShp(List<MarkJsonEntity> list, String path, String type) { try { org.gdal.ogr.Driver driver = ogr.GetDriverByName("ESRI shapefile"); if (driver == null) { return null; } String filePath = path + File.separator + type.toLowerCase() + ".shp"; // DataSource ds = driver.Open(filePath, 0) DataSource ds = driver.CreateDataSource(filePath, null); SpatialReference sr = new SpatialReference(); sr.ImportFromEPSG(4326); int geoType = getGeometryType(type); Layer layer = ds.CreateLayer(type.toLowerCase(), sr, geoType); FieldDefn fdName = new FieldDefn("name", ogr.OFTString); fdName.SetWidth(50); layer.CreateField(fdName, 0); FieldDefn fdProps = new FieldDefn("props", ogr.OFTString); fdProps.SetWidth(1024); // layer.DeleteField(layer.FindFieldIndex("name", 1)) layer.CreateField(fdProps, 1); FeatureDefn featureDefn = layer.GetLayerDefn(); for (MarkJsonEntity mje : list) { Geometry geo = Geometry.CreateFromWkt(mje.getWkt()); Feature f = new Feature(featureDefn); f.SetField(0, mje.getName()); f.SetField(1, mje.getProps()); f.SetGeometry(geo); layer.CreateFeature(f); } layer.delete(); ds.delete(); driver.delete(); return filePath; } catch (Exception ex) { log.error(ex.getMessage(), ex); return null; } } /** * è·åå¾å½¢ç±»å */ private static int getGeometryType(String type) { switch (type) { case "POINT": return 1; case "LINESTRING": return 2; case "POLYGON": return 3; default: return -1; } } } src/main/java/com/lf/server/service/show/InquiryService.java
@@ -3,7 +3,7 @@ import com.lf.server.entity.ctrl.ShpRecordEntity; import com.lf.server.entity.data.MetaFileEntity; import com.lf.server.helper.FileHelper; import com.lf.server.helper.GdalHelper; import com.lf.server.helper.ShpHelper; import com.lf.server.helper.StringHelper; import org.springframework.stereotype.Service; @@ -33,7 +33,7 @@ return null; } ShpRecordEntity sr = GdalHelper.readShpFirstRecord(fileName); ShpRecordEntity sr = ShpHelper.readShpFirstRecord(fileName); FileHelper.deleteFiles(list); return sr; src/main/java/com/lf/server/service/show/MarkService.java
@@ -1,7 +1,6 @@ package com.lf.server.service.show; import com.lf.server.entity.ctrl.MarkJsonEntity; import com.lf.server.entity.ctrl.ShpRecordEntity; import com.lf.server.entity.data.DownloadEntity; import com.lf.server.entity.data.MetaFileEntity; import com.lf.server.entity.show.MarkEntity; @@ -123,15 +122,15 @@ List<MarkJsonEntity> points = getMarkByType(list, "POINT"); if (points.size() > 0) { String pointFile = GdalHelper.createShp(points, path, "POINT"); String pointFile = ShpHelper.createShp(points, path, "POINT"); } List<MarkJsonEntity> lines = getMarkByType(list, "LINESTRING"); if (lines.size() > 0) { String lineFile = GdalHelper.createShp(lines, path, "LINESTRING"); String lineFile = ShpHelper.createShp(lines, path, "LINESTRING"); } List<MarkJsonEntity> polygons = getMarkByType(list, "POLYGON"); if (polygons.size() > 0) { String polygonFile = GdalHelper.createShp(polygons, path, "POLYGON"); String polygonFile = ShpHelper.createShp(polygons, path, "POLYGON"); } return path; @@ -217,7 +216,7 @@ return null; } List<MarkJsonEntity> mjeList = GdalHelper.readShpForMarks(fileName); List<MarkJsonEntity> mjeList = ShpHelper.readShpForMarks(fileName); FileHelper.deleteFiles(list); return mjeList;