Какой самый простой способ прочитать файл .dbf из gfortran? - PullRequest
0 голосов
/ 15 апреля 2009

Я использую gfortran, мне нужно написать функцию, которая читает записи из файла .dbf, связанного с шейп-файлом ESRI. Файл, который я должен прочитать, доступен в интернете 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 ]

1 голос
/ 20 августа 2009

Лучше всего конвертировать файл dbf во что-то другое, например, используя инструменты OGR , доступные в большинстве дистрибутивов Linux. Вы можете просто преобразовать содержимое файла dbf в файл CSV, используя ogr2ogr:

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

(обратите внимание, что вам нужно включить имя слоя, которое для шейп-файлов идентично имени шейп-файла). Первые 3 строки CSV выглядят так:

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]

Альтернативой может быть доступ к Shapefile с использованием OGR (или Shapelib ) и выполнение обработки в C, возвращая его в основную программу Fortran.

1 голос
/ 16 апреля 2009

Я нашел грубое описание формата файла здесь . Похоже, что существует множество различных типов и размеров, что несколько усложнит ситуацию. Я не знаю, лучше ли использовать Fortran для чтения и чтения этих данных, но если вам нужно, вот несколько советов:

  • Открыть файл для прямого доступа к неформатированному вводу / выводу. Неформатированный означает, что вы можете просто прочитать байты прямо из файла, и прямой доступ не добавит никаких дополнений к записям.
  • Установить длину записи как наименьшую общую длину между полями
  • Используйте функцию transfer(), чтобы интерпретировать местоположение в памяти как определенный тип. Это позволит вам прочитать двоичные данные из файла в переменную типа integer, но затем присвоить real без выполнения приведения типа.

Я сейчас нахожусь в подобной ситуации, пытаясь прочитать файл со структурой, очень похожей на файл dBase (т.е. различные размеры заголовков, указывающих на области файла с разными типами), и в итоге использовал для чтения Python и Numpy файл. Чтение состоит из seek вхождения в файл, чтения группы байтов, затем использования опции numpy.fromstring для преобразования этого в real*4, real*8, integer*8 и т. Д. Вы можете сделать эту работу , но вы можете оставить свои настройки открытыми.

0 голосов
/ 07 февраля 2012

Пакет FortranGIS имеет привязки Fortran к библиотеке shapelib, позволяющие кодировать / декодировать шейп-файлы и связанные файлы dbf непосредственно из программы на Fortran:

http://fortrangis.berlios.de/

Работает с gfortran 4.1.2 или новее (модуль F2003 ISO_C_BINDING).

0 голосов
/ 04 сентября 2009

Вы можете столкнуться с трудностями при чтении двоичных неотформатированных файлов в Fortran, которые не были записаны из оператора записи Fortran, если только у вашего компилятора нет некоторых расширений. Двоичные неформатированные файлы Fortran имеют метки начала и конца записи. Эти метки обычно имеют длину записи в байтах. Поэтому система времени выполнения попытается интерпретировать символы в файле как метки записи и запутается.

Преобразование в csv ascii и чтение этого из Фортрана будет работать. Если вы собираетесь попробовать читать файлы других типов, то написание некоторых функций C для взаимодействия с библиотекой C I / O должно позволить вам читать файлы напрямую.

...