package com.lf.server.helper; import com.lf.server.entity.all.StaticData; 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) { Driver driver = null; DataSource dataSource = null; Layer layer = null; try { driver = ogr.GetDriverByName("ESRI shapefile"); if (null == driver) { return null; } dataSource = driver.Open(filePath); if (null == dataSource) { return null; } 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(); return new ShpRecordEntity(wkt, csid); } catch (Exception ex) { log.error(ex.getMessage(), ex); return null; } finally { GdbHelper.delete(layer, dataSource, driver); } } /** * 读取ShapeFile文件获取Mark实体类 */ public static List readShpForMarks(String filePath) { Driver driver = null; DataSource dataSource = null; Layer layer = null; try { driver = ogr.GetDriverByName("ESRI shapefile"); if (null == driver) { return null; } dataSource = driver.Open(filePath); if (null == dataSource) { return null; } layer = dataSource.GetLayer(0); if (layer.GetFeatureCount() == 0) { return null; } Map fields = getShpFields(layer); return setMarkJsonEntity(layer, fields); } catch (Exception ex) { log.error(ex.getMessage(), ex); return null; } finally { GdbHelper.delete(layer, dataSource, driver); } } /** * 获取shp字段信息 */ private static Map getShpFields(Layer layer) { FeatureDefn featureDefn = layer.GetLayerDefn(); Map fields = new HashMap(3); for (int i = 0, count = featureDefn.GetFieldCount(); i < count; i++) { try { FieldDefn fieldDefn = featureDefn.GetFieldDefn(i); Field field = MarkJsonEntity.class.getDeclaredField(fieldDefn.GetName()); field.setAccessible(true); fields.put(i, field); } catch (Exception e) { // } } return fields; } /** * 设置标绘实体类 */ private static List setMarkJsonEntity(Layer layer, Map fieldMap) throws Exception { List list = new ArrayList<>(); for (int i = 0; i < layer.GetFeatureCount(); i++) { Feature f = layer.GetFeature(i); MarkJsonEntity me = new MarkJsonEntity(i + 1); for (Integer key : fieldMap.keySet()) { Field field = fieldMap.get(key); GdbHelper.setValue(me, f, field, key); } me.setWkt(f.GetGeometryRef().ExportToWkt()); list.add(me); } return list; } /** * 创建ShapeFile文件 * * @param list 标绘JSON实体类集合 * @param path 路径 * @param type 类型:POINT,LINESTRING,POLYGON * @return ShapeFile文件名 */ public static String createShp(List list, String path, String type) { Driver driver = null; DataSource dataSource = null; Layer layer = null; try { driver = ogr.GetDriverByName("ESRI shapefile"); if (null == driver) { return null; } String filePath = path + File.separator + type.toLowerCase() + ".shp"; // DataSource ds = driver.Open(filePath, 0) dataSource = driver.CreateDataSource(filePath, null); if (null == dataSource) { return null; } SpatialReference sr = new SpatialReference(); sr.ImportFromEPSG(4326); int geoType = getGeometryType(type); layer = dataSource.CreateLayer(type.toLowerCase(), sr, geoType); if (null == layer) { return null; } List fields = new ArrayList<>(); GdbHelper.getFields(MarkJsonEntity.class, fields, StaticData.MARK_EXCLUDE_FIELDS); GdbHelper.addLayerField(layer, fields); FeatureDefn featureDefn = layer.GetLayerDefn(); for (MarkJsonEntity t : list) { Feature f = new Feature(featureDefn); GdbHelper.setFeatureData(f, fields, t); Geometry geo = Geometry.CreateFromWkt(t.getWkt()); f.SetGeometry(geo); layer.CreateFeature(f); } return filePath; } catch (Exception ex) { log.error(ex.getMessage(), ex); return null; } finally { GdbHelper.delete(layer, dataSource, driver); } } /** * 获取图形类型 */ private static int getGeometryType(String type) { switch (type) { case "POINT": return ogr.wkbPoint; case "LINESTRING": return ogr.wkbLineString; case "POLYGON": return ogr.wkbPolygon; default: return ogr.wkbUnknown; } } /** * 读取数据 */ public static List readData(Class clazz, String filePath) { List list = new ArrayList<>(); Driver driver = null; DataSource dataSource = null; try { driver = ogr.GetDriverByName("ESRI shapefile"); if (null == driver) { return list; } dataSource = driver.Open(filePath); if (null == dataSource) { return list; } Layer layer = dataSource.GetLayer(0); GdbHelper.readLayer(clazz, layer, list); } catch (Exception ex) { log.error(ex.getMessage(), ex); } finally { GdbHelper.delete(dataSource, driver); } return list; } }