package com.moon.server.helper;
|
|
import com.moon.server.entity.all.StaticData;
|
import com.moon.server.entity.ctrl.MarkJsonEntity;
|
import com.moon.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<MarkJsonEntity> 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<Integer, Field> 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<Integer, Field> getShpFields(Layer layer) {
|
FeatureDefn featureDefn = layer.GetLayerDefn();
|
|
Map<Integer, Field> 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<MarkJsonEntity> setMarkJsonEntity(Layer layer, Map<Integer, Field> fieldMap) throws Exception {
|
List<MarkJsonEntity> list = new ArrayList<>();
|
for (int i = 0; i < layer.GetFeatureCount(); i++) {
|
Feature f = layer.GetFeature(i);
|
|
MarkJsonEntity me = new MarkJsonEntity(i + 1L);
|
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<MarkJsonEntity> 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(StaticData.I4326);
|
|
int geoType = getGeometryType(type);
|
layer = dataSource.CreateLayer(type.toLowerCase(), sr, geoType);
|
if (null == layer) {
|
return null;
|
}
|
|
List<Field> 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 <T> List<T> readData(Class clazz, String filePath, boolean isTransform) {
|
List<T> 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, isTransform);
|
} catch (Exception ex) {
|
log.error(ex.getMessage(), ex);
|
} finally {
|
GdbHelper.delete(dataSource, driver);
|
}
|
|
return list;
|
}
|
}
|