Shape files数据说明

合集下载

shape文件的操作

shape文件的操作

shape⽂件的操作⼀、maven依赖引⼊<dependency><groupId>org.geotools</groupId><artifactId>gt-api</artifactId><exclusions><exclusion><groupId>commons-pool</groupId><artifactId>commons-pool</artifactId></exclusion><exclusion><groupId>jgridshift</groupId><artifactId>jgridshift</artifactId></exclusion><exclusion><groupId>Javax.media</groupId><artifactId>jai_core</artifactId></exclusion></exclusions></dependency><dependency><groupId>commons-pool</groupId><artifactId>commons-pool</artifactId></dependency><dependency><groupId>jgridshift</groupId><artifactId>jgridshift</artifactId></dependency><dependency><groupId>Javax.media</groupId><artifactId>jai_core</artifactId></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-geojson</artifactId></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-epsg-hsql</artifactId><exclusions><exclusion><groupId>org.hsqldb</groupId><artifactId>hsqldb</artifactId></exclusion></exclusions></dependency><!-- https:///artifact/org.hsqldb/hsqldb --><dependency><groupId>org.hsqldb</groupId><artifactId>hsqldb</artifactId><scope>test</scope></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-shapefile</artifactId></dependency><dependency><groupId>com.googlecode.json-simple</groupId><artifactId>json-simple</artifactId></dependency>备注:需要配置下载org.geotools的私有仓库<repositories><repository><id>osgeo</id><name>OSGeo Release Repository</name><url>https:///repository/release/</url><snapshots><enabled>false</enabled></snapshots><releases><enabled>true</enabled></releases></repository></repositories>⼆、读取shape⽂件,并转换为对象Tpublic static List<T>readShape(URL url) throws IOException {ShapefileDataStore store = new ShapefileDataStore(url);//设置编码Charset charset = Charset.forName("GBK");store.setCharset(charset);SimpleFeatureSource sfSource = store.getFeatureSource();SimpleFeatureIterator sfIter = sfSource.getFeatures().features();// 从ShapeFile⽂件中遍历每⼀个Feature,然后将Feature转为GeoJSON字符串List<T> list = new ArrayList<>();while (sfIter.hasNext()) {SimpleFeature feature = sfIter.next();// Feature转GeoJSONFeatureJSON fjson = new FeatureJSON();StringWriter writer = new StringWriter();fjson.writeFeature(feature, writer);JSONObject jsonObject = new JSONObject(writer.toString());String type = jsonObject.getStr("type").toLowerCase();if (type.equals("multipolygon")){LOGGER.error("该数据不是图斑:【{}】",writer);continue;}String properties = jsonObject.remove("properties").toString();jsonObject.remove("id");//其他属性T t = JSONUtil.toBean(properties, T.class);if (JudgeUtil.isDBNull(t.getObjectid())){LOGGER.error("该图斑每页objectid:【{}】",writer.toString());continue;}//geojsont.setGeojson(jsonObject.toString());list.add(gisWarnQrstbhhx);}return list;}三、shape⽂件写⼊1、写⼊shape⽂件⼊⼝/*** 写shape⽂件* @param rootFile* @param shapeName shape⽂件名包含后缀名.shp* @param list*/public static void writeShape(File rootFile,String shapeName,List<T>list) throws IOException {if (JudgeUtil.isEmpty(list)){throw new WrongDataException("数据不能为空");}String type = new JSONObject(list.get(0).getGeojson()).getStr("type").toLowerCase();//将list转换为geoJson字符串String geoJson = getGsoJson(list);if (!rootFile.exists() || rootFile.isFile()){rootFile.mkdirs();}File file = new File(rootFile,shapeName);Map<String, Serializable> params = new HashMap<>();params.put(ShapefileDataStoreFactory.URLP.key,file.toURI().toURL());ShapefileDataStore ds = (ShapefileDataStore) new ShapefileDataStoreFactory().createNewDataStore(params);//定义图形信息和属性信息SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder();tb.setCRS(DefaultGeographicCRS.WGS84);tb.setName("shapefile");tb.setDefaultGeometry("the_geom");//添加属性addProperties(type,tb);ds.createSchema(tb.buildFeatureType());//设置编码Charset charset = Charset.forName("GBK");ds.setCharset(charset);FeatureJSON featureJson = new FeatureJSON();SimpleFeatureCollection featureCollection = (SimpleFeatureCollection) featureJson.readFeatureCollection(geoJson);FeatureIterator<SimpleFeature> iterator = featureCollection.features();//设置WriterFeatureWriter<SimpleFeatureType, SimpleFeature> writer = ds.getFeatureWriter(ds.getTypeNames()[0], Transaction.AUTO_COMMIT);//写下⼀条SimpleFeature srcFeature;Iterator<Property> properties;while (iterator.hasNext()){srcFeature = iterator.next();properties = srcFeature.getProperties().iterator();SimpleFeature destFeature = writer.next();while (properties.hasNext()){Name name = properties.next().getName();Object attribute = srcFeature.getAttribute(name);if (!(attribute instanceof Geometry)){destFeature.setAttribute(name, attribute);}}destFeature.setDefaultGeometryProperty(srcFeature.getDefaultGeometryProperty());}writer.write();writer.close();ds.dispose();}2、将List<T>转换为geojson/*** T转geojson* @param list* @return*/private static String getGsoJson(List<T>list){JSONObject jsonObject = new JSONObject();jsonObject.putOnce("type","FeatureCollection");JSONArray jsonArray = new JSONArray();jsonObject.putOnce("features",jsonArray);for (T t : list) {JSONObject feature = new JSONObject();feature.putOnce("type","Feature");feature.putOnce("geometry",new JSONObject(t.getGeojson()));t.setGeojson(null);t.setGeom(null);t.setGid(null);feature.putOnce("properties",JSONUtil.parseObj(t));jsonArray.add(feature);}return jsonObject.toString();}3、通过反射添加properties/*** 通过反射添加properties* @param tb*/private static void addProperties(String type, SimpleFeatureTypeBuilder tb){Field[] declaredFields = T.class.getDeclaredFields();setType(tb,type.toLowerCase());for (Field declaredField : declaredFields) {String name = declaredField.getName();if (!name.equals("serialVersionUID") && !name.equals("geojson") && !name.equals("geom")){ tb.add(name,declaredField.getType());}}}4、设置类型private static void setType(SimpleFeatureTypeBuilder tb,String type){if (type.equals("point")) {tb.add("the_geom", Point.class);} else if (type.equals("line")) {tb.add("the_geom", LineString.class);} else if (type.equals("polygon")) {tb.add("the_geom", Polygon.class);} else if (type.equals("multipoint")) {tb.add("the_geom", MultiPoint.class);} else if (type.equals("multiline")) {tb.add("the_geom", MultiLineString.class);} else if (type.equals("multipolygon")) {tb.add("the_geom", MultiPolygon.class);}}。

