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;
|
}
|
}
|
|
/**
|
* 读取数据
|
*/
|
public static <T> List<T> readData(Class clazz, String filePath) {
|
List<T> list = new ArrayList<>();
|
try {
|
org.gdal.ogr.Driver driver = ogr.GetDriverByName("ESRI shapefile");
|
if (null == driver) {
|
return list;
|
}
|
|
DataSource dataSource = driver.Open(filePath);
|
if (null == dataSource) {
|
return list;
|
}
|
|
Layer layer = dataSource.GetLayer(0);
|
|
GdbHelper.readLayer(clazz, layer, list);
|
|
dataSource.delete();
|
driver.delete();
|
} catch (Exception ex) {
|
log.error(ex.getMessage(), ex);
|
}
|
|
return list;
|
}
|
}
|