如何在R/Python中基于数据框边界创建单侧线缓冲区
R语言实现单侧线缓冲区
核心思路
- 先将零散经纬度点转换为连续线要素(而非单个点集合);
- 切换到米为单位的投影坐标系(比如UTM,避免经纬度度单位无法直接计算距离);
- 使用
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语言实现单侧线缓冲区
核心思路
- 用
geopandas将点数据转为连续线要素; - 切换到米单位投影坐标系;
- 通过
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
相关产品推荐
相关产品推荐