Shapefile文件类型

Shapefile文件类型

Shapefile文件类型
shapefile文件属于矢量数据中无拓扑关系的数据类型。

它至少包含3个文件,dbf、shp、shx 。

其中:dbf文件时存储矢量数据的属性信息的;
shp是存储矢量数据的空间信息的。

shx是保留要素几何学特征的索引文件。

另外,shapefile文件还可以包括其它文件,如sbn 、sbx 、prj等。

sbn 、sbx 也是空间索引文件,.prj属于数据的投影文件。

当中.shp、.shx、.dbf三个是万万不能删除的,删除掉一个就出错了。

shp没了一切全都没了,正所谓的皮之不存,毛将焉附。

删掉shx虽然打不开文件,但有工具能修复。

删掉.dbf文件也能修复,可属性是找不回来了。

删掉.prj文件会导致投影信息丢失。

.sbn 、.sbx 文件删掉后将丢失所建的索引。

使用PYTHON SHAPEFILE LIBRARY创建和编辑SHAPEFILE文件

使用PYTHON SHAPEFILE LIBRARY创建和编辑SHAPEFILE文件

使用Python Shapefile Library创建和编辑Shapefile文件shapefile是GIS中非常重要的一种数据类型,在ArcGIS中被称为要素类(Feature Classes),主要包括点(point)、线(polyline)和多边形(polygon)。

