问题
我正在尝试剪辑一个非常大的 block 模型(5.8gb CSV 文件),其中包含具有高程栅格的质心 x、y 和 z 坐标。我试图仅获取位于栅格层上方的 block 。
我通常在 ArcGIS 中通过将 block 模型点剪切到栅格轮廓,然后将栅格值提取到 block 模型点来执行此操作。对于大型数据集,这在 ArcGIS 中需要花费大量时间(是的,这是一个技术术语)。
我想如何解决
我想通过将 CSV 导入 Python 来加快速度。使用 Dask,这既快速又简单:
import dask
from dask import dataframe as dd
BM = dd.read_csv(BM_path, skiprows=2,names=["X","Y","Z","Lith"])
但是使用 geopandas 创建 GeoDataFrame 并不是一个快速的过程。我认为使用以下多处理代码来加速可能会起作用:
import multiprocessing as mp
from multiprocessing import pool
import geopandas as gpd
pool=mp.Pool(mp.cpu_count())
geometry = pool.apply(gpd.points_from_xy, args=(BM.X,BM.Y,BM.Z))
pool.close()
但是,我已经等待了一个小时,但看不到结束的迹象。
我还尝试在以下代码中将整个地理数据框一次性放在一起,但意识到存在一些我不知道如何纠正的语法错误,特别是在将“geometry=”传递给args=时:
pool = mp.Pool(mp.cpu_count())
results = pool.apply(gpd.GeoDataFrame, args=(BM,geometry=(BM.X,BM.Y,BM.Z)))
pool.close()
我想知道是否有人对如何加快速度并提高此过程的效率有更好的想法,无论我是否能够并行化。
最佳答案
链接 dask 和 geopandas 的最佳方式是 dask-geopandas 包。
import dask
from dask import dataframe as dd
import dask_geopandas
BM = dd.read_csv(BM_path, skiprows=2,names=["X","Y","Z","Lith"])
BM["geometry"] = dask_geopandas.points_from_xy(BM,"X","Y","Z")
gdf = dask_geopandas.from_dask_dataframe(BM, geometry="geometry")
这将为您提供分区的dask_geopandas.GeoDataFrame
。如果您想将其转换为标准的geopandas.GeoDataFrame
,您只需调用compute()
即可。
gpd_gdf = gdf.compute()
关于python - 从 Dask 或 Pandas 数据帧创建地理数据帧的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71685387/