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

本文由Shapefile文件介绍和Shapefile文件解析(文件读取、文件写入)构成。转载请注明出处。

1.Shapefile文件介绍         shapefile是一种基于文件方式存储GIS数据的文件格式,是GIS中比较通用的一种数据格式。至少由.shp,.dbf,.shx三个文件组成:

.shp--储存地理要素的几何关系的文件 .shx--储存图形要素的几何索引的文件 .dbf--储存要素属性信息的dBase文件

        有时候还会出现一下文件:

.shn--当执行类似选择“主题之主题”,“空间连接”等操作,或者对一个主题(属性表)的shape字段创建过一个索引,就会出现这个文件 .ain和.aih--储存地理要素主体属性表或 其他表格的活动字段的属性索引信息的文件。当之行过“表格链接(link)操作,这两个文件就会出现。

2.Shapefile文件解析

 (1)文件读取

 

public static void main(String[] args) {
	try {
		// 第一步:我们需要给出连接Shapefile文件的参数
		// 并且把这些参数信息组织到一个Map实例中
		URL url = new File("您的shapefile文件,以.shp结尾").toURI().toURL();
		Map params = new HashMap();
		params.put("url", url);
		// 还可以加入其他参数,这里以最简单的形式给出示例。
		// 第二步:根据刚才参数的信息,打开一个连接到Shapefile文件的数据源
		DataStore dataStore = DataStoreFinder.getDataStore(params);
		// 从dataStore中获取Shapefile类型名称。
		// Shapefile文件名称和Shapefile类型名称通常是一样的。
		// 此处dataStore现在是基于Shapefile创建的, 所以TypeName就是Shapefile文件名称。
		String typeName = dataStore.getTypeNames()[0];
		System.out.println("::::typeName is " + typeName);
		// 第三步:根据Shapefile类型名称,从dataStore中获取的一个对象
		FeatureSource featureSource = dataStore.getFeatureSource(typeName);
		FeatureCollection featureCollection = featureSource.getFeatures();
		// 该FeatureCollection类的实例中存放着0...N个的对象。
		FeatureIterator features = featureCollection.features();
		while (features.hasNext()) {
			// 对Layer核心的操作都是针对的是要素的操作。所以,这里为我们提供了要素。
			Feature feature = features.next();
			// 我们将Gis看成是一组基于数据的服务,而数据的基础是要素(Feature)。
			// 所谓要素简单的说就是一个独立的对象,在地图中可能表现为一个多边形的建筑物,
			// 在数据库中即一个独立的条目。
			// 要素具有两个必要的组成部分,几何信息和属性信息。
			// 我们这里每一要素(Feature)类的对象中存放着
			// 一个几何信息(Geometry)类的对象,和许多属性信息(attributes)。
			Geometry defaultGeometry = feature.getDefaultGeometry();
			System.out.println("defaultGeometry:::::>>>>>:"
					+ defaultGeometry.toString());
		}
		// 我们也可以获得要素类型。
		// 何谓要素类型?相同的几何类型、属性类型的组合成为要素类型.
		// 要素类型相同的要素可以被存放在一个数据源中,而一个数据源只能拥有一个要素类型。
		// 因此,可以用要素类型来描述一组属性相似的要素。
		FeatureType featureType = featureSource.getSchema();
		// 打印普通要素
		for (int i = 0; i < featureType.getAttributeCount(); i++) {
			AttributeType attributeType = featureType.getAttributeType(i);
			if (!(attributeType instanceof GeometryAttributeType)) {
				System.out.print(attributeType.getType().getName() + " ");
			}
		}
		// 打印几何要素
		for (int i = 0; i < featureType.getAttributeCount(); i++) {
			AttributeType at = featureType.getAttributeType(i);
			if (at instanceof GeometryAttributeType) {
				System.out.print(at.getName() + " ");
			}
		}
		// 打印前10个要素信息
		Iterator iterator = featureCollection.iterator();
		try {
			for (int count = 0; iterator.hasNext(); count++) {
				Feature feature = (Feature) iterator.next();
				System.out.print(feature.getID() + " ");
				for (int i = 0; i < feature.getNumberOfAttributes(); i++) {
					Object attribute = feature.getAttribute(i);
					if (!(attribute instanceof Geometry)) {
						System.out.print(attribute + " ");
					}
				}
				System.out.println();
				if (count == 10)
					break;
			}
		} finally {
			featureCollection.close(iterator);
		}
		// 最后打印每个Gemetry对象的WKT表示
		iterator = featureCollection.iterator();
		try {
			for (int count = 0; iterator.hasNext(); count++) {
				Feature feature = (Feature) iterator.next();
				System.out.print(feature.getID() + " ");
				System.out.println(feature.getDefaultGeometry());
				System.out.println();
				// if (count== 10) break;
			}
		} finally {
			featureCollection.close(iterator);
		}
	} catch (Exception e) {
		System.out.println("Ops! Something went wrong :-(");
		e.printStackTrace();
	}
	System.exit(0);
}
 
 

你可能感兴趣的:(GIS)