Python脚本是ArcGIS官方推荐的脚本语言,通过Python脚本能够很方便的调用ArcGIS中的各种工具和函数批量完成所需操作。

本文所介绍的这个库(Python Shapefile Library)是一个Python库,用于在Python脚本中对ArcGIS中的Shapefile 文件(.shp,.shx,.dbf等格式)进行读写操作。

1、Python Shapefile Library的下载与安装:Python Shapefile Library下载地址:https:///p/pyshp/Python Shapefile Library使用时无需安装,只需在Python程序中导入该模块文件即可(import shapefile,具体导入方法参考Python教程中模块的导入部分)2、Shapefile文件的读操作2.1 Python Shapefile Library提供了Reader类,通过创建Reader类的对象(如下面的sf)进行shapefile文件的读操作:sf = shapefile . Reader ('shapefile name')2.2 使用Python Shapefile Library读取shapefile文件的"几何数据"(Geometry)和"属性数据"(Attribute Record)"几何数据"一般有多个几何对象组成,比如一个"点文件",每个点就是一个对象;对于一个多边形文件,每个对象可能包含有多个多边形,每个多边形又称为"块(parts)",每个"块"由多个点组成。

ArcGISshape文件要素类包括点,面,折线,多点,多面数据表字段以及数据的查看,添加。。。

ArcGISshape文件要素类包括点,面,折线,多点,多面数据表字段以及数据的查看,添加。。。

ArcGISshape⽂件要素类包括点,⾯,折线,多点,多⾯数据表字段以及数据的查看,添加。

⾸先shape⽂件是怎么建⽴的呢?======================打开ArcGIS Desktop中的Catalog,在⽬录树列表中,选择⼀个⽂件夹(如果有ArcSDE GeoDatabase则省去这步),在⽂件夹点击右键,新建ShapeFile⽂件,或者在空间数据库中New -》要素类FeatureClass(两者其实⼀样⼀样的),输⼊名称,和选择要素类型(有五种点线⾯多点多⾯||),坐标系也选择⼀个,⼀般要和其他要素⼀样,⽐如都是China的那个某年的坐标系,点击确定就创建了shape⽂件(在地理空间数据库中就是建⽴了⼀个表,⼀个要素类⽽已,下⾯全部按照shape单独的⽂件来说,地理空间数据库其实⼀样。

)。

Shape⽂件添加删除字段,暂时⽆法修改字段============================在shape⽂件上点击右键,打开【属性】,选择字段,默认有FID、Shape和id三个字段,FID就是⾃动增长的⼀个id,Shape是类型,这俩必须有,还必须有第三个字段,ArcGIS10好像不能修改id字段,但是可以先添加⼀个字段,然后再id这⼀⾏最左边,点击选择整⾏进⾏删除。

这样就可以查看,添加或删除字段了,⾄于修改,和更改顺序(其实更改顺序只是给⼈看的,没啥⽤),我暂时不知道如何操作。

Shape⽂件中对表进⾏数据的添加删除修改操作============================在有了字段后,表还是空的,这⾥的表其实和数据库⾥的表table的概念是⼀模⼀样的。

有了表结构,下⾯就是对表内容进⾏进⾏添加删除修改了。

这个操作需要使⽤ArcGIS Desktop⾥的 ArcMap软件。

打开ArcMap之后,⾸先把编辑器和绘图⼯具条调⽤出来。

在【⾃定义】【⾃定义模式】中可以操作,简单的也可以在⼯具栏空⽩处点击右键直接打开这些⼯具条。

shapefile包的用法

shapefile包的用法

shapefile包的用法
shapefile是一种常用的地理信息系统(GIS)文件格式,用于存储地理空间数据。

它通常由多个文件组成,包括.shp、.shx、.dbf 和其他附加文件。

