2016-12-21 17 views
0

csvデータ(25,000行以上)を抽出するために、繰り返し大きなラスタ(300〜2500 Mb)を処理します。これらをプロットするために通常のGIS(ArcGIS、QGIS、Grass、...)を使用することは、実際には苦痛であり、データのサイズに関しては時間が紛らわしく、効率的な方法を探しています。Python - 大規模なGISデータセットプロット

コードが使用されます:

  • GDALのラスタをインポートすると、ループの2D numpyのアレイ
  • に使用してデータを抽出するために、この2D numpyのアレイで前処理するラスタ
  • csvファイルを別の2D numpy配列
  • 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

、GDALのがあり圧縮されていないイメージ全体をメモリにロードしてから、非常にゆっくりと実行する必要があります。

マップの小さな部分を抽出する必要がある大規模なマップでいくつかのテストを行った後、私は画像を圧縮されていない "TIFF"ファイル形式に変換して終了しました。 TIFFはGdalライブラリ(実際にはlibtiff)によって効率的に読み取られているように見えます。たとえば、ライブラリはディスクからファイルの必要な部分だけをメモリにロードします。

ファイルをTIFF形式に変換するか、入力として使用する入力ファイル形式について詳しく教えてください。

編集:あなたはラインが "readarray()"が最も遅いと答えます。これは、これがクロッピングではなく、遅いファイルのロードであることを確認します。その後、ファイルを変換するか、RAMにすべてをロードしない独自のENVI BIL DEMファイルパーサを作成することしかできませんでした。

+0

こんにちは、私はENVI bil形式を使用しています。これは、xyzデータをBILファイルに保存し、GIS情報をhdrヘッダーファイルに保存するバイナリファイルです。 – boris

+0

2次元アレイにデータをロードするには、500メガバイトのENVI BIL DEMに対して約40秒かかります。手動でのトリミングを避けるために、タスクを自動化することが考えられます。この自動化は、ここでの最初の段階では5~10分かかります。 – boris

+0

どのラインが最も遅いか正確に教えていただけますか? (500 MBの場合は40秒かかりますか?) –

関連する問題