跳到主要内容

昕图XinGEO的空间计算

昕图XinGEO的设计目标就是一个GIS数据处理的平台,以服务器强大的多核计算能力为依托,提供GIS数据计算,更深入来说是一个模型计算平台,耦合GIS和专业模型,集成气象、生态、环境等领域专业模型,可进行高性能计算。

在开发CRGIS时,我们采用Numpy和Geopandas进行gis计算,但在使用过程中,发现先,Numpy对栅格数据进行处理,当栅格数据较大时导致内存溢出;且numpy运行过程无法并行,无法发挥服务器多核和集群的优势。

因此我们在XinGEO开发时,采用了dask,XArray、rioxarray替代numpy实现栅格大数据的运行处理。理论上,凭他可以计算非常大的栅格数据,比如中国30m分辨率的地形数据,可以直接进行计算,且是并行的。

多进程运行对比

在Numpy和dask的选择上,我们进行了多次对比,发现使用DASK编程,计算效率远高于Numpy。

Dask是一个并行计算库,用于在单个计算机或集群上扩展Python代码。它可以用来处理大规模数据计算,并能够与许多科学计算和数据分析库(如NumPy、Pandas和Scikit-Learn)无缝集成。Dask的核心组件包括Dask数组、Dask数据框和Dask延迟,这些组件可以帮助用户有效地分配和管理计算任务。

from dask.distributed import Client, WorkerPlugin
client = Client(threads_per_worker=1, n_workers=8)

通过client = Client(threads_per_worker=1, n_workers=8)来启动多核,其中threads_per_worker为线程数,n_workers为进程数。

对于计算密集型的,利用集群来计算是合适的。

import dask.array as da
import numpy as np
from dask.distributed import Client

def main():
# 创建一个随机的 NumPy 数组
np_array = np.random.random((2000, 2000))

# 将 NumPy 数组转换为 Dask 数组
dask_array = da.from_array(np_array, chunks=(500, 500))

# 定义一个用于块处理的函数
def process_block(block):
# 在这个例子中,我们简单地对每个块取平方

return block ** 2

# 使用 map_blocks 对每个块进行处理
result = dask_array.map_blocks(process_block)

client = Client(threads_per_worker=1, n_workers=1) # 根据 CPU 核心数增加 worker 数量
import time
start_time=time.time()
# 计算结果并收集
computed_result = result.compute()
print(f'time:{time.time()-start_time}' )
client.close()
# 打印结果的形状
print(computed_result.shape)

if __name__ == '__main__':
main()

上面的例子不开启集群,运行时间为0.535s左右。

多核开启情况低计算量高计算量
不开启0.0189s13.449s
n_workers=10.25494.867s
n_workers=40.19051.587s
n_workers=80.1821.377s

如果在分布式集群环境下,只运行多线程compute(scheduler='threads'),运行时间为0.02268。

GIS工具箱

现在我们开发了矢量基础工具、栅格基础工具、空间分析工具、分析工具、数据管理工具等5个工具箱,但没有完全开发完毕,后续仍在继续添加。

工具箱可以直接在工具箱扩展栏直接使用,也可以让AI自动调用。

image-20251107111108720

工具箱的具体说明,需要参考GIS工具箱 | 昕图帮助中心

有两个工具,栅格计算器和矢量计算器比较特殊,有单独说明的,但现在正在改造这两个工具的前端语法,仍需一小段时间才能面世。

直接使用

在工具箱中查找,或者直接点击即可使用。比如使用概化工具为例,点击矢量基础工具-要素处理-概化,出现以下参数。

  • 输入矢量文件:一般提供直接选择项目中的文件或者从云盘读取。
  • 简化容差和拓扑容差:根据实际输入
  • 输出路径:生成的文件默认会保存在工程所在的路径下,用户可以手动修改。
  • 输出文件名:用户自行输入,也可以使用默认值。

image-20251107111721497

AI调用

以同样的概化工具为例,可以使用ai调用,这个更简单。

在AI操作台输入概化规划范围这个数据即可。

image-20251107112433700

概化后的前后对比

image-20251107112613711