shapefile包是一个用于Python的开源库,用于读取和处理shapefile文件。

下面是shapefile包的常见用法:
1. 安装shapefile包:使用pip命令安装shapefile包,可以在终端或命令提示符中运行以下命令。

2. 导入shapefile库。

3. 读取shapefile文件:使用shapefile.Reader()函数来读取shapefile文件。

4. 访问shapefile属性:可以通过sf对象的属性来获取shapefile的一些基本信息。

5. 访问图形几何数据:可以使用sf对象的shapes()方法来访问shapefile中的图形几何数据。

每个图形都表示一个地理要素,例如点、线或多边形。

6. 访问属性数据:shapefile文件通常包含与每个地理要素相关联的属性数据。

可以使用sf对象的records()方法来获取属性数据。

7. 迭代访问shapefile中的要素:可以使用sf对象的iterShapes()和iterRecords()方法来迭代访问shapefile中的所有要素和属性值。

这些是shapefile包的基本用法。

通过了解shapefile包的功能和方法,你可以更好地处理和分析存储在shapefile文件中的地理空间数据。

shape文件的结构和组织

shape文件的结构和组织

一、shape文件的结构和组织:1、shape文件技术描述:一个ESRI shape文件由主文件,索引文件,和一个dBASE表组成,主文件是一个可以直接访问、长度可变的文件,在主文件中每条记录用一系列的点描述一个物体,在索引文件中,每条记录保存主文件中相应的物体相对主文件头的偏移量。

在dBASE表中包含每条记录的属性,这种几何形与属性一对一的关系是依据纪录的数量的,dBASE文件中的属性纪录和主文件中的纪录必须是顺序是一样的。

2、数据类型:整型(Integer)32-bit(4 bytes)双精度(double)64-bit (8 bytes)二、主文件的组织主文件包含一个固定长度的文件头和一系列可变长的记录集,每一个可变长的纪录由一个固定长度的纪录头和一个可变长的纪录内容。

如下图:图一主文件的组织二进制正常状态:所有shape文件中的内容可以分成两种类型:(1)数据相关的:·主文件记录内容·主文件头数据表述区域(物体类型等)(2)文件管理相关的:·文件和记录的长度·纪录的偏移量等等主文件头:主文件头长度是100 个字节,下表展示了头文件各个成员包括(字节位置,值,类型,字节状态),在这个表中,位置是从文件头算起的。

File Length上表中File Length 是整个文件的长度,包括该头文件的100个字节。

所有的no_NULL shape type必须是同种类型。

下面是shape type的值:shape type上述shape type中2 、4、6等和33没有列入清单,这些保留数字是为了将来再用。

现在每个shape文件只能指定上述的类型中的一种。

Bounding Box纪录所有物体的x,y,z范围。

如果是“no data”类型,才用到Mmin和Mmax纪录头记录头包含纪录数量(该纪录是第几个纪录,第一个的值是1)和记录内容的长度。

记录头长度是8个字节,如下表,其中position是相对该纪录的开始位置。

ESRI Shape文件 技术说明书

ESRI Shape文件 技术说明书

ESRI Shape文件技术说明书ESRI白皮书—1998年7月初译:yzg2006年5月4日注意:本人非英语、计算机及GIS专业从业人员,翻译此文仅供参考之用。

受本人水平所限,出现错误之处实属正常,如有有心人能给予指正,将不胜感激。

