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

我在这里找到了文件格式的粗略描述。看起来整个过程中变量类型和大小的组合相当多,这会使事情变得有些复杂。我不知道使用 Fortran 尝试读取这些数据是否是最好的选择,但如果你必须,这里有一些提示:

  • 打开文件以直接访问未格式化的 I/O。未格式化意味着您可以直接从文件中读取字节,直接访问不会向记录添加任何填充。
  • 将记录长度设置为字段之间的最小公共长度
  • 使用该transfer()函数将内存中的位置解释为特定类型。这将允许您将文件中的二进制数据读取到类型变量中,integer然后分配给 areal而无需进行类型转换。

我现在处于类似的情况,试图读取一个结构与 dBase 文件非常相似的文件(即不同大小的标题指向不同类型的文件区域),最终使用 Python 和 Numpy 读取文件。读取包括seeking 到文件中的某个位置,读取一堆字节,然后使用numpy.fromstring选项将其转换为real*4, real*8,integer*8等。您可以完成这项工作,但您可能希望保持选项打开。

于 2009-04-16T15:34:49.740 回答
1

Your best bet is to conver the dbf file into something else, using e.g. the OGR tools, available in most linux distributions. You can just convert the contents of the dbf file into a CSV file using ogr2ogr:

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

(note that you need to include the layername, which for Shapefiles, is identical to the shapefile's name). The first 3 lines of the CSV look like this:

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]

An alternative would be to access the Shapefile using OGR (or Shapelib) and doing the processing in C, returning it to the main Fortran program.

于 2009-08-20T01:48:24.003 回答
0

FortranGIS 包具有与 shapelib 库的 Fortran 绑定,允许直接从 Fortran 程序编码/解码 shapefile 和关联的 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 中读取不是从 Fortran 写入语句写入的二进制未格式化文件。Fortran 二进制未格式化文件具有记录开始和记录结束标记。这些标记通常是以字节为单位的记录长度。因此运行时系统会尝试将文件中的字符解释为记录标记并感到困惑。

转换为 csv ascii 并从 Fortran 读取将起作用。如果您要尝试读取其他文件类型,那么编写一些 C 函数来连接 CI/O 库应该允许您直接读取文件。

于 2009-09-04T15:37:15.320 回答