| | |
| | | import cn.hutool.core.io.FileUtil; |
| | | import cn.hutool.json.JSONArray; |
| | | import cn.hutool.json.JSONObject; |
| | | import com.se.simu.domain.SeField; |
| | | import com.se.simu.domain.SeLayer; |
| | | import com.se.simu.domain.dto.GeField; |
| | | import com.se.simu.domain.dto.GeLayer; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.gdal.ogr.*; |
| | | |
| | |
| | | return options; |
| | | } |
| | | |
| | | public static boolean createShp(String filePath, SeLayer seLayer) { |
| | | public static boolean createShp(String filePath, GeLayer geLayer) { |
| | | Driver driver = null; |
| | | DataSource dataSource = null; |
| | | Layer layer = null; |
| | |
| | | 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, getOptions()); |
| | | int geoType = getGeometryType(geLayer.getQueryType()); |
| | | layer = dataSource.CreateLayer(FileUtil.getName(filePath), geLayer.getDb().getSpatialReference(), geoType, getOptions()); |
| | | if (null == layer) return false; |
| | | |
| | | createLayerFields(layer, seLayer.getFields()); |
| | | createLayerFields(layer, geLayer.getFields()); |
| | | |
| | | FeatureDefn featureDefn = layer.GetLayerDefn(); |
| | | for (int i = 0, c = seLayer.getData().size(); i < c; i++) { |
| | | for (int i = 0, c = geLayer.getData().size(); i < c; i++) { |
| | | Feature f = new Feature(featureDefn); |
| | | JSONObject data = seLayer.getData().getJSONObject(i).getJSONObject("properties"); |
| | | setFeatureData(f, seLayer.getFields(), data); |
| | | JSONObject data = geLayer.getData().getJSONObject(i).getJSONObject("properties"); |
| | | setFeatureData(f, geLayer.getFields(), data); |
| | | |
| | | JSONObject geom = seLayer.getData().getJSONObject(i).getJSONObject("geometry"); |
| | | Geometry g = createGeometry(seLayer, geom); |
| | | JSONObject geom = geLayer.getData().getJSONObject(i).getJSONObject("geometry"); |
| | | Geometry g = createGeometry(geLayer, geom); |
| | | f.SetGeometry(g); |
| | | |
| | | layer.CreateFeature(f); |
| | |
| | | } |
| | | } |
| | | |
| | | private static void setFeatureData(Feature f, List<SeField> fields, JSONObject data) { |
| | | private static void setFeatureData(Feature f, List<GeField> fields, JSONObject data) { |
| | | for (int i = 0, c = fields.size(); i < c; i++) { |
| | | SeField seField = fields.get(i); |
| | | switch (seField.getType()) { |
| | | GeField geField = fields.get(i); |
| | | switch (geField.getType()) { |
| | | case "int": |
| | | f.SetField(i, data.getInt(seField.getName())); |
| | | f.SetField(i, data.getInt(geField.getName())); |
| | | break; |
| | | case "long": |
| | | f.SetField(i, data.getLong(seField.getName())); |
| | | f.SetField(i, data.getLong(geField.getName())); |
| | | break; |
| | | case "double": |
| | | f.SetField(i, data.getDouble(seField.getName())); |
| | | f.SetField(i, data.getDouble(geField.getName())); |
| | | break; |
| | | case "datetime": |
| | | long date = data.getLong(seField.getName()); |
| | | long date = data.getLong(geField.getName()); |
| | | Timestamp time = new Timestamp(date); |
| | | setTimestamp(f, i, time); |
| | | break; |
| | | default: |
| | | f.SetField(i, data.getStr(seField.getName())); |
| | | f.SetField(i, data.getStr(geField.getName())); |
| | | break; |
| | | } |
| | | } |
| | |
| | | /** |
| | | * 创建Geometry对象 |
| | | */ |
| | | private static Geometry createGeometry(SeLayer seLayer, JSONObject geom) { |
| | | private static Geometry createGeometry(GeLayer geLayer, JSONObject geom) { |
| | | String type = geom.getStr("type"); |
| | | JSONArray cs = geom.getJSONArray("coordinates"); |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | private static void createLayerFields(Layer layer, List<SeField> fields) { |
| | | private static void createLayerFields(Layer layer, List<GeField> fields) { |
| | | for (int i = 0, c = fields.size(); i < c; i++) { |
| | | SeField f = fields.get(i); |
| | | GeField f = fields.get(i); |
| | | FieldDefn fd = new FieldDefn(f.getName(), getFieldType(f)); |
| | | |
| | | layer.CreateField(fd, i); |
| | | } |
| | | } |
| | | |
| | | private static Integer getFieldType(SeField f) { |
| | | private static Integer getFieldType(GeField f) { |
| | | switch (f.getType()) { |
| | | case "int": |
| | | return ogr.OFTInteger; |