2006年5月4日YZGESRI Shapefile 技术说明书ESRI 白皮书Contents pageWhy Shapefiles? 1Shapefile Technical Description 2Organization of the Main File 3Main File Record Contents 5Organization of the Index File 5Organization of the dBASE File 18Glossary 20ESRI Shapefile 技术说明书This document defines the shapefile(.shp)spatial data format and describes why shapefiles are important. It lists the tools available in Environmental Systems Research Institute, Inc.(ESRI),software for creating shapefiles directly or converting data into shapefiles from other formats. This document also provides all the technical information necessary for writing a computer program to create shapefiles without the use of ESRI® software for organizations that want to write their own fata translators.Why Shapefiles?A shapefile stores nontopological geometry and attribute information for the spatial features in a data set. The geometry for a feature is stored as a shape comprising a set of vector coordinates.Because shapefiles do not have the processing overhead of a topological data structure, they have advantages over other data sources, such as faster drawing speed and edit ability. Shapefiles handle single features that overlap or that are noncontiguous. They also typically require less disk space and are easier to read and write.Shapefiles can support point, line, and area features. Area features are represented as closed loop, double-digitized polygons. Attributes are held in a dBASE® format file. Each attribute record has a one-to-one relationship with the associated shape record.如何创建Shape文件Shape文件可以通过以下四种方法建立:■导出-可以通过ARC/INFO、PC ARC/INFO、Spatial Database Engine TM(SDE TM)、ArcView® GIS 或者Business MAP TM software等软件将任何源数据导出为Shape文件。

Shapefile

Shapefile

一、什么是shapefile?Shapefile是一种用于存储地理要素的几何位置和属性信息的非拓扑简单格式。

shapefile 中的地理要素可通过点、线或面(区域)来表示。

包含shapefile的工作空间还可以包含dBASE 表,它们用于存储可连接到shapefile的要素的附加属性。

(一)下面是shapefile如何在ArcCatalog中显示的示例。

还能看到dBASE文件(它可能与shapefile相关联)。

默认情况下,具有文件扩展名.txt、.asc、.csv或.tab 的所有文件将以文本文件的形式显示在ArcCatalog中。

但在选项对话框中,您可以选择其中哪些文件类型应显示为文本文件以及哪些不能显示在目录树中。

当文本文件包含逗号分隔和制表符分隔的值时,您能够在ArcCatalog表视图中看到它们的内容并可将其连接到地理要素。

在ArcCatalog中,可将文本文件删除,但其内容为只读。

可以在图层“属性”对话框的连接和关联选项卡中,将dBASE表或文本文件中存储的属性连接到shapefile中的要素。

如果表包含描述空间位置的信息(例如,x,y,z坐标或街道地址),则可以使用ArcCatalog中提供的工具创建用以表示这些位置的shapefile。

(二)编辑shapefile可以在具有任意许可等级的ArcGIS for Desktop(ArcGIS for Desktop Basic、ArcGIS for Desktop Standard或ArcGIS for Desktop Advanced)中编辑shapefile。

但要想利用高级编辑功能(例如,拓扑),则需要将shapefile作为要素类导入到地理数据库中。

(三)将shapefile和dBASE表导入到地理数据库要素类和表shapefile中的所有要素类型都会在地理数据库中转换为几何类型。

与coverage 不同的是,shapefile要素类型与地理数据库中存储的几何类型相类似,因此转换要更为简单。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Shape files数据说明Shape files是ESRI提供的一种矢量数据格式,它没有拓扑信息,一个Shape files由一组文件组成,其中必要的基本文件包括坐标文件(.shp)、索引文件(.shx)和属性文件(.dbf)三个文件。

1、坐标文件的结构说明坐标文件(.shp)用于记录空间坐标信息。

它由头文件和实体信息两部分构成(如图 2.1所示)。

1)坐标文件的文件头坐标文件的文件头是一个长度固定(100 bytes)的记录段,一共有9个int型和7个double 型数据,主要记录内容见表2.2。

图2.1坐标文件的结构表2.2shapefiles头文件表注:最后4个加星号特别标示的四个数据只有当这个Shapefile文件包含Z方向坐标或者具有Measure值时才有值,否则为0.0。

所谓Measure值,是用于存储需要的附加数据,可以用来记录各种数据,例如权值、道路长度等信息。

(1)位序细心的读者会注意到表2.2中的数值的位序有Little和big的区别,对于位序是big的数据我们在读取时要小心。

通常,数据的位序都是Little,但在有些情况下可能会是big,二者的区别在于它们位序的顺序相反。

一个位序为big的数据,如果我们想得到它的真实数值,需要将它的位序转换成Little即可。

