R语言储存矢量数据(.shp)目前有两种规范:

第一种规范来自sp工具包,数据以Spatial*DataFrame形式储存,执行的标准来自Esri shapefile的相关方法,其定义的数据结构与R中基本的数据结构有着较大的区别。它更多的关注数据中的空间信息,数据结构比较复杂。这种数据格式要素类型又可细分为如下几类:

  • SpatialPointsDataFrame

  • SpatialLinesDataFrame

  • SpatialPolygonsDataFrame

  • ....

第二种规范来自sf工具包,它制定了一种新的储存空间数据的标准,是将空间数据中每个要素看做是一个simple feature,数据结构按照要素展开,每个要素信息单独占一行,其属性数据分别对应各列,而空间信息也作为一种属性占据一列。这样从外观上看,空间数据与R中普通的数据框(data.frame)并无太大区别,使得数据结构比较清晰。

图片地址:https://mirrors.tuna.tsinghua.edu.cn/CRAN/web/packages/sf/vignettes/sf1.html


1 读取矢量数据

R中有多个工具包可以读取矢量数据,常用的有maptools中的readShapeSpatial()系列函数,rgdal中的readOGR()sf中的st_read(),前两个函数读取的文件以Spatial*DataFrame(sp)格式保存,最后一个函数读取的文件以sf格式保存。

准备示例文件:

library(tidyverse)
library(sf)
nc <- st_read(system.file("shape/nc.shp", package = "sf"))
nc2 <- mutate(nc, AREA = "面积")# 自定义文件夹位置
st_write(nc, "G:/北卡罗来纳州.shp", delete_layer = T) # 文件名含中文
st_write(nc2, "G:/nc2.shp", delete_layer = T) # 文件内含中文
st_write(nc, "G:/nc.shp", delete_layer = T) # 不含中文

1.1 readShapeSpatial()

library(maptools)sp11 <- readShapeSpatial("G:/北卡罗来纳州.shp") # 文件名含有中文字符,无法运行
sp12 <- readShapeSpatial("G:/nc2.shp") # 文件名无中文字符,文件内容含有中文字符,可以运行
sp13 <- readShapeSpatial("G:/nc.shp") # 文件名和文件内容均无中文字符,可以运行

readShapeSpatial()是一个通用函数,根据要素类型,还可以使用readShapePoints()readShapeLines()readShapePoly()等子函数。

这个函数相比于另外两个函数存在诸多缺点,已经被停止维护了,使用时会出现以下提示:

readShapeSpatial is deprecated; use rgdal::readOGR or sf::st_read

而对于中国用户来说,其最大的缺点可能就是不能读取以中文命名的文件了;若只是属性表中含有中文字符也可以读取。

1.2 readOGR()

library(rgdal)sp21 <- readOGR(dsn = "G:/", layer = "北卡罗来纳州",stringsAsFactors = F,use_iconv = TRUE,encoding = "UTF-8")
sp22 <- readOGR(dsn = "G:/", layer = "nc2",stringsAsFactors = F,use_iconv = TRUE,encoding = "UTF-8")
sp23 <- readOGR(dsn = "G:/", layer = "nc",stringsAsFactors = F)
class(sp23) # 查看数据类型
# 部分输出结果
> class(sp23) # 查看数据类型
[1] "SpatialPolygonsDataFrame"
attr(,"package")
[1] "sp"

readOGR()函数相比于readShapeSpatial()实用性更强,但也存在很多缺点:

  • 第一,调用参数过多。dsn参数指定文件夹路径,layer参数指定文件名,且不带拓展名;

  • 第二,可以读取包含中文字符的文件,但是要调用额外的参数。首先需要将use_iconv参数设置为TRUE,再设置encoding参数为UTF-8;

  • 第三,运行速度相比st_read()函数慢得多。

1.3 st_read()

library(sf)sf11 <- st_read("G:/北卡罗来纳州.shp")
sf12 <- st_read("G:/nc2.shp")
sf13 <- st_read("G:/nc.shp")
class(sf13)
# 部分输出结果
> class(sf13)
[1] "sf"         "data.frame"

可以看出,st_read()函数相比于另外两个函数调用格式简单地多,运行速度也更快。

st_read()sf工具包中还有一个别名函数read_sf(),其使用方式与st_read()差不多,主要区别是它读取数据后以tibble格式储存。

library(sf)sf21 <- read_sf("G:/北卡罗来纳州.shp")
sf22 <- read_sf("G:/nc2.shp")
sf23 <- read_sf("G:/nc.shp")
class(sf23)
# 部分输出结果
> class(sf23)
[1] "sf"         "tbl_df"     "tbl"        "data.frame"

2 两种数据格式的转换

sf格式数据具有简洁、易于理解等诸多优点,已经被广泛使用。然而,目前R中的许多空间处理方法仍然只能针对sp格式的数据进行操作,因此有时需要进行两种数据格式的转换。具体方法见以下代码:

library(sf)
world <- spData::world # 样本数据
class(world)# From sf to sp
# 方法1:使用基础包中的as函数
sp.01 <- as(world, "Spatial")
class(sp.01)
# 方法2:使用sf包中的as_Spatial函数
sp.02 <- as_Spatial(world)
class(sp.02)# From sp to sf
# 方法1:使用基础包中的as函数
sf.01 <- as(sp.01, "sf")
class(sf.01)
# 方法2:使用sf包中的st_as_sf函数
sf.02 <- st_as_sf(sp.01)
class(sf.02)

