问题
一个含有一个及以上多边形的地理空间shp文件,一个含有经度、纬度、参数数据的csv文件。需要筛选 落在shp各个多边形中的 格点数据,并且将 落在shp各个多边形中的 每个格点数据 都显示出来。
思路
- 将csv文件中的经度、纬度信息处理成为地理空间点信息;
- 将csv的地理空间点与shp的地理空间多边形进行空间连接,筛选出落在shp各个多边形中csv点数据;
- 将结果保存到新csv文件中。
代码
import geopandas as gpd
import pandas as pd
from shapely.geometry import Point
# Load the shapefile # 打开shp
shapefile_path = "/home/shp/2015county.shp"
gdf = gpd.read_file(shapefile_path)
# Load the CSV file # 打开csv
csv_directory ="/home/O3/processed_lonlat_O3_D10K_2000.csv"
df = pd.read_csv(csv_directory)
# define how to create geometry point # 定义经纬度几何空间点创建方式
def create_point_geometry(row):
longtitude = row['longitude']
latitude = row['latitude']
return Point(longtitude, latitude)
# Create Point geometries from latitude and longitude # 创建csv的经纬度几何空间点
geometry = df.apply(create_point_geometry, axis=1)
# Convert DataFrame to GeoDataFrame # 将几何空间点转为地理空间点
gdf_points = gpd.GeoDataFrame(df, geometry=geometry)
# Set the coordinate reference system (CRS) if known # 设置坐标参考系
gdf_points.crs = {'init': 'epsg:4326'}
# Transform the CRS if needed (to match shapefile CRS) # 按需转换坐标参考系
gdf_points = gdf_points.to_crs(gdf.crs)
# Perform spatial join # shp地理空间多边形与csv地理空间点进行空间连接
points_in_polygons = gpd.sjoin(gdf_points, gdf, how="inner", op='within')
# Calculate mean of MDA8 grouped by shapefile polygons # 按需计算落在shp每个多边形中的csv地理空间点的目标数据的平均值
mean_data = points_in_polygons.groupby('区划码')['O3'].mean()
# Define the output directory for the new CSV files
output_file ="/home/O3/processed_county_O3_2000.csv"
# Save the spatially joined data to a new CSV file
points_in_polygons.to_csv(output_file, index=False)