0

私は gfortran を使用しています。ESRI Shapefile に関連付けられた .dbf ファイルからレコードを読み取る関数を作成する必要があります。私が読めるはずのファイルは、インターネットから入手できますhttp://diss.rm.ingv.it/diss/DISS_3.0.4.shp.zip

fileファイルの形式に関するコマンドの意見は次のとおりです。

$ file GGSources_polyline.dbf
GGSources_polyline.dbf: \012- DBase 3 data file\012-  (119 records)

ご提案いただきありがとうございます

4

4 に答える 4

1

最善の策は、ほとんどの Linux ディストリビューションで利用可能なOGR ツールなどを使用して、dbf ファイルを別のものに変換することです。ogr2ogr を使用して、dbf ファイルの内容を CSV ファイルに変換するだけです。

ogr2ogr -f "CSV" output.csv FaultScarps_polyline.shp FaultScarps_polyline

(シェープファイルの場合、シェープファイルの名前と同じレイヤー名を含める必要があることに注意してください)。CSV の最初の 3 行は次のようになります。

IDSOURCE,IDSCARP,SOURCENAME,FAULTSCARP,LENGHT,HEIGHT,AVGVOFFSET,MAXVOFFSET,VOFFSETTYP,AVGHOFFSET,MAXHOFFSET,HOFFSETTYP,AGE,NOEVENTS,LENGHTQ,HEIGHTQ,VOFFSETQ,HOFFSETQ,AGEQ,NOEVENTSQ,LENGHTN,HEIGHTN,VOFFSETN,HOFFSETN,AGEN,NOEVENTSN,REFERENCE
ITGG001,          1,Ovindoli-Pezza,Ovindoli-Pezza Fault Piano Pezza,  4.40, 18.00,   9.750,  16.000,          1,   0.000,   0.000,3,             10.000000000000000,3,1,0,1,1,1,1,Based on topographic observations.,Max height in late Pleistocene-Holocene fluvioglacial deposits.,Based on geological survey and refers to late Pleistocene-Holocene deposits.,Based on geological survey.,Based on geological observations.,Refers to Holocene and based on paleoseismology.,Pantosti et al. [1996].
ITGG001,          2,Ovindoli-Pezza,Ovindoli-Pezza  Fault Campo Porcaro,  8.60,  0.00,   8.700,  12.000,          1,   3.045,   4.025,1,             18.000000000000000,3,1,0,1,1,1,1,Based on topographic observations.,,Max offset observed  in the late Pleistocene-Holocene fluvioglacial and moraine deposits.,"Calculated as 35 % of the vertical component, on the basis of literature data.",Based on geological observations.,Refers to Holocene and based on paleoseismology.,Pantosti et al. [1996]

別の方法として、OGR (またはShapelib ) を使用して Shapefile にアクセスし、C で処理を行い、それをメインの Fortran プログラムに戻すこともできます。

于 2009-08-20T01:48:24.003 に答える
1

ここでファイル形式の大まかな説明を見つけました。全体的に変数の型とサイズがかなり混在しているように見えますが、これはやや複雑になります。Fortran を使用してこのデータを読み取ろうとすることが最善の選択肢であるかどうかはわかりませんが、必要な場合は、いくつかのヒントを以下に示します。

  • フォーマットされていない I/O に直接アクセスするためにファイルを開きます。フォーマットされていないということは、ファイルから直接バイトを読み取ることができ、直接アクセスしてもレコードにパディングが追加されないことを意味します。
  • レコード長をフィールド間の最小共通長として設定します
  • 関数を使用してtransfer()、メモリ内の場所を特定の型として解釈します。これにより、ファイルからバイナリ データを型の変数に読み込むことができますが、型キャストを行わずintegerに a に代入できます。real

私は同様の状況にあり、dBase ファイルと非常によく似た構造を持つファイル (つまり、さまざまなタイプのファイルの領域を指すさまざまなサイズのヘッダー) を読み込もうとしており、最終的に Python と Numpy を使用してファイルを読み込んでいます。読み取りはseek、ファイル内の場所に ing し、一連のバイトを読み取り、オプションを使用してそれを、、などnumpy.fromstringに変換することで構成されます。これを機能させることはできますが、オプションを開いたままにしておくことをお勧めします。real*4real*8integer*8

于 2009-04-16T15:34:49.740 に答える
0

FortranGIS パッケージには、shapelib ライブラリへの Fortran バインディングが含まれており、Fortran プログラムからシェープファイルと関連する dbf ファイルを直接エンコード/デコードできます。

http://fortrangis.berlios.de/は、後にhttps://github.com/ARPA-SIMC/fortrangisに移動しました

gfortran 4.1.2 以降 (F2003 ISO_C_BINDING モジュール) で動作します。

于 2012-02-07T12:19:30.293 に答える
0

Fortran の write ステートメントから書き込まれたものではないフォーマットされていないバイナリ ファイルを Fortran で読み取るのは、コンパイラに何らかの拡張機能がない限り、苦労するかもしれません。Fortran バイナリのフォーマットされていないファイルには、レコード開始マークとレコード終了マークがあります。これらのマークは通常、レコードの長さ (バイト単位) です。そのため、ランタイム システムはファイル内の文字をレコード マークとして解釈しようとし、混乱します。

csv ascii に変換して Fortran から読み取るとうまくいきます。他のファイル タイプを読み込もうとする場合は、CI/O ライブラリにインターフェイスする C 関数をいくつか書くと、ファイルを直接読み込めるようになります。

于 2009-09-04T15:37:15.320 に答える