java实现geojson格式数据与shp文件相互转换
package com.zimax.zplan.admin.util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.vividsolutions.jts.geom.*;
import org.geotools.data.FeatureWriter;
import org.geotools.data.Transaction;
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.shapefile.ShapefileDataStoreFactory;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
import org.geotools.geojson.feature.FeatureJSON;
import org.geotools.geojson.geom.GeometryJSON;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import java.io.*;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class ShpToGeojson {
public Map geojson2Shape(String jsonPath, String shpPath) {
Map map = new HashMap();
GeometryJSON gjson = new GeometryJSON();
try {
StringBuffer sb = new StringBuffer();
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(jsonPath));
String str;
while ((str = br.readLine()) != null) {
sb.append(str + "\r\n");
}
br.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
JSONObject json = JSONObject.parseObject(sb.toString());
JSONArray features = (JSONArray) json.get("features");
JSONObject feature0 = JSONObject.parseObject(features.get(0).toString());
Set properties = JSONObject.parseObject(feature0.getString("properties")).keySet();
String strType = ((JSONObject) feature0.get("geometry")).getString("type").toString();
Class<?> geoType = null;
switch (strType) {
case "Point":
geoType = Point.class;
break;
case "MultiPoint":
geoType = MultiPoint.class;
break;
case "LineString":
geoType = LineString.class;
break;
case "MultiLineString":
geoType = MultiLineString.class;
break;
case "Polygon":
geoType = Polygon.class;
break;
case "MultiPolygon":
geoType = MultiPolygon.class;
break;
}
File file = new File(shpPath);
Map<String, Serializable> params = new HashMap<String, Serializable>();
params.put(ShapefileDataStoreFactory.URLP.key, file.toURI().toURL());
ShapefileDataStore ds = (ShapefileDataStore) new ShapefileDataStoreFactory().createNewDataStore(params);
SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder();
tb.setCRS(DefaultGeographicCRS.WGS84);
tb.setName("shapefile");
tb.add("the_geom", geoType);
Iterator propertiesIter = properties.iterator();
while (propertiesIter.hasNext()) {
String str = propertiesIter.next().toString();
tb.add(str, String.class);
}
ds.createSchema(tb.buildFeatureType());
Charset charset = Charset.forName("GBK");
ds.setCharset(charset);
FeatureWriter<SimpleFeatureType, SimpleFeature> writer = ds.getFeatureWriter(ds.getTypeNames()[0],
Transaction.AUTO_COMMIT);
for (int i = 0, len = features.size(); i < len; i++) {
String strFeature = features.get(i).toString();
Reader reader = new StringReader(strFeature);
SimpleFeature feature = writer.next();
switch (strType) {
case "Point":
feature.setAttribute("the_geom", gjson.readPoint(reader));
break;
case "MultiPoint":
feature.setAttribute("the_geom", gjson.readMultiPoint(reader));
break;
case "LineString":
feature.setAttribute("the_geom", gjson.readLine(reader));
break;
case "MultiLineString":
feature.setAttribute("the_geom", gjson.readMultiLine(reader));
break;
case "Polygon":
feature.setAttribute("the_geom", gjson.readPolygon(reader));
break;
case "MultiPolygon":
feature.setAttribute("the_geom", gjson.readMultiPolygon(reader));
break;
}
Iterator propertiesset = properties.iterator();
while (propertiesset.hasNext()) {
String str = propertiesset.next().toString();
JSONObject featurei = JSONObject.parseObject(features.get(i).toString());
feature.setAttribute(str, JSONObject.parseObject(featurei.getString("properties")).get(str));
}
writer.write();
}
writer.close();
ds.dispose();
map.put("status", "success");
map.put("message", shpPath);
} catch (Exception e) {
map.put("status", "failure");
map.put("message", e.getMessage());
e.printStackTrace();
}
return map;
}
public static Object shp2geojson(String shpPath)
{
Map map = new HashMap();
FeatureJSON fjson = new FeatureJSON();
JSONObject geojsonObject=new JSONObject();
geojsonObject.put("type","FeatureCollection");
try{
File file = new File(shpPath);
ShapefileDataStore shpDataStore = null;
shpDataStore = new ShapefileDataStore(file.toURL());
String typeName = shpDataStore.getTypeNames()[0];
SimpleFeatureSource featureSource = null;
featureSource = shpDataStore.getFeatureSource (typeName);
SimpleFeatureCollection result = featureSource.getFeatures();
SimpleFeatureIterator itertor = result.features();
JSONArray array = new JSONArray();
while (itertor.hasNext())
{
SimpleFeature feature = itertor.next();
StringWriter writer = new StringWriter();
fjson.writeFeature(feature, writer);
String temp=writer.toString();
Object geometry = JSONObject.parseObject(temp).getString("geometry");
byte[] b=temp.getBytes("iso8859-1");
temp=new String(b,"gbk");
JSONObject json = JSON.parseObject(temp);
array.add(geometry);
}
itertor.close();
return array;
}
catch(Exception e){
map.put("status", "failure");
map.put("message", e.getMessage());
e.printStackTrace();
}
return geojsonObject;
}
public static void main(String[] args) {
ShpToGeojson shpToGeojson = new ShpToGeojson();
long start = System.currentTimeMillis();
String shpPath = "D:/矢量下载/123.shp";
String jsonPath = "D:/123.geojson";
Map map = shpToGeojson.geojson2Shape(jsonPath, shpPath);
System.out.println(shpPath +" "+ jsonPath + ",共耗时" + (System.currentTimeMillis() - start) + "ms");
}
}