转换原理非常简单,就是交换字节顺序,下面是作者实现的在两者间进行转换的程序,代码如下://位序转换程序unsigned long OnChangeByteOrder (int indata){char ss[8];char ee[8];unsigned long val = unsigned long(indata);_ultoa( val, ss, 16 );//将十六进制的数(val)转到一个字符串(ss)中int i;int length=strlen(ss);if(length!=8){for(i=0;i<8-length;i++)ee[i]='0';for(i=0;i<length;i++)ee[i+8-length]=ss[i];for(i=0;i<8;i++)ss[i]=ee[i];}////******进行倒序int t;t =ss[0];ss[0] =ss[6];ss[6] =t;t =ss[1];ss[1] =ss[7];ss[7] =t;t =ss[2];ss[2] =ss[4];ss[4] =t;t =ss[3];ss[3] =ss[5];ss[5] =t;////******//******将存有十六进制数(val)的字符串(ss)中的十六进制数转成十进制数int value=0;for(i=0;i<8;i++){int k;CString mass;mass=ss[i];if(ss[i]=='a' ||ss[i]=='b' ||ss[i]=='c' ||ss[i]=='d' ||ss[i]=='e' ||ss[i]=='f')k=10+ss[i]-'a';elsesscanf(mass,"%d",&k);value=value+int(k*pow(16,7-i));}return (value);}(2)Shapefile文件支持的几何类型(ShapeType)Shapefile文件所支持的几何类型如表2.3所示:表2.3shapefiles文件支持的几何类型对于一个不是记录Null Shape 类型的Shapefile文件,它所记录的空间目标的几何类型必须一致,不能在一个Shapefile文件中同时记录两种不同类型的几何目标。

