一、shapfile文件
本想自己总结一下,源于有相关文章整理的非常不错,则直接引用。
1.Shapefile文件介绍 shapefile是一种基于文件方式存储GIS数据的文件格式,是GIS中比较通用的一种数据格式。至少由.shp,.dbf,.shx三个文件组成:
- .shp–储存地理要素的几何关系的文件
- .shx–储存图形要素的几何索引的文件
- .dbf–储存要素属性信息的dBase文件有时候还会出现一下文件:
- .shn–当执行类似选择“主题之主题”,“空间连接”等操作,或者对一个主题(属性表)的shape字段创建过一个索引,就会出现这个文件
- .ain和.aih–储存地理要素主体属性表或 其他表格的活动字段的属性索引信息的文件。当之行过“表格链接(link)操作,这两个文件就会出现。2.Shapefile文件解析(1)文件读取
- 在arcgis查看的时候要保证 前三个文件都有才行。
- 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中获取<featurecollection 要素集合類=”">的一个对象
- FeatureSource featureSource = dataStore.getFeatureSource(typeName);
- FeatureCollection featureCollection = featureSource.getFeatures();
- // 该FeatureCollection类的实例中存放着0…N个<feature 要素类=”">的对象。
- 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);
- }<pre></pre></feature></featurecollection>
(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<string, URL=”"> 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();
- }
- }
- }<pre></pre></string,>
二、文件中的字段
1、shapefile与dbase中的字段:
>>>>一个新建的shapefile中含有三个字段:FID,Shape,ID。
>>>>一个新建的dbase中含有两个字段:OID,Field1。
>>>>当用Excel来打开shapefile的dbf文件的时候仅有ID字段,打开dbase的dbf中仅有Field1字段。
>>>>帮助文件中的描述:The OID field is a virtual column created by ArcGIS software when accessing the table's contens.
>>>>结论:shapefile中FID与Shape与dBase中的OID都是虚拟字段,仅在arcgis中可见,所以新建的文件必须含有一个其它字段,否则dbf文件无法生成(不符合dbf文件生成的规则)
>>>>一个新建的shapefile中含有三个字段:FID,Shape,ID。
>>>>一个新建的dbase中含有两个字段:OID,Field1。
>>>>当用Excel来打开shapefile的dbf文件的时候仅有ID字段,打开dbase的dbf中仅有Field1字段。
>>>>帮助文件中的描述:The OID field is a virtual column created by ArcGIS software when accessing the table's contens.
>>>>结论:shapefile中FID与Shape与dBase中的OID都是虚拟字段,仅在arcgis中可见,所以新建的文件必须含有一个其它字段,否则dbf文件无法生成(不符合dbf文件生成的规则)
2、
shapefile文件的FID字段适合作为主键吗:
>>>>主键:唯一标识一行的列称为主键。
>>>>FID是Arcgis自动维护的,它类似于access的自动编号,但并不相同。主键是不可重用的:例如学号,当你在学校时是唯一的,当你毕业之后,这个学号也不应该给别人使用,这就是不可重用性。access的自动编号具有这样的特性:当删除一行之后,已有的其它行及新添加的行并不会占用这个已经删除的行的自动编号值。但FID不同: 当一条记录删除或更改(如记录合并merge) , 原来的FID值会进行更新(按照内部规则,我不知道是怎样的规则),结果是FID值总是保持从0开始到记录条数-1结束。
>>>>FID是Arcgis自动维护的,它类似于access的自动编号,但并不相同。主键是不可重用的:例如学号,当你在学校时是唯一的,当你毕业之后,这个学号也不应该给别人使用,这就是不可重用性。access的自动编号具有这样的特性:当删除一行之后,已有的其它行及新添加的行并不会占用这个已经删除的行的自动编号值。但FID不同: 当一条记录删除或更改(如记录合并merge) , 原来的FID值会进行更新(按照内部规则,我不知道是怎样的规则),结果是FID值总是保持从0开始到记录条数-1结束。
以上内容是从这里摘抄,另外还有很多知识但是暂且不涉及,所以就不摘录。