1.pom.xml
增加下列代码
<repositories>
<repository>
<id>osgeo</id>
<name>OSGeo Release Repository</name>
<url>https://repo.osgeo.org/repository/release/</url>
<snapshots><enabled>false</enabled></snapshots>
<releases><enabled>true</enabled></releases>
</repository>
<repository>
<id>osgeo-snapshot</id>
<name>OSGeo Snapshot Repository</name>
<url>https://repo.osgeo.org/repository/snapshot/</url>
<snapshots><enabled>true</enabled></snapshots>
<releases><enabled>false</enabled></releases>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-shapefile</artifactId>
<version>20.3</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-api</artifactId>
<version>20.3</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-geojson</artifactId>
<version>20.3</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-geometry</artifactId>
<version>20.3</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-jts-wrapper</artifactId>
<version>20.3</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-main</artifactId>
<version>20.3</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
<version>20.3</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-opengis</artifactId>
<version>20.3</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-data</artifactId>
<version>20.3</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-referencing</artifactId>
<version>20.3</version>
</dependency>
</dependencies>
2.geotools中shp和geojson格式的相互转换
geotools中shp和geojson格式的相互转换 - LZU-GIS - 博客园
package com.lzugis.geotools;
import java.io.File;
import java.io.Reader;
import java.io.Serializable;
import java.io.StringReader;
import java.io.StringWriter;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
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 com.amazonaws.util.json.JSONArray;
import com.amazonaws.util.json.JSONObject;
import com.lzugis.CommonMethod;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.MultiLineString;
import com.vividsolutions.jts.geom.MultiPoint;
import com.vividsolutions.jts.geom.MultiPolygon;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.geom.Polygon;
public class FileFormat {
private static CommonMethod cm = new CommonMethod();
/**
* geojson转换为shp文件
* @param jsonPath
* @param shpPath
* @return
*/
public Map geojson2Shape(String jsonPath, String shpPath){
Map map = new HashMap();
GeometryJSON gjson = new GeometryJSON();
try{
String strJson = cm.getFileContent(jsonPath);
JSONObject json = new JSONObject(strJson);
JSONArray features = (JSONArray) json.get("features");
JSONObject feature0 = new JSONObject(features.get(0).toString());
System.out.println(feature0.toString());
String strType = ((JSONObject)feature0.get("geometry")).getString("type").toString();
Class<?> geoType = null;
switch(strType){
case "Point":
geoType = Point.class;
case "MultiPoint":
geoType = MultiPoint.class;
case "LineString":
geoType = LineString.class;
case "MultiLineString":
geoType = MultiLineString.class;
case "Polygon":
geoType = Polygon.class;
case "MultiPolygon":
geoType = MultiPolygon.class;
}
//创建shape文件对象
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);
tb.add("POIID", Long.class);
ds.createSchema(tb.buildFeatureType());
//设置编码
Charset charset = Charset.forName("GBK");
ds.setCharset(charset);
//设置Writer
FeatureWriter<SimpleFeatureType, SimpleFeature> writer = ds.getFeatureWriter(ds.getTypeNames()[0], Transaction.AUTO_COMMIT);
for(int i=0,len=features.length();i<len;i++){
String strFeature = features.get(i).toString();
Reader reader = new StringReader(strFeature);
SimpleFeature feature = writer.next();
feature.setAttribute("the_geom",gjson.readMultiPolygon(reader));
feature.setAttribute("POIID",i);
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;
}
/**
* shp转换为Geojson
* @param shpPath
* @return
*/
public Map shape2Geojson(String shpPath, String jsonPath){
Map map = new HashMap();
FeatureJSON fjson = new FeatureJSON();
try{
StringBuffer sb = new StringBuffer();
sb.append("{\"type\": \"FeatureCollection\",\"features\": ");
File file = new File(shpPath);
ShapefileDataStore shpDataStore = null;
shpDataStore = new ShapefileDataStore(file.toURL());
//设置编码
Charset charset = Charset.forName("GBK");
shpDataStore.setCharset(charset);
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);
JSONObject json = new JSONObject(writer.toString());
array.put(json);
}
itertor.close();
sb.append(array.toString());
sb.append("}");
//写入文件
cm.append2File(jsonPath, sb.toString());
map.put("status", "success");
map.put("message", sb.toString());
}
catch(Exception e){
map.put("status", "failure");
map.put("message", e.getMessage());
e.printStackTrace();
}
return map;
}
/**
* 工具类测试方法
* @param args
*/
public static void main(String[] args){
FileFormat fileFormat = new FileFormat();
long start = System.currentTimeMillis();
String shpPath = "/Users/lzugis/Documents/chinadata/cityboundry.shp";
String jsonPath = "/Users/lzugis/Documents/chinadata/cityboundry.geojson";
Map map = fileFormat.shape2Geojson(shpPath, jsonPath);
// String shpPath = "D:/data/beijing/China43262.shp";
// String jsonPath = "D:/data/beijing/China4326.geojson";
// Map map = fileFormat.geojson2Shape(jsonPath, shpPath);
System.out.println(jsonPath+",共耗时"+(System.currentTimeMillis() - start)+"ms");
}
/**
*
* @param shpPath shp文件路径
* @return geojson数据
*/
public static Object shape2Geojson(String shpPath){
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());
//设置编码
Charset charset = Charset.forName("GBK");
shpDataStore.setCharset(charset);
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();
byte[] b=temp.getBytes("iso8859-1");
temp=new String(b,"gbk");
JSONObject json = JSON.parseObject(temp);
array.add(json);
}
geojsonObject.put("features",array);
itertor.close();
}
catch(Exception e){
e.printStackTrace();
}
return geojsonObject;
}
}