JSON2Shape.java 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. package com.onemap.file.utils;
  2. import com.alibaba.fastjson.JSONObject;
  3. import org.geotools.data.FeatureWriter;
  4. import org.geotools.data.Transaction;
  5. import org.geotools.data.shapefile.ShapefileDataStore;
  6. import org.geotools.data.shapefile.ShapefileDataStoreFactory;
  7. import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
  8. import org.geotools.geojson.geom.GeometryJSON;
  9. import org.geotools.referencing.crs.DefaultGeographicCRS;
  10. import org.locationtech.jts.geom.*;
  11. import org.opengis.feature.simple.SimpleFeature;
  12. import org.opengis.feature.simple.SimpleFeatureType;
  13. import java.io.*;
  14. import java.util.HashMap;
  15. import java.util.List;
  16. import java.util.Map;
  17. public class JSON2Shape {
  18. public static void main(String[] args) {
  19. geojson2Shape("C:\\TEMP\\India.geojson", "C:\\TEMP\\college.shp");
  20. }
  21. public static void geojson2Shape(String jsonPath, String shpPath) {
  22. GeometryJSON geojson = new GeometryJSON();
  23. try {
  24. String geojsonStr = readJson(jsonPath);
  25. Map<String, Object> geojsonMap = JSONObject.parseObject(geojsonStr, Map.class);
  26. List<Map> features = (List<Map>) geojsonMap.get("features");
  27. Map geojsonExemple = features.get(0);
  28. String geojsonType = ((Map) geojsonExemple.get("geometry")).get("type").toString();
  29. Map<String, Class> mapFields = new HashMap();
  30. for (int i = 0; i < features.size(); i++) {
  31. Map<String, Object> attributes = (Map<String, Object>) features.get(i).get("properties");
  32. for (String key : attributes.keySet()) {
  33. Class type = attributes.get(key).getClass();
  34. mapFields.put(key, type);
  35. }
  36. }
  37. Class<?> geoType = null;
  38. switch (geojsonType) {
  39. case "Point":
  40. geoType = Point.class;
  41. break;
  42. case "MultiPoint":
  43. geoType = MultiPoint.class;
  44. break;
  45. case "LineString":
  46. geoType = LineString.class;
  47. break;
  48. case "MultiLineString":
  49. geoType = MultiLineString.class;
  50. break;
  51. case "Polygon":
  52. geoType = Polygon.class;
  53. break;
  54. case "MultiPolygon":
  55. geoType = MultiPolygon.class;
  56. break;
  57. }
  58. //创建shape文件对象
  59. File file = new File(shpPath);
  60. Map<String, Serializable> params = new HashMap<String, Serializable>();
  61. params.put(ShapefileDataStoreFactory.URLP.key, file.toURI().toURL());
  62. ShapefileDataStore ds = (ShapefileDataStore) new ShapefileDataStoreFactory().createNewDataStore(params);
  63. //定义图形信息和属性信息
  64. SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder();
  65. tb.setCRS(DefaultGeographicCRS.WGS84);
  66. tb.setName("shapefile");
  67. tb.add("the_geom", geoType);
  68. for (String key : mapFields.keySet()) {
  69. tb.add(key, mapFields.get(key));
  70. }
  71. ds.createSchema(tb.buildFeatureType());
  72. //设置Writer
  73. FeatureWriter<SimpleFeatureType, SimpleFeature> writer = ds.
  74. getFeatureWriter(ds.getTypeNames()[0], Transaction.AUTO_COMMIT);
  75. for (int i = 0, len = features.size(); i < len; i++) {
  76. Map oneGeojson = features.get(i);
  77. Map<String, Object> attributes = (Map<String, Object>) oneGeojson.get("properties");
  78. String strFeature = JSONObject.toJSONString(oneGeojson);
  79. Reader reader = new StringReader(strFeature);
  80. SimpleFeature feature = writer.next();
  81. switch (geojsonType) {
  82. case "Point":
  83. feature.setAttribute("the_geom", geojson.readPoint(reader));
  84. break;
  85. case "MultiPoint":
  86. feature.setAttribute("the_geom", geojson.readMultiPoint(reader));
  87. break;
  88. case "LineString":
  89. feature.setAttribute("the_geom", geojson.readLine(reader));
  90. break;
  91. case "MultiLineString":
  92. feature.setAttribute("the_geom", geojson.readMultiLine(reader));
  93. break;
  94. case "Polygon":
  95. feature.setAttribute("the_geom", geojson.readPolygon(reader));
  96. break;
  97. case "MultiPolygon":
  98. feature.setAttribute("the_geom", geojson.readMultiPolygon(reader));
  99. break;
  100. }
  101. for (String key : attributes.keySet()) {
  102. feature.setAttribute(key, attributes.get(key));
  103. }
  104. writer.write();
  105. }
  106. writer.close();
  107. ds.dispose();
  108. } catch (Exception e) {
  109. System.out.println("转换失败");
  110. e.printStackTrace();
  111. }
  112. }
  113. /**
  114. * 读取文件
  115. *
  116. * @param filepath 文件路径
  117. * @throws IOException
  118. */
  119. public static String readJson(String filepath) {
  120. FileReader re = null;
  121. BufferedReader buff = null;
  122. String line = "";
  123. try {
  124. File file = new File(filepath);
  125. re = new FileReader(file);
  126. buff = new BufferedReader(re);
  127. String tempString = null;
  128. while ((tempString = buff.readLine()) != null) {
  129. line += tempString;
  130. }
  131. return line;
  132. } catch (Exception e) {
  133. System.out.println("失败了");
  134. } finally {
  135. try {
  136. re.close();
  137. buff.close();
  138. } catch (IOException e) {
  139. e.printStackTrace();
  140. }
  141. }
  142. return line;
  143. }
  144. }