博客背景和目的

最近在用C++写一个底层的东西,需要读取和创建shp文件。虽然接触shp文件已经几年了,但是对于shp文件内到底包含什么东西一直是一知半解。以前使用shp文件都是利用软件(如ArcGIS)直接打开,保存;创建文件则需要专门利用ArcToolBox等创建图形。

网上有现成的有关shp文件的库,如GDAL等,可以结合这些库来读写shp文件。但是由于编程环境问题、库的版本、编译、引用等等问题,在现有情况下无法正常使用,加之使用现有的库不能让我从底层完全了解shp文件的组织方式,遂决心一点点地自己动手写读和写(创建)的方法。

在尝试解决这个问题的时候,我浏览了网上众多有关shp文件读写的博客和资料,发现大多博客对于shp文件的情况和读取过程有详细的记录,但是几乎没有写(创建)底层shp文件的代码示例。虽然“写”与“读”类似,但是其中还是有很多“陷阱”。为了记录自己的探索历程,同时给后面的人提供经验和参考,故写此博客,希望能给读者提供帮助。

shp文件基本情况

shp是shapefile的缩写,关于shapefile的历史和特点我不过多叙述,网上随便一搜都有详细内容,我着重叙述几点:

  • 一个完整的shapefile文件至少包含shp文件、dbf文件和shx文件,它们都是同名的,文件的后缀格式是.shp、.dbf和.shx。也就是说,缺少其中任何一项,都无法直接用ArcGIS打开。
  • shp文件主要包含图形坐标数据,由文件头和实体信息组成。
  • dbf文件主要记录要素的属性信息,实际上是一个表,在ArcGIS中打开后实际上就是属性表。
  • shx文件是索引文件,记录主文件(shp文件)中每条记录距离主文件开始位置的偏移量和每条记录的长度。
  • shp的读写意味着shp、dbf和shx的读写,利用C++程序读的过程中如果只是需要图形和属性,shx不是必需的;但是写的时候为了使输出的shp能被广泛使用,必须要写(创建)shx文件。
  • shp等三个文件都是二进制文件,变量有big和little区分,还涉及16进制和10进制的转换。

编程环境

C++ 、VS2010、MFC

其他工具

推荐一个检查shp、shx和dbf文件的神器——shapechk.exe,这个工具可以检查shp文件是否有问题、能检查和生成shx和dbf,资源见下方。

阅读资料

《shape白皮书.pdf》英文版shapefile说明的翻译版

《shp文件详细格式.doc》 详细解读shp格式,并且有读取文件的源码

链接:https://pan.baidu.com/s/1YLwqTFfqLYguQntk7PrpGw

提取码: cshy

虽然有以上参考资料,但是实际编程中仍会有许多问题,众多问题将在后面一一叙述。

