【ArcGIS】根据shp范围生成系列等距点
目标1:生成边界外一定范围、并且等间距分布的点
目标:生成位于 某地区边界外一定范围、并且等间距分布的点图层。
📁 所需数据:
研究区边界 .shp 文件(Polygon 类型)
操作步骤-ArcGIS
ArcGIS 中最简单的方式是:
- 对边界生成缓冲区(一定距离)
例如 50 km - 将边界 + 缓冲区边界都转为线(Polyline)
- 在缓冲区边界线(外圈)上以等间距生成点
代码处理-Python
以重庆市为例,生成的外部等距点如下:
Python完整代码如下:
import arcpy
import os
# 输入路径(替换为你的路径)
input_shp = r"D:\0 DataBase\0 Chongqin Database\1 Boundary\Chongqing.shp"
workspace = r"D:\0 DataBase\0 Chongqin Database\1 Boundary\temp_boundary_points"
csv_output = r"D:\0 DataBase\0 Chongqin Database\1 Boundary\Boundary_Chongqing.csv"
# 设置环境
arcpy.env.overwriteOutput = True
if not os.path.exists(workspace):
os.makedirs(workspace)
arcpy.env.workspace = workspace
# 坐标系
prj = arcpy.SpatialReference(4548) # CGCS2000 / UTM Zone 48N
wgs84 = arcpy.SpatialReference(4326) # WGS84 经纬度
try:
# 1. 投影为米制
projected = os.path.join(workspace, "Chongqing_projected.shp")
arcpy.Project_management(input_shp, projected, prj)
# 2. 创建缓冲区(50公里)
buffer = os.path.join(workspace, "Chongqing_buffer.shp")
arcpy.Buffer_analysis(projected, buffer, "50000 Meters", dissolve_option="ALL")
# 3. 缓冲区转为边界线
buffer_line = os.path.join(workspace, "buffer_line.shp")
arcpy.PolygonToLine_management(buffer, buffer_line)
# 4. 沿线生成等间距点(20km 间距)
points_on_line = os.path.join(workspace, "control_points.shp")
arcpy.GeneratePointsAlongLines_management(
buffer_line,
points_on_line,
"DISTANCE",
"20000 Meters",
"",
"NO_END_POINTS"
)
# 5. 投影为 WGS84
points_wgs84 = os.path.join(workspace, "control_points_wgs84.shp")
arcpy.Project_management(points_on_line, points_wgs84, wgs84)
# 6. 添加几何属性(使用合法值 POINT_X_Y_Z_M)
arcpy.AddGeometryAttributes_management(
points_wgs84,
"POINT_X_Y_Z_M"
)
# 7. 导出为 CSV
arcpy.TableToTable_conversion(
points_wgs84,
os.path.dirname(csv_output),
os.path.basename(csv_output)
)
print("✅ 成功生成控制点 CSV 文件:Boundary_Chongqing.csv")
except Exception as e:
print("❌ 脚本运行出错:", str(e))
目标2:生成等距渔网点
生成shp边界范围内的等距渔网点,如下:
📁 所需数据:
研究区边界 .shp 文件(Polygon 类型)
代码处理-Python
以重庆市为例,生成的渔网如下:(仅保留边界内数据)
Python完整代码如下:
import geopandas as gpd
from shapely.geometry import Point
import pandas as pd
import numpy as np
import os
def generate_grid_points(
shp_path=None,
output_csv="pop_location_d01.csv",
spacing=0.1,
filter_by_shp=True
):
"""
生成等距网格点,支持基于Shapefile筛选或仅参考其范围生成。
参数:
shp_path (str): SHP文件路径(若 filter_by_shp=True 时必须提供)
output_csv (str): 输出CSV文件名
spacing (float): 网格间隔(单位:度)
filter_by_shp (bool): 是否根据SHP边界筛选点
返回:
pd.DataFrame: 包含经纬度的DataFrame
"""
# 检查shp文件路径(无论 filter_by_shp 为True或False,都需要范围)
if shp_path is None or not os.path.exists(shp_path):
raise ValueError("必须提供有效的 shp_path。")
# 读取边界
gdf_boundary = gpd.read_file(shp_path)
gdf_boundary = gdf_boundary.to_crs(epsg=4326)
minx, miny, maxx, maxy = gdf_boundary.total_bounds
# 向外扩展到最接近的整数
minX = np.floor(minx)
maxXX = np.ceil(maxx)
minY = np.floor(miny)
maxY = np.ceil(maxy)
# 生成经纬度序列
lon_vals = np.arange(minx, maxx + spacing, spacing)
lat_vals = np.arange(miny, maxy + spacing, spacing)
# 创建所有网格点
grid_points = [Point(lon, lat) for lon in lon_vals for lat in lat_vals]
gdf_points = gpd.GeoDataFrame(geometry=grid_points, crs="EPSG:4326")
# 如果需要进行边界筛选
if filter_by_shp:
gdf_points = gdf_points[gdf_points.within(gdf_boundary.unary_union)]
# 提取经纬度
gdf_points["lon"] = gdf_points.geometry.x
gdf_points["lat"] = gdf_points.geometry.y
# 保存为CSV
gdf_points[["lon", "lat"]].to_csv(output_csv, index=False, encoding="utf-8")
print(f"✅ 成功生成 {len(gdf_points)} 个网格点,已保存到:{output_csv}")
return gdf_points[["lon", "lat"]]
# 示例调用
generate_grid_points(
shp_path=r"D:\0 DataBase\0 Chongqin Database\1 Boundary\Chongqing.shp",
output_csv="pop_location_d01_CQ.csv",
spacing=0.1,
filter_by_shp=False # 不进行空间筛选,但以shp边界范围扩展生成
)