小马看GIS--Shapefile文件解析(二)

(2)Shapefile文件写入

 

public static void main(String[] args) throws Exception {
	// 第一步:创建基于Shapefile的数据源。
	DataStore shape = createShapeFile("example");
	// 创建FeatureCollection对象
	FeatureCollection features = createFeatures(shape.getSchema("example"));
	// 生成Shapefile文件
	writeToShapefile(shape, features);
}

public static DataStore createShapeFile(String name) {
	try {
		// 创建数据源仓库
		FileDataStoreFactorySpi factory = new IndexedShapefileDataStoreFactory();
		// 创建你要创建的Shapefile文件
		File file = new File("f:/shp/" + name + ".shp");
		if (!file.exists()) {
			file.createNewFile();
		}
		// 我们需要给出连接Shapefile文件的参数
		// 并且把这些参数信息组织到一个Map实例中
		// 注意:使用file.toURI().toURL()的原因是因为jdk中不赞成使用file.toURL()
		Map
 
 
  
   map = Collections.singletonMap("url", file.toURI()
				.toURL());
		// 创建一个基于以上参数信息的Shapefile数据源对象
		ShapefileDataStore myData = (ShapefileDataStore) factory
				.createDataStore(map);
		// 标明Shapefile文件中存储的数据的类型是什么:MultiLineString
		// Shapefile可以存储以下数据:
		// Point,MultiPoint,MultiLineString,MultiPolygon
		FeatureType featureType = DataUtilities.createType(name,
				"geom:MultiLineString");
		// 也可以存储其他的数据,比如:geom:MultiLineString,FieldName:java.lang.Integer
		// 通过','将他们分开。
		// 创建Shapefile文件
		myData.createSchema(featureType);
		// 标明数据源使用的什么坐标参考系统
		myData.forceSchemaCRS(CRS.decode("EPSG:4326"));
		return myData;
	} catch (FactoryException fe) {
		fe.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	} catch (SchemaException se) {
		se.printStackTrace();
	}
	return null;
}

public static FeatureCollection createFeatures(FeatureType featureType) {
	FeatureCollection collection = FeatureCollections.newCollection();
	try {
		GeometryFactory gf = new GeometryFactory();
		Coordinate coord1 = new Coordinate(10, 10);
		Coordinate coord2 = new Coordinate(100, 100);
		Coordinate[] coords = new Coordinate[2];
		coords[0] = coord1;
		coords[1] = coord2;
		LineString line = gf.createLineString(coords);
		LineString[] lines = new LineString[1];
		lines[0] = line;
		MultiLineString multi = gf.createMultiLineString(lines);
		collection.add(featureType.create(new Object[] { multi }));
		return collection;
	} catch (IllegalAttributeException iae) {
		iae.printStackTrace();
	}
	return null;
}

public static void writeToShapefile(DataStore data,
		FeatureCollection collection) {
	DefaultTransaction transaction = null;
	FeatureStore store = null;
	try {
		String[] featureNames = data.getTypeNames();
		String featureName = featureNames[0];
		// 创建默认的事务对象
		transaction = new DefaultTransaction();
		// 同时标明数据源使用的要素名称,通常Shapefile文件名称和Shapefile类型名称通常是一样的。
		store = (FeatureStore) data.getFeatureSource(featureName);
		// 关联默认事务和数据源
		store.setTransaction(transaction);
		// 增加要素信息到数据源
		store.addFeatures(collection);
		// 提交
		transaction.commit();
		// 关闭
		transaction.close();
	} catch (IOException e) {
		e.printStackTrace();
		try {
			// 回滚
			transaction.rollback();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}
}
  
  

 
 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值