简要说明
将shpfile转featureCollection
maven 依赖
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-shapefile</artifactId>
<version>27.0</version>
</dependency>
<dependency>
<groupId>org.geotools.jdbc</groupId>
<artifactId>gt-jdbc-postgis</artifactId>
<version>27.0</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-referencing</artifactId>
<version>27.0</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-render</artifactId>
<version>27.0</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-coverage</artifactId>
<version>27.0</version>
</dependency>
<dependency>
<groupId>it.geosolutions.imageio-ext</groupId>
<artifactId>imageio-ext-utilities</artifactId>
<version>1.4.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.conversantmedia/disruptor -->
<dependency>
<groupId>com.conversantmedia</groupId>
<artifactId>disruptor</artifactId>
<version>1.2.15</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.geotools/gt-geojson -->
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-geojson</artifactId>
<version>27.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.geotools/gt-epsg-hsql -->
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
<version>27.0</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-main</artifactId>
<version>27.0</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-opengis</artifactId>
<version>27.0</version>
</dependency>
<dependency>
<groupId>si.uom</groupId>
<artifactId>si-quantity</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>si.uom</groupId>
<artifactId>si-units</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>tech.uom.lib</groupId>
<artifactId>uom-lib-common</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>systems.uom</groupId>
<artifactId>systems-common</artifactId>
<version>2.0.2</version>
</dependency>
样例代码
public static void main(String[] args) {
String featureCollection = getFeatureCollectionFromFile();
System.out.println(featureCollection);
}
/**
* 获取shpfile的featureCollection
*
* @return
*/
private static String getFeatureCollectionFromFile() {
File file = new File("D:\\xxx.shp");
Map<String, Object> params = new HashMap<String, Object>();
ShapefileDataStore dataStore = null;
SimpleFeatureType simpleFeatureType = null;
try {
params.put("url", file.toURI().toURL());
dataStore = (ShapefileDataStore) DataStoreFinder.getDataStore(params);
dataStore.setCharset(Charset.forName("GBK"));
FeatureSource featureSource = dataStore.getFeatureSource(dataStore.getTypeNames()[0]);
FeatureCollection featureCollection = featureSource.getFeatures();
FeatureIterator featureIterator = featureCollection.features();
Feature firstFeature = featureIterator.next();
Collection<Property> firstProperties = firstFeature.getProperties();
//针对不同的空间类型
List<String> geometryTypelist = Arrays.asList("point", "linestring", "polygon", "multipoint", "multilinestring", "multipolygon");
Property geoProperty = firstProperties.stream().filter(f -> geometryTypelist.contains(f.getType().getName().toString().toLowerCase())).findFirst().orElse(null);
String geoNameStr = geoProperty.getName().toString();
String geoTypeStr = geoProperty.getType().getName().toString();
StringBuilder typeSpecBuilder = new StringBuilder("geometry:");
typeSpecBuilder.append(geoTypeStr);
for (Property property : firstProperties) {
String columnStr = property.getName().toString();
if (columnStr.equals(geoNameStr)) {
continue;
}
typeSpecBuilder.append(",").append(columnStr).append(":").append(convertShpFieldType2Str(property.getType().getBinding()));
}
simpleFeatureType = DataUtilities.createType("simpleFeature", typeSpecBuilder.toString());
//SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(simpleFeatureType);
FeatureJSON fjson = new FeatureJSON(new GeometryJSON(6));
List<SimpleFeature> features = new ArrayList<>();
SimpleFeatureCollection collection = new ListFeatureCollection(simpleFeatureType, features);
CRSAuthorityFactory factory = CRS.getAuthorityFactory(true);
//第一条数据转坐标系
Geometry firstGeometry = (Geometry) ((SimpleFeature) firstFeature).getDefaultGeometry();
SimpleFeatureType sourceSimpleFeatureType = dataStore.getSchema();
CoordinateReferenceSystem coordinateReferenceSystem = sourceSimpleFeatureType.getCoordinateReferenceSystem();
ConvertCoordinateReferenceSystem(factory, coordinateReferenceSystem, (SimpleFeature)firstFeature, firstGeometry);
features.add((SimpleFeature) firstFeature);
while (featureIterator.hasNext()) {
SimpleFeature feature = (SimpleFeature) featureIterator.next();
Geometry sourceGeometry = (Geometry)feature.getDefaultGeometry();
ConvertCoordinateReferenceSystem(factory, coordinateReferenceSystem, feature, sourceGeometry);
features.add(feature);
}
featureIterator.close();
StringWriter writer = new StringWriter();
fjson.writeFeatureCollection(collection, writer);
return writer.toString();
} catch (IOException e) {
e.printStackTrace();
} catch (SchemaException e) {
e.printStackTrace();
}
return null;
}
/**
* 转换坐标系
* @param factory
* @param fileSrid
* @param feature
* @param sourceGeometry
*/
private static void ConvertCoordinateReferenceSystem(CRSAuthorityFactory factory, CoordinateReferenceSystem fileSrid, SimpleFeature feature, Geometry sourceGeometry) {
//CoordinateReferenceSystem sourceCoordinate = null;
CoordinateReferenceSystem targetCoordinate = null;
try {
//目标坐标系
targetCoordinate = factory.createCoordinateReferenceSystem("EPSG:" + 4490);
//建立转换
MathTransform transform = CRS.findMathTransform(fileSrid, targetCoordinate,true);
//转换
Geometry res = JTS.transform(sourceGeometry, transform);
feature.setDefaultGeometry(res);
} catch (FactoryException e) {
e.printStackTrace();
} catch (TransformException e) {
e.printStackTrace();
}
}
/**
* convert shpFileType to db field type
* 字段类型有:短整型 长整型 浮点型 双精度 文本 日期
*
* @param value
* @return
*/
public static String convertShpFieldType2Str(Class value) {
if (value == String.class) {//文本
return "String";
}
if (value == Integer.class || value == Long.class) {//短整型
return "Integer";
}
/*if (value == Long.class) {//长整型
return "Long";
}*/
if (value == Float.class) {
return "Float";
}
if (value == Double.class) {//浮点型 双精度
return "Double";
}
if (value == Date.class) {
return "Date";//日期
}
if (Geometry.class.isAssignableFrom(value)) {
return "geometry";
}
return null;
}