c++ 两个多边形区域是否重叠_R语言空间数据处理:批量计算指定区域内道路长度...

使用R语言,通过sf包批量计算多边形区域内的道路长度。首先读取区域多边形和道路shp文件,进行叠加分析,然后借助lwgeom包计算几何距离,最后通过lapply循环处理多个文件并合并结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不废话,要做的事如标题。

假设我们有一个区域,在ArcGIS中长这个样子:

6e1e63bc62fd9cca422ea626d0e7700e.png

而假设我们已经有了他里面及周边的多种类型道路(例如高速、国道、市区道路等):

42edba7baaf473f2873b4e3586eecc7d.png

ps: OpenStreetMap上就能获得道路矢量图(shp),请自行取用

我们可以用R来批量计算这些道路长度。

首先读这个区域的多边形文件,并列出道路的shp文件名称:

rm(list = ls())
gc()

pacman::p_load(data.table, magrittr, dplyr, tidyr, sf, stringr)


region<-read_sf('map/oldcity.shp')

rdmaps<-c('H:/高速.shp',
          'H:/高速引路.shp',
          'H:/国道.shp',
          'H:/省道.shp',
          'H:/县道.shp',
          'H:/市区一级道路.shp',
          'H:/其它道路.shp',
          'H:/行人道路.shp',
          'H:/九级路.shp')

先读一个县道的文件,然后先与区域多边形文件intersection一下:

x<-rdmaps[5]

rddata<-read_sf(x, options = 'ENCODING=CP936') %>% st_intersection(region)

路名是中文,注意read_sf没有单独的encoding参数。读取之后直接与region叠加,叠加之后我们plot一下:

> plot(rddata)

e568f6551e1216ab04e91e86857a4734.png

这样看没感觉,在ArcGIS中对比一下:

d107eeb6403b8260fa8f9174342b02a0.png

看起来没问题。接着我们计算距离,计算几何距离的函数需要安装lwgeom包,如果没有的话会报错并提示:

> st_length(rddata)
Error in st_length(rddata) : 
  package lwgeom required, please install it first

用install.packages安装lwgeom,安装完之后再运行结果就出来了,默认单位为米:

> st_length(rddata)
Units: [m]
[1] 134.6967289 143.4617490 785.5871916   0.4189030 829.6537113   0.4306805 617.8162120
[8] 608.1285446

到这里,单文件的测试就完成了,我们写一个lapply循环然后合并结果:

result<-lapply(rdmaps, function(x) {
  rddata<-read_sf(x, options = 'ENCODING=CP936') %>% st_intersection(region)
  
  rddata<-data.table(rdname = sub(x, pattern = 'H:/', replacement = '') %>%
                       sub(pattern = '.shp', replacement = ''),
                     length = sum(st_length(rddata), na.rm = T))
  return(rddata)
}) %>% rbindlist()

补充一点,sub用于字符串的替换,而.在函数里是转义符,要用两个反斜杠来消除转义规则。

合并之后print结果(result):

> result
         rdname         length
1:         高速   3120.194 [m]
2:     高速引路      0.000 [m]
3:         国道  13456.898 [m]
4:         省道  31839.923 [m]
5:         县道  10408.385 [m]
(下略)

到此结束。sf几乎支持所有基本的几何计算,要了解更多请阅读sf包的介绍页

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值