python - 从 Dask 或 Pandas 数据帧创建地理数据帧的更快方法

标签 python pandas gis geospatial geopandas

问题

我正在尝试剪辑一个非常大的 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/

相关文章:

python - Pandas:水平组合两个 DataFrame

python - 神秘的 IndexError - 非常基本的问题(Python)

ios - 在 iOS 上带路线的离线 map

python - Django ValueError : The view usermanager. views.group_perm 没有返回 HttpResponse 对象。它返回 None 而不是

python 3.4 谷歌浏览器历史

python - 对(删除的)重复行的值求和 Pandas DataFrame

python - 如何将数据帧转换为“从-到”对?

python - Pandas 有条件地返回另一列中相应位置的值

python - Google Earth Engine Python API 的解决方法和 Python 3 中不支持 `ee.mapclient`

javascript - Openlayers 设置图层索引