【ArcGIS】根據shp范圍生成系列等距點
- 目標1:生成邊界外一定范圍、并且等間距分布的點
- 📁 所需數據:
- 操作步驟-ArcGIS
- 代碼處理-Python
- 目標2:生成等距漁網點
- 📁 所需數據:
- 代碼處理-Python
- 參考
目標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. 投影為 WGS84points_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. 導出為 CSVarcpy.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 osdef 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.xgdf_points["lat"] = gdf_points.geometry.y# 保存為CSVgdf_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邊界范圍擴展生成
)