shp系列(一)——利用C++进行shp文件的读(打开)与写(创建)开言的更多相关文章

  1. python学习二十一天文件可读,可写,可执行的操作

    文件无非是可读,可写,可执行的操作,分别对应的模式 r ,w,x,只读模式,只写模式,只执行模式,a模式为追加模式,实际也是写操作模式,r+,w+,a+ 可读写模式,下面详细说模式的用法 1,文件的模 ...

  2. shp系列(四)——利用C++进行Shx文件的读(打开)

    1.shx文件的基本情况 shx文件又叫索引文件,主要包含坐标文件的索引信息,文件中每个记录包含对应的坐标文件记录距离坐标文件的初始位置的偏移量.通过索引文件可以很方便地在坐标文件中定位到指定目标的坐 ...

  3. shp系列(三)——利用C++进行DBF文件的读(打开)

    1.DBF文件要点 DBF文件又叫属性文件,也叫dBASE文件,文件后缀是.dbf,实际上ArcGIS打开后的属性表就是DBF的信息.DBF文件遵循以下几个条件: 每个要素在表中必须要包含一个与之相对 ...

  4. python常识系列07-->python利用xlwt写入excel文件

    前言 读书之法,在循序而渐进,熟读而精思.--朱熹 抽空又来写一篇,毕竟知识在于分享! 一.xlwt模块是什么 python第三方工具包,用于往excel中写入数据:(ps:只能创建新表格,不能修改表 ...

  5. shp系列(七)——利用C++进行Shx文件的写(创建)

    之前介绍了Shp文件和Dbf的写(创建),最后来介绍一下Shx文件的写(创建).Shx文件是三者之中最简单的一个,原因有两个:第一是Shx文件的头文件与Shp文件的头文件几乎一样(除了FileLeng ...

  6. shp系列(五)——利用C++进行shp文件的写(创建)

    之前介绍了shp文件.dbf文件和shx文件的的读取,接下来将分别介绍它们的创建过程.一般来说,读和写的一一对应的,写出的文件就是为了保存数据供以后读取的.写的文件要符合shapefile的标准.之前 ...

  7. shp系列(六)——利用C++进行Dbf文件的写(创建)

    上一篇介绍了shp文件的创建,接下来介绍dbf的创建. 推荐结合读取dbf的博客一起看! 推荐结合读取dbf的博客一起看! 推荐结合读取dbf的博客一起看! 1.Dbf头文件的创建 Dbf头文件的结构 ...

  8. shp系列(二)——利用C++进行shp文件的读(打开)

    1.各数据类型及其字节数 BYTE 1;       char 1;    short 2;      int 4;    double 8; 2.位序big和little及其转换 对于位序是big的 ...

  9. python 利用 ogr 写入shp文件,数据格式

    python 利用 ogr 写入 shp 文件, 定义shp文件中的属性字段(field)的数据格式为: OFTInteger # 整型 OFTIntegerList # 整型list OFTReal ...

随机推荐

  1. tp5数据库操作 模型层

    一.数据模型作用 相同功能代码不用重复写多次 二.创建方式 在模块下建立model文件夹,php文件,文件名为数据库表名,其中类为数据库表名,继承Model类,模型层即为此表 namespace ap ...

  2. TensorFlow-LSTM序列预测

    问题情境:已知某一天内到目前为止股票各个时刻的价格,预测接下来短时间内的价格变化. import tushare as ts import time from collections import n ...

  3. tensorflow冻结层的方法

    其实常说的fine tune就是冻结网络前面的层,然后训练最后一层.那么在tensorflow里如何实现finetune功能呢?或者说是如何实现冻结部分层,只训练某几个层呢?可以通过只选择优化特定层的 ...

  4. 数据结构——栈的实现(数组、Java)

    巩固数据结构 栈是一种有限制的线性表 只能对表尾进行操作 package com.shine.test.datastruct; import java.util.Arrays; public clas ...

  5. 【技术累积】【点】【java】【9】Optional

    基础概念 java8引入的,java9有加强 Google公司出品 旨在更好的处理NullPointException 创建Optional实例和基础使用 Optional op1 = Optiona ...

  6. SQL SEVER 递归查询

    with ts as ( --首先要查询出最原始父级的信息 union all --全连接 select a.fitemclassid,a.fitemid, a.fnumber,a.Fparentid ...

  7. 用Navicat Prenium12连接Oracle数据库(oracle11g版本)时报错ORA-28547:connection to server failed,probable Oracle Net admin error.解决办法

    上网一查原来是oci.dll版本不对.因为Navicat是通过Oracle客户端连接Oracle服务器的,Oracle的客户端分为两种,一种是标准版,一种是简洁版,即Oracle Install Cl ...

  8. Mysql笔记2-----重要小点

    1.逻辑删除:

  9. 容器化haproxy+keepalived

    # 拉取haproxy镜像 docker pull haproxy:1.7.8-alpine mkdir /etc/haproxy cat >/etc/haproxy/haproxy.cfg&l ...

  10. [luogu P2590 ZJOI2008] 树的统计 (树链剖分)

    题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u ...