2015-12-01 6 views
2

Так что я сейчас пытаюсь получить некоторые данные карты, предоставляемые сторонним провайдером. Они ничего нам не дали, кроме дампа данных, поэтому нет документации или контактной точки, чтобы увидеть, что они использовали ранее.Parsing ESRI Shapefiles в Ruby

У меня есть 4 файла:

30083_parcel.dbf

30083_parcel.prj

30083_parcel.shp

30083_parcel.shx

Теперь, не вдаваясь в ненужные детали, я уже удалось извлечь, и получить работу данные от dbfprj и shp файлов. Однако у меня много проблем с shx.

на запись Википедии о спецификации для SHX файлов:

The index contains the same 100-byte header as the .shp file, followed by any number of 8-byte fixed-length records which consist of the following two fields: 

Bytes Type Endianness Usage 
0–3 int32 big Record offset (in 16-bit words) 
4–7 int32 big Record length (in 16-bit words) 

Итак, я пытался что-то вдоль этих линий:

File.open('test.txt') do|file| 
    until file.eof? 
    buffer = file.read(100) 
    # Do something with buffer 
    puts buffer 
    end 
end 

И все, что я получаю некоторые сумасшедшие персонажи, как H, и P. Я не уверен, куда идти, чтобы получить что-нибудь более полезное для получения смещения записи и длины записи.

Любые идеи? Я подумал, используя file.read(100), что получаю заголовки и, по крайней мере, могу их видеть, но это не так. И после попытки получить доступ к остальным после первых 100 байт, я получаю аналогичный случайный юникод.

В то время, когда я был бы открыт для нерубинных решений.

+0

Нескольких идей для ресурсов: [ESRI Whitepaper о шейпфайлах] (https://www.esri.com/library/whitepapers/pdfs/shapefile .pdf), сообщение в блоге о [shapefiles in ruby] (http://www.andresblog.net/ruby-on-rails/opening-a-shapefile-using-ruby-on-rails/) и [некоторый код на github, который может помочь] (https://github.com/nofxx/georuby/) – Erica

ответ

0

Файл shp - это геометрия, находится в двоичном формате и включает в себя ошибку endian и little endian integer и floats.

Файл shx является необязательным индексным файлом и, как таковой, очень прост и в основном большой эндиан.

Это то, что шейп-файл был прочитан инструментом, библиотекой или существующей программой, но shx не используется? Ваше решение не должно его использовать, или указать другой инструмент на его существование.

Это оптимизация для чтения записей из файла shp, поэтому она не нужна или может быть воссоздана путем синтаксического анализа шейп-файла.

Но если вам это нужно, тогда откройте файл в binary mode и закройте 2 байта значениями большого конца до смещения и длины.

Сумасшедшие символы от чтения, или отображать его как ASCII, как картина говорит тысячу слов:

Hex Edit view of shp and shx file

Посмотрите на строку 96 (decimal), выделить слева синим цветом это shp Запись 0x000001 и это длина (1 = 2 байта) является 0x0002c8, а левый является shx индекса, смещение для записи 1 составляет 0x32, который 50 2 байт пара, таким образом, 100 байт в файл и длину записи, снова, 0x2c8, или 0x590 байтов.

Сумасшедшие символы являются ASCII представление этих и не имеет смысла, это узкая колонка справа шестигранными цифр, в основном . «s

Обратите внимание на запись информация является большой обратный порядок байт, поэтому файл 2 байты 0x 00 00 27 0A соответствует спецификации FILE CODE, которая указана как 9994 (decimal).

Значения в пределах shp записываются сами, а ограничивающая рамка в заголовке (первые 100 байт) мало ориентирована.

[редактировал как я начальной был мои маленькие и большие байты местами вокруг]

 Смежные вопросы

  • Нет связанных вопросов^_^