| | |
| | | |
| | | 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 lombok.extern.slf4j.Slf4j; |
| | | import org.gdal.ogr.*; |
| | | |
| | | import java.sql.Timestamp; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | 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(); |
| | | JSONObject data = seLayer.getData().getJSONObject(i).getJSONObject("properties"); |
| | | setFeatureData(f, seLayer.getFields(), data); |
| | | |
| | | JSONObject geom = seLayer.getData().getJSONObject(i).getJSONObject("geometry"); |
| | | Geometry g = createGeometry(seLayer, geom); |
| | | f.SetGeometry(g); |
| | | |
| | | layer.CreateFeature(f); |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | private static void setFeatureData(Feature f, List<SeField> fields, JSONArray arr) { |
| | | private static void setFeatureData(Feature f, List<SeField> fields, JSONObject data) { |
| | | for (int i = 0, c = fields.size(); i < c; i++) { |
| | | SeField seField = fields.get(i); |
| | | switch (seField.getType()) { |
| | | case "int": |
| | | |
| | | f.SetField(i, data.getInt(seField.getName())); |
| | | break; |
| | | case "long": |
| | | |
| | | f.SetField(i, data.getLong(seField.getName())); |
| | | break; |
| | | case "double": |
| | | |
| | | f.SetField(i, data.getDouble(seField.getName())); |
| | | break; |
| | | case "datetime": |
| | | |
| | | long date = data.getLong(seField.getName()); |
| | | Timestamp time = new Timestamp(date); |
| | | setTimestamp(f, i, time); |
| | | break; |
| | | default: |
| | | |
| | | f.SetField(i, data.getStr(seField.getName())); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | private static Geometry createGeometry() { |
| | | Geometry g = null; |
| | | // |
| | | private static void setTimestamp(Feature f, int i, Timestamp time) { |
| | | if (null == time) return; |
| | | |
| | | LocalDateTime local = time.toLocalDateTime(); |
| | | f.SetField(i, local.getYear(), local.getMonthValue(), local.getDayOfMonth(), local.getHour(), local.getMinute(), local.getSecond(), 8); |
| | | } |
| | | |
| | | /** |
| | | * 创建Geometry对象 |
| | | */ |
| | | private static Geometry createGeometry(SeLayer seLayer, JSONObject geom) { |
| | | String type = geom.getStr("type"); |
| | | JSONArray cs = geom.getJSONArray("coordinates"); |
| | | |
| | | Geometry g = null; |
| | | switch (type) { |
| | | case "Point": |
| | | g = new Geometry(ogr.wkbPoint); |
| | | g.AddPoint_2D(cs.getDouble(0), cs.getDouble(1)); |
| | | break; |
| | | case "MultiLineString": |
| | | //g = new Geometry(ogr.wkbMultiLineString); |
| | | Geometry line = new Geometry(ogr.wkbLineString); |
| | | //g.AddGeometry(line); |
| | | cs = cs.getJSONArray(0).getJSONArray(0); |
| | | for (int i = 0, c = cs.size(); i < c; i++) { |
| | | JSONArray arr = cs.getJSONArray(i); |
| | | line.AddPoint_2D(arr.getDouble(0), arr.getDouble(1)); |
| | | } |
| | | g = line; |
| | | break; |
| | | case "MultiPolygon": |
| | | //g = new Geometry(ogr.wkbMultiPolygon); |
| | | Geometry ring = new Geometry(ogr.wkbLinearRing); |
| | | //g.AddGeometry(line); |
| | | cs = cs.getJSONArray(0).getJSONArray(0); |
| | | for (int i = 0, c = cs.size(); i < c; i++) { |
| | | JSONArray arr = cs.getJSONArray(i); |
| | | ring.AddPoint_2D(arr.getDouble(0), arr.getDouble(1)); |
| | | } |
| | | g = ring; |
| | | break; |
| | | } |
| | | return g; |
| | | } |
| | | |