R语言sf包st_crop裁剪shapefile异常 如何正确裁剪法国区域
问题原因
你裁剪失效、报空几何错误都是几个基础用法错误导致的:
- 直接给
st_crop传裸的命名数值向量时,函数很多时候无法正确识别为边界框参数,会直接跳过裁剪返回原始数据,这就是你第一次运行完绘图和原图一模一样的核心原因。 - 你用绘图定位器取到的0.28、0.33这类低值根本不是空间数据的真实坐标,只是R绘图设备的相对坐标。你的海岸线数据用的是ETRS89_LAEA_Europe投影,单位是米,所有要素坐标都在-37万到760万米区间,传个位数、0点几的裁剪范围完全碰不到任何要素,自然返回空几何,绘图时报NA边界框的错误。
- 你第一次设置的裁剪范围(x到600万、y到500万)几乎覆盖了大半个欧洲,就算裁剪生效,视觉上也不会有特别明显的缩放感。
正确裁剪方法
方法1:用标准bbox对象裁剪(手动指定范围)
st_crop要求传入的边界框必须是bbox类对象,不能直接传裸向量,而且必须和原数据坐标系一致。ETRS89_LAEA投影下法国本土大致坐标范围如下,直接用这个构造bbox裁剪即可:
# 构造标准边界框,严格保证xmin < xmax、ymin < ymax france_bbox <- st_bbox( c(xmin = 3000000, ymin = 2200000, xmax = 4300000, ymax = 3200000), crs = st_crs(europe) # 绑定和原数据完全一致的坐标系 ) europe_france <- st_crop(europe, france_bbox) plot(europe_france)
注意:必须给bbox绑定和原数据一致的坐标系,否则裁剪范围会完全错位。如果需要微调范围,直接修改bbox里的四个数值就行,所有数值单位都是米。
方法2:用行政边界裁剪(推荐,精度最高)
手动输坐标很容易裁多或者裁少,最稳妥的方式是拿到法国本土的行政边界矢量,先转成和海岸线数据一致的投影,再做相交裁剪:
# 假设france是你读入的法国边界矢量数据 # 先统一坐标系 france <- st_transform(france, st_crs(europe)) # 相交裁剪得到法国区域海岸线 europe_france <- st_intersection(europe, france) plot(europe_france)
注意事项
- 所有裁剪参数必须严格满足
xmin < xmax、ymin < ymax,否则函数会直接返回原数据不做任何处理。 - 不要用绘图窗口的定位器取坐标当裁剪参数,取到的是设备相对坐标,不是真实空间坐标。
- 做空间操作前一定要确认所有参与运算的数据坐标系完全一致,否则会出现各种莫名其妙的错位、空结果问题。
内容的提问来源于stack exchange,提问作者CharlotteS.
相关产品推荐
相关产品推荐

