本文由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); }