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

如何在R/Python中基于数据框边界创建单侧线缓冲区

R语言实现单侧线缓冲区

核心思路

  1. 先将零散经纬度点转换为连续线要素(而非单个点集合);
  2. 切换到米为单位的投影坐标系(比如UTM,避免经纬度度单位无法直接计算距离);
  3. 使用st_buffer的side参数指定单侧缓冲方向("left"或"right",方向由线的顶点顺序决定)。

代码实现

# 加载依赖包
library(sf)

# 导入你的坐标数据
df <- data.frame(
  id = 1:30,
  long = c(13.75873,13.76508,13.76412,13.76378,13.76174,13.75852,13.75661,13.75178,13.73603,13.73401,13.73481,13.74191,13.75218,12.95308,12.92636,12.91354,12.84433,12.81312,12.79649,12.77692,12.75974,12.75056,12.74033,12.73270,12.72690,12.71117,12.69707,12.69542,12.69261,12.65590),
  lat = c(60.43691,60.43032,60.41860,60.41610,60.40868,60.39951,60.39255,60.38731,60.37975,60.37771,60.37146,60.36131,60.34841,59.28652,59.24958,59.24680,59.25892,59.26769,59.27055,59.26879,59.26371,59.26391,59.26335,59.26140,59.26008,59.26290,59.26618,59.26616,59.26163,59.23614)
)

# 转换为WGS84坐标系的线要素
line_sf <- df %>%
  st_as_sf(coords = c("long", "lat"), crs = 4326) %>%
  st_combine() %>%
  st_cast("LINESTRING")

# 转成UTM投影(EPSG:32633,适配北纬60度区域,米单位)
line_utm <- st_transform(line_sf, crs = 32633)

# 创建左侧20km缓冲区,右侧缓冲改side="right"
buffer_left_20km <- st_buffer(line_utm, dist = 20000, side = "left")

# 可选:转回WGS84经纬度坐标系
buffer_left_wgs84 <- st_transform(buffer_left_20km, crs = 4326)

# 可视化验证
plot(buffer_left_wgs84)
plot(line_sf, add = TRUE, col = "red")

Python语言实现单侧线缓冲区

核心思路

  1. 用geopandas将点数据转为连续线要素;
  2. 切换到米单位投影坐标系;
  3. 通过buffer方法的single_sided=True参数,结合正负距离控制单侧缓冲方向。

代码实现

import geopandas as gpd
from shapely.geometry import LineString

# 导入你的坐标数据
data = {
    "id": range(1,31),
    "long": [13.75873,13.76508,13.76412,13.76378,13.76174,13.75852,13.75661,13.75178,13.73603,13.73401,13.73481,13.74191,13.75218,12.95308,12.92636,12.91354,12.84433,12.81312,12.79649,12.77692,12.75974,12.75056,12.74033,12.73270,12.72690,12.71117,12.69707,12.69542,12.69261,12.65590],
    "lat": [60.43691,60.43032,60.41860,60.41610,60.40868,60.39951,60.39255,60.38731,60.37975,60.37771,60.37146,60.36131,60.34841,59.28652,59.24958,59.24680,59.25892,59.26769,59.27055,59.26879,59.26371,59.26391,59.26335,59.26140,59.26008,59.26290,59.26618,59.26616,59.26163,59.23614]
}

# 创建WGS84坐标系的GeoDataFrame
gdf = gpd.GeoDataFrame(data, geometry=gpd.points_from_xy(data["long"], data["lat"]), crs="EPSG:4326")

# 将点集合转为连续线要素
line = LineString(gdf.geometry.tolist())
line_gdf = gpd.GeoDataFrame([{"geometry": line}], crs="EPSG:4326")

# 转成UTM投影(EPSG:32633,米单位)
line_utm = line_gdf.to_crs("EPSG:32633")

# 创建左侧20km缓冲区:distance=20000为左侧,-20000为右侧(方向由线顶点顺序决定)
buffer_left_20km = line_utm.buffer(distance=20000, single_sided=True)

# 可选:转回WGS84坐标系
buffer_left_wgs84 = buffer_left_20km.to_crs("EPSG:4326")

# 可视化验证
ax = buffer_left_wgs84.plot(color="lightblue")
line_gdf.plot(ax=ax, color="red")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:47:07