Python - 大型GIS数据集绘图

时间:2016-12-21 09:50:28

标签: python performance plot gis raster

我处理重复大的栅格(300~2500 Mb)以提取csv数据(超过25.000行)。使用常规GIS(ArcGIS,QGIS,Grass,...)来绘制这些非常痛苦,并且在数据大小方面令人困惑,我正在寻找一种有效的方法来在光栅上绘制这些点。

代码将使用:

  • Gdal导入栅格并使用2D numpy数组提取数据
  • 用于此2D numpy数组中的循环以预处理栅格
  • 在另一个2D numpy数组中导入csv文件
  • pyqtgraph绘制图像及其上的点。

我写了第一阶段,表现不是很高。

我正在寻找建议/备注以改善这种脚本的性能:)(Cython,多处理,甚至是另一种语言,如果值得的话)。我在方法上真的很开心,我不是计算机科学家^^。

非常感谢,

鲍里斯

PS:这是代码,它尚未完成,但概述是:

import numpy as np
import gdal
import pyqtgraph as pg

print "import the bil file"
BilFile = gdal.Open("SRTM90_final_PP.bil")
print "extract data"
band = BilFile.GetRasterBand(1)
data = band.ReadAsArray()
print "Remove no data"

ndRowMin = -1
ndRowMax = -1
ndColMin = -1
ndColMax = 999999999

for i in range(data.shape[0]):
    for j in range (data.shape[1]):
        if((data[i][j] != -9999.) and (ndRowMin ==-1)):
            ndRowMin = i-1
        else:
            if((data[i][j] == -9999.) and (j==data.shape[1]-1)):
                ndRowMax = i
                break
        if((data[i][j] == -9999.) and (ndColMin+1 < j)):
            ndColMin = j-1
        if((data[i][j] == -9999.) and ndColMax > j):
            ndColMax = j

dataP = data[ndRowMin:ndRowMax][ndColMin:ndColMax]
print dataP

pg.image(dataP)
pg.QtGui.QApplication.exec_() 

1 个答案:

答案 0 :(得分:1)

根据输入文件格式,Gdal可能需要将整个未压缩的图像加载到内存中,然后运行得非常慢。

在需要提取小块地图的大地图上进行多次测试后,我结束了将我的图像转换为未压缩的&#34; TIFF&#34;文件格式。 Gdal库(实际上是libtiff)似乎可以有效地读取TIFF,例如,库只会从磁盘中将所需的文件部分加载到内存中。

尝试将您的文件转换为TIFF或告诉我们有关您用作输入的输入文件格式的更多信息。

编辑:您回答该行是&#34; readarray()&#34;是最慢的。这证实这是你的文件加载缓慢,而不是裁剪。然后你只能转换文件或制作你自己的ENVI bil DEM文件解析器,它不会在RAM中加载所有内容。