从 Dask 或 Pandas 数据框创建地理数据框的更快方法
Faster methods to create geodataframe from a Dask or Pandas dataframe
问题
我正在尝试剪辑一个非常大的块模型(5.8gb CSV 文件),其中包含具有高程栅格的质心 x、y 和 z 坐标。我正在尝试仅获取位于栅格图层上方的块。
我通常在 ArcGIS 中执行此操作,方法是将我的块模型点裁剪到我的栅格轮廓,然后将栅格值提取到块模型点。对于大型数据集,这在 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()
问题
我正在尝试剪辑一个非常大的块模型(5.8gb CSV 文件),其中包含具有高程栅格的质心 x、y 和 z 坐标。我正在尝试仅获取位于栅格图层上方的块。
我通常在 ArcGIS 中执行此操作,方法是将我的块模型点裁剪到我的栅格轮廓,然后将栅格值提取到块模型点。对于大型数据集,这在 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()