读取坐标文件(.shp)的文件头的代码如下:void OnReadShp(CString ShpFileName){FILE* m_ShpFile_fp; //****Shp文件指针//打开坐标文件if((m_ShpFile_fp=fopen(ShpFileName,"rb"))==NULL){return;}//读取坐标文件头的内容开始int FileCode;int Unused;int FileLength;int Version;int ShapeType;double Xmin;double Ymin;double Xmax;double Ymax;double Zmin;double Zmax;double Mmin;double Mmax;fread(&FileCode, sizeof(int), 1,m_ShpFile_fp);FileCode = OnChangeByteOrder (FileCode);for(i=0;i<5;i++)fread(&Unused,sizeof(int), 1,m_ShpFile_fp);fread(&FileLength, sizeof(int), 1,m_ShpFile_fp);FileLength = OnChangeByteOrder (FileLength);fread(&Version, sizeof(int), 1,m_ShpFile_fp);fread(&ShapeType, sizeof(int), 1,m_ShpFile_fp);fread(&Xmin, sizeof(double),1,m_ShpFile_fp);fread(&Ymin, sizeof(double),1,m_ShpFile_fp);fread(&Xmax, sizeof(double),1,m_ShpFile_fp);fread(&Ymax, sizeof(double),1,m_ShpFile_fp);fread(&Zmin, sizeof(double),1,m_ShpFile_fp);fread(&Zmax, sizeof(double),1,m_ShpFile_fp);fread(&Mmin, sizeof(double),1,m_ShpFile_fp);fread(&Mmax, sizeof(double),1,m_ShpFile_fp);//读取坐标文件头的内容结束//根据几何类型读取实体信息……}2)实体信息的内容实体信息负责记录坐标信息,它以记录段为基本单位,每一个记录段记录一个地理实体目标的坐标信息,每个记录段分为记录头和记录内容两部分。

记录头的内容包括记录号(Record Number)和坐标记录长度(Content Length) 两个记录项。

它们的位序都是big。

记录号(Record Number)和坐标记录长度(Content Length) 两个记录项都是int型,并且shapefile文件中的记录号都是从1开始的。

记录内容包括目标的几何类型(ShapeType)和具体的坐标记录(X、Y) ,记录内容因要素几何类型的不同其具体的内容及格式都有所不同。

下面分别介绍点状目标(Point)、线状目标(PolyLine)和面状目标(Polygon)三种几何类型的.shp文件的记录内容:a. 点状目标shapefile中的点状目标由一对X、Y坐标构成,坐标值为双精度型(double)。

点状目标的记录内容如表2.4:表2.4点状目标的记录内容下面是读取点状目标的记录内容的代码:OnReadPointShp(CString ShpFileName){//打开坐标文件……//读取坐标文件头的内容开始……//读取点状目标的实体信息int RecordNumber;int ContentLength;int num =0;while((fread(&RecordNumber, sizeof(int), 1,ShpFile_fp)!=0)){num++;fread(&ContentLength,sizeof(int), 1,ShpFile_fp);RecordNumber = OnChangeByteOrder (RecordNumber);ContentLength= OnChangeByteOrder (ContentLength);int shapeType;double x;double y;fread(&shapeType, sizeof(int), 1,ShpFile_fp);fread(&x, sizeof(double), 1,ShpFile_fp);fread(&y, sizeof(double), 1,ShpFile_fp);}}b. 线状目标shapefile中的线状目标是由一系列点坐标串构成,一个线目标可能包括多个子线段,子线段之间可以是相离的,同时子线段之间也可以相交。

Shapefile允许出现多个坐标完全相同的连续点,当读取文件时一定要注意这种情况,但是不允许出现某个退化的、长度为0的子线段出现。

线状目标的记录内容如表2.5:表2.5线状目标的记录内容具体的数据结构如下:PolyLine{Double[4] Box // 当前线状目标的坐标范围Integer NumParts // 当前线目标所包含的子线段的个数Integer NumPoints // 当前线目标所包含的顶点个数Integer[NumParts] Parts // 每个子线段的第一个坐标点在Points的位置Point[NumPoints] Points // 记录所有坐标点的数组}这些记录项的具体含义如下:Box记录了当前的线目标的坐标范围,它是一个double型的数组,按照Xmin、Ymin、Xmax、Ymax的顺序记录了坐标范围;NumParts记录了当前线目标所包含的子线段的个数;NumPoints记录了当前线目标的坐标点总数;Parts记录了每个子线段的第一个坐标点在坐标数组points中的位置,以便读取数据;Points是用于存放当前线目标的X、Y坐标的数组。

下面是读取线状目标的记录内容的代码:OnReadLineShp(CString ShpFileName){//打开坐标文件……//读取坐标文件头的内容开始……//读取线状目标的实体信息int RecordNumber;int ContentLength;int num =0;while((fread(&RecordNumber, sizeof(int), 1,ShpFile_fp)!=0)){fread(&ContentLength,sizeof(int), 1,ShpFile_fp);RecordNumber = OnChangeByteOrder (RecordNumber);ContentLength= OnChangeByteOrder (ContentLength);int shapeType;double Box[4];int NumParts;int NumPoints;int *Parts;fread(&shapeType, sizeof(int), 1,ShpFile_fp);//读Boxfor(i=0;i<4;i++)fread(Box+i, sizeof(double),1,ShpFile_fp);//读NumParts和NumPointsfread(&NumParts, sizeof(int), 1,ShpFile_fp);fread(&NumPoints, sizeof(int), 1,ShpFile_fp);//读Parts和PointsParts =new int[NumParts];for(i=0;i<NumParts;i++)fread(Parts+i, sizeof(int), 1,ShpFile_fp);int pointNum;for(i=0;i<NumParts;i++){if(i!=NumParts-1)pointNum =Parts[i+1]-Parts[i];elsepointNum =NumPoints-Parts[i];double *PointsX;double *PointsY;PointsX =new double[pointNum];PointsY =new double[pointNum];for(j=0;j<pointNum;j++){fread(PointsX+j, sizeof(double),1,ShpFile_fp);fread(PointsY+j, sizeof(double),1,ShpFile_fp);}delete[] PointsX;delete[] PointsY;}delete[] Parts;}}c. 面状目标shapefile中的面状目标是由多个子环构成,每个子环是由至少四个顶点构成的封闭的、无自相交现象的环。

相关文档
最新文档