You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

sf包生成的plot图形使用locator()选点不准是何原因?

问题背景

确认是否可对plot.sf生成的图形使用locator()函数交互创建新点位。
运行下述示例代码时,点击图中对应位置(例如非蓝色区域的质心位置),locator()返回的坐标数值看似处于合理范围,但将返回坐标转换为sf对象回绘到图上时存在明显偏差,所有选中点均未落在实际点击的对应区域内:

library(sf)

nc = st_read(system.file("gpkg/nc.gpkg", package="sf"), quiet = TRUE)
plot(nc["SID74"], reset = FALSE)

pts <- locator()
pts <- st_sfc(st_multipoint(do.call(cbind, pts)), crs = st_crs(nc))
plot(pts, add = TRUE, pch = 16)
偏差原因
  • 基础函数graphics::locator()按照当前绘图设备的全局用户坐标系返回坐标,但plot.sf绘制带属性着色的图层时,默认会在绘图区右侧预留约12%的宽度放置色阶图例,实际地理要素仅绘制在左侧88%的横向区域内,全局坐标系没有扣除图例占用的横向空间,直接读取坐标会出现横向偏移。
  • plot.sf默认强制设置asp=1保证地理要素无变形,地理要素不会完全铺满整个绘图设备的空间,边缘留白区域也会进一步导致基础locator()返回的坐标和实际地理坐标不匹配。
解决方案
  • 方案1:绘图时关闭右侧图例,让地理要素铺满全局坐标区,此时基础locator()返回的坐标可直接使用:
library(sf)
nc = st_read(system.file("gpkg/nc.gpkg", package="sf"), quiet = TRUE)
# key.pos = NULL 参数用于关闭默认色条图例
plot(nc["SID74"], reset = FALSE, key.pos = NULL)

pts <- locator()
pts <- st_sfc(st_multipoint(do.call(cbind, pts)), crs = st_crs(nc))
plot(pts, add = TRUE, pch = 16, col = "red")
  • 方案2:需要保留图例时,直接调用sf包内置的适配版sf::locator()函数,该函数会自动识别plot.sf的绘图偏移、宽高比设置,返回的坐标本身就是带正确坐标系的sfc对象,无需手动转换:
library(sf)
nc = st_read(system.file("gpkg/nc.gpkg", package="sf"), quiet = TRUE)
plot(nc["SID74"], reset = FALSE)

# 调用sf内置的locator方法,自动适配绘图坐标偏移
pts <- sf::locator()
plot(pts, add = TRUE, pch = 16, col = "red")

内容的提问来源于stack exchange,提问作者agila

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:54:21