3 保存数据到本地

如果要将空间矢量数据以shp格式保存在本地,可以使用sf中的st_write()函数或它的别名函数wrtite_sf()

st_write(world, "G:/world.shp")
write_sf(world, "G:/world2.shp")

需要注意的是,st_write()在保存前需要将该文件夹下的同名文件删掉或重命名,否则会报错;或者设置参数delete_layer为TRUE:

st_write(world, "G:/world.shp", delete_layer  = TRUE)

write_sf的该参数默认为TRUE,无需修改。

sf | 读取和保存空间矢量数据相关推荐

  1. Fashion-mnist数据的读取与保存

    Fashion-mnist数据的读取与保存 图像分类数据集(Fashion-MNIST) 一.获取数据集 1.1 方法一 1.2 方法二 二.显示数据 2.1 方法一 2.2 方法二 三.保存数据 四 ...

  2. Flash数据读取和保存

    实现方法 Flash数据读取和保存的目的是在单片机的程序存储区开辟一块空间专门用来保存系统需要记忆的参数和数据,从而完全取代EEROM,达到降低成本和数据保密的目的.该实现方法主要分为四个部分: FL ...

  3. N76E003模拟EEPROM读取和保存应用配置

    N76E003模拟EEPROM读取和保存应用配置 N76E003模拟EEPROM读取和保存应用配置的代码参考了文章: https://blog.csdn.net/u014798590/article/ ...

  4. 【深度相机D435i】Windows+Ubuntu下调用D435i利用Python读取、保存RGB、Depth图片

    目录 前言 一.D435i深度相机介绍 二.Windows下安装D435i 1.安装Intel® RealSense™ SDK 2.0 2.使用Intel® RealSense™ Viewer查看D4 ...

  5. Spark-数据读取与保存(Scala版)

    文件格式 Spark对文件的读取和保存方式都很简单,会根据文件的扩展名选择对应的处理方式 Spark支持的一些常见格式 格式名称 结构化 备注 文本文件 否 普通的文本文件,每行一条记录 JSON 半 ...

  6. 【OpenCV 例程 300篇】253. 多帧图像(动图)的读取与保存

    『youcans 的 OpenCV 例程300篇 - 总目录』 [youcans 的 OpenCV 例程 300篇]253. 多帧图像(动图)的读取与保存 1. 多帧图像(动图) 多帧图像是将多幅图像 ...

  7. 使用SimpleITK读取、保存、处理nii文件

    目录 前言 nii格式 读取nii成numpy格式 将numpy格式保存成nii 什么是origin.Direction.Spacing,以及如何设置它们 示例 重采样 重采样代码 参考链接 前言 n ...

  8. Spark的RDD 文件读取与保存

    RDD 文件读取与保存 Spark 的数据读取及数据保存可以从两个维度来作区分:文件格式以及文件系统.其中: (1)文件格式分为:text 文件.csv 文件.sequence 文件以及Object ...

  9. C++和Python,JSON文件的读取和保存

    1. Python python很简单,因为python自带json包,所以只要import就可以,具体使用如下. import json#保存json文件 root = {'Exp':[], 'Ex ...

最新文章

  1. linux运维前景与运维人员最佳职业规划录像
  2. Java 面试知识点解析(三)——JVM篇
  3. F. 更改apache端口号
  4. Spring系列(十):@Autowired 和@Resource注解用法介绍
  5. 的向上取整函数_计算机二级Excel常用函数解析
  6. windows中端口号被占用的解决方法
  7. Java集合框架之三:HashMap源码解析
  8. jsp引用带参数的js文件,例如 script src=a.js?ctxpath=${base
  9. VC6.0编译错误解决方法集锦
  10. Verilog中parameter(参数)与define(宏定义)的区别
  11. 三年级计算机 键盘指法 教案,人教版三年级信息技术《第一课 键盘操作再加强》教案(精品获奖)...
  12. 【人脸识别】基于matlab GUI BP神经网络人脸识别(含识别率)【含Matlab源码 891期】
  13. 湖南第一师范学校有计算机系吗,湖南第一师范学院有哪些专业及什么专业好
  14. 互联网行业职位介绍 —— OD、PM、RD、FE、UE、QA、OP、DBA...
  15. open-cv 读存图片
  16. 软件构造Lab2问题解决思路及感想
  17. 笔记本上搭建yum源
  18. 论文解读:SentiPrompt: Sentiment Knowledge Enhanced Prompt-Tuning for Aspect-Based Sentiment Analysis
  19. 主动移频式matlab仿真,一种新颖的主动移频式孤岛检测方法
  20. 计算机效果图线稿的制作方法,线稿效果图 怎么把照片变线稿?将图片改为线稿的方法...

热门文章

  1. 阿里云、腾讯云、华为云哪个好?迄今最全面的云服务评测报告出炉(转)
  2. 一步步实现SDDC-逻辑交换与逻辑路由
  3. Jquery学习总结(7)——JQuery常用的10个方法总结
  4. MyBatis学习总结(22)——Mybatis自增长ID获取
  5. Git学习总结(18)——让你成为Git和GitHub大神的20个技巧
  6. 对php程序的理解,小魏谈对于php程序的理解
  7. 中职计算机基础课教学策略研究,中职计算机基础知识教学方法及教学策略研究.doc...
  8. NOI OpenJudge 8469 特殊密码锁 Label贪心
  9. 《Java数据结构和算法》Seven 高级排序 快速排序
  10. servlet实现新闻控制