我正在使用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)
感谢您的建议
答案 0 :(得分:1)
我找到了文件格式here的粗略描述。看起来整个变量类型和大小都有很多混合,这会使事情变得复杂一些。我不知道使用Fortran尝试读取这些数据是最好的选择,但是如果你必须在这里提供一些提示:
transfer()
功能将内存中的位置解释为特定类型。这将允许您将文件中的二进制数据读入类型integer
的变量,但随后分配给real
而不进行类型转换。我现在处于类似的情况,试图读取一个结构与dBase文件非常相似的文件(即不同大小的标题指向不同类型的文件区域),最后使用Python和Numpy读取文件。读取包括seek
到文件中的某个位置,读取一堆字节,然后使用numpy.fromstring
选项将其转换为real*4
,real*8
,{{1你可以使这个工作,但你可能想保持你的选择。
答案 1 :(得分:1)
最好的办法是将dbf文件转换为其他内容,例如使用OGR tools,在大多数Linux发行版中都可用。您只需使用ogr2ogr:
将dbf文件的内容转换为CSV文件ogr2ogr -f "CSV" output.csv FaultScarps_polyline.shp FaultScarps_polyline
(请注意,您需要包含图层名,对于Shapefile,它与shapefile的名称相同)。 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主程序。
答案 2 :(得分:0)
你可能很难在Fortran中读取二进制未格式化的文件,这些文件不是从Fortran写入语句编写的,除非你的编译器有一些扩展名。 Fortran二进制无格式文件具有记录开头和记录标记结束。这些标记通常是记录的长度(以字节为单位)。 因此,运行时系统将尝试将文件中的字符解释为记录标记并使其混淆。
转换为csv ascii并从Fortran读取它将起作用。如果您打算尝试读取其他文件类型,那么编写一些C函数来连接到C I / O库应该允许您直接读取文件。
答案 3 :(得分:0)
FortranGIS软件包具有与shapelib库的Fortran绑定,允许直接从Fortran程序编码/解码shapefile和相关的dbf文件:
适用于gfortran 4.1.2或更高版本(F2003 ISO_C_BINDING模块)。