package com.se.simu.helper;
|
|
import cn.hutool.core.io.FileUtil;
|
import cn.hutool.json.JSONArray;
|
import com.se.simu.domain.SeField;
|
import com.se.simu.domain.SeLayer;
|
import lombok.extern.slf4j.Slf4j;
|
import org.gdal.ogr.*;
|
|
import java.util.List;
|
|
/**
|
* ShapeFile帮助类
|
*
|
* @author WWW
|
* @date 2024-09-13
|
*/
|
@Slf4j
|
@SuppressWarnings("ALL")
|
public class ShpHelper {
|
public static boolean createShp(String filePath, SeLayer seLayer) {
|
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;
|
|
int geoType = getGeometryType(seLayer.getQueryType());
|
layer = dataSource.CreateLayer(FileUtil.getName(filePath), seLayer.getDb().getSpatialReference(), geoType);
|
if (null == layer) return false;
|
|
createLayerFields(layer, seLayer.getFields());
|
|
FeatureDefn featureDefn = layer.GetLayerDefn();
|
for (int i = 0, c = seLayer.getData().size(); i < c; i++) {
|
Feature f = new Feature(featureDefn);
|
setFeatureData(f, seLayer.getFields(), seLayer.getData().getJSONArray(i));
|
Geometry g = createGeometry();
|
|
layer.CreateFeature(f);
|
}
|
|
return true;
|
} catch (Exception ex) {
|
log.error(ex.getMessage(), ex);
|
return false;
|
} finally {
|
GdalHelper.delete(layer, dataSource, driver);
|
}
|
}
|
|
private static void setFeatureData(Feature f, List<SeField> fields, JSONArray arr) {
|
//
|
|
}
|
|
private static Geometry createGeometry() {
|
Geometry g = null;
|
//
|
|
return g;
|
}
|
|
private static int getGeometryType(String type) {
|
switch (type) {
|
case "point":
|
return ogr.wkbPoint;
|
case "polyline":
|
return ogr.wkbMultiLineString;
|
case "polygon":
|
return ogr.wkbMultiPolygon;
|
default:
|
return ogr.wkbUnknown;
|
}
|
}
|
|
private static void createLayerFields(Layer layer, List<SeField> fields) {
|
for (int i = 0, c = fields.size(); i < c; i++) {
|
SeField f = fields.get(i);
|
FieldDefn fd = new FieldDefn(f.getName(), getFieldType(f));
|
|
layer.CreateField(fd, i);
|
}
|
}
|
|
private static Integer getFieldType(SeField f) {
|
switch (f.getType()) {
|
case "int":
|
return ogr.OFTInteger;
|
case "long":
|
return ogr.OFTInteger64;
|
case "double":
|
return ogr.OFTReal;
|
case "datetime":
|
return ogr.OFTDateTime;
|
default:
|
return ogr.OFTString;
|
}
|
}
|
}
|