Графика есть - записей нет

MapInfo, MapBasic
Аватара пользователя
ginpetr
Завсегдатай
Сообщения: 374
Зарегистрирован: 21 июн 2011, 12:07
Репутация: 139
Откуда: Орск
Контактная информация:

Re: Графика есть - записей нет

Сообщение ginpetr » 27 мар 2015, 09:47

Проанализировав объяснение Slinger, попробовал сделать то же самое другими средствами.

Количество объектов удалось получить выбором всех объектов в карте рамкой и командой
note selectioninfo(3)

Создал пустую таблицу той же структуры, что и исходная и в окне списка командой "Новая запись" и выбор-копирование довёл количество строк до необходимой величины (441) и сохранил.

Потом заменил исходный (корявый) *.dat полученным.

После этой процедуры получилось скопировать всю графику в другой слой.

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: Графика есть - записей нет

Сообщение Александр Мурый » 27 мар 2015, 13:10

Boris писал(а):
Для "пострадавших" прилагаю программу на VB 6.0, которая расковыривает битый файл Mapinfo.
Опробовал программу на данных, выложенных к первом сообщении этой темы. Выдало такую ошибку:
1.png
1.png (10.42 КБ) 17590 просмотров
Редактор материалов, модератор форума

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: Графика есть - записей нет

Сообщение Boris » 27 мар 2015, 22:52

Александр Мурый писал(а):
Опробовал программу на данных, выложенных к первом сообщении этой темы. Выдало такую ошибку:
1.png
Я не пробовал. Теперь попробую. :?

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: Графика есть - записей нет

Сообщение Boris » 30 мар 2015, 03:22

Ok!
Новая версия программы: Recover 2015 Изображение
Обновление: мелкие изменения, по F1 должен загружаться файл README.TXT, добавлен к восстановлению гео-объект с типом "сложная полилиния о двух и более сегментах".
Именно он, как добавленный Mapinfo, позднее описанного в 2007 году в интернете типа "сложный полигон из двух и более контуров", выдавал упомянутую ошибку. Программа не использует Mapinfo, а "ковыряется" в файлах DAT/MAP/ID самостоятельно, отсюда и ошибки в новых данных, информация об устройстве , которых не доступна. :?
README.txt , поскольку содержит некоторые экспериментальные сведения о файлах MAP/DAT, я выкладывают здесь:
README.7z
(5.98 КБ) 562 скачивания
PS
У файле из начала обсуждения, найдено 492 гео-объекта и 54 записи с атрибутивными данными.
Что бы увидеть восстановленные гео-объекты, необходимо выделить все объекты таблицы и назначить им новый стиль линии. В противном случае Mapinfo (версия 10.5) не отображает 90% объектов на экране и даже не подсвечивает их в случае, если они выбраны. Это связано с тем, что объекты восстановлены, а ссылка на их стиль оформления нет.

Аватара пользователя
ginpetr
Завсегдатай
Сообщения: 374
Зарегистрирован: 21 июн 2011, 12:07
Репутация: 139
Откуда: Орск
Контактная информация:

Re: Графика есть - записей нет

Сообщение ginpetr » 30 мар 2015, 06:49

Recover 2015 работает!
Но откуда взялись ещё объекты? Это удалённые объекты (визуально нашёл только 28 новых объектов)?
Объект проявились в два этапа (два раза назначал стили).

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: Графика есть - записей нет

Сообщение Boris » 30 мар 2015, 12:42

Да, новые объекты, это объекты, которые ранее были удалены в MapInfo. Собственно это "умение" - восстановить случайно удаленные записи и есть основное назначение программы. Восстановление не синхронности между атрибутами и графикой - это побочный эффект перебора записей в MAP и DAT.

Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Re: Графика есть - записей нет

Сообщение Slinger » 31 мар 2015, 00:32

Борис, спасибо за утилиту. Сейчас более менее внятно потестил:

1) Взял исходник, решил, что в id 441 объект. Пробил это в .dat, получил рабочую таблицу, после чего упаковал, исключив все ошибки.

2) Взял исходник, прогнал через recovery, получил 492 объекта. Упаковал таблицу, дабы не морочаться со стилями, которые и так были, но не отображались, потому что опять-таки соответствующие байты были побиты.

3) Обнаружил, что в восстановленной recovery таблице есть дубликаты объекты. Вычистил их, и объектов стало 472. Так же удалил дублирующий объект из моей таблицы. Соответственно объектов стало 440.

Итого - на 32 реально "работающих" объектов больше. Примечательно, что все они в колонке rec_status имеют префикс D. Что это кстати значит, Борис ?

И как программа переопределяет заново файл .id ? С помощью библиотеки Mitab ?
Последний раз редактировалось Slinger 31 мар 2015, 09:57, всего редактировалось 1 раз.

Sibit
Активный участник
Сообщения: 216
Зарегистрирован: 21 окт 2009, 13:29
Репутация: 28
Откуда: Новосибирск

Re: Графика есть - записей нет

Сообщение Sibit » 31 мар 2015, 05:55

А такую таблицу кто-нибудь сможет исправить? Там у 18-и объектов что-то случилось с графикой. Необходимо ее восстановить.
Вложения
bad_table.7z
(541.95 КБ) 476 скачиваний

Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Re: Графика есть - записей нет

Сообщение Slinger » 31 мар 2015, 10:43

Sibit

А если упаковать, то таблица не исправится ? Не очень понятно, где объекты должны быть расположены.

Sibit
Активный участник
Сообщения: 216
Зарегистрирован: 21 окт 2009, 13:29
Репутация: 28
Откуда: Новосибирск

Re: Графика есть - записей нет

Сообщение Sibit » 31 мар 2015, 10:50

Исправится, битые объекты потеряют графику. А хотелось бы их сохранить, если это возможно.

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: Графика есть - записей нет

Сообщение Boris » 31 мар 2015, 15:02

Slinger писал(а):Борис, спасибо за утилиту. Сейчас более менее внятно потестил:

1) Взял исходник, решил, что в id 441 объект. Пробил это в .dat, получил рабочую таблицу, после чего упаковал, исключив все ошибки.

2) Взял исходник, прогнал через recovery, получил 492 объекта. Упаковал таблицу, дабы не морочаться со стилями, которые и так были, но не отображались, потому что опять-таки соответствующие байты были побиты.

3) Обнаружил, что в восстановленной recovery таблице есть дубликаты объекты. Вычистил их, и объектов стало 472. Так же удалил дублирующий объект из моей таблицы. Соответственно объектов стало 440.

Итого - на 32 реально "работающих" объектов больше. Примечательно, что все они в колонке rec_status имеют префикс D. Что это кстати значит, Борис ?

И как программа переопределяет заново файл .id ? С помощью библиотеки Mitab ?
Я точно это не описал в README.TXT ? Если нет, то я поправлю как доберусь до программы, хотелось по быстрее выложить. :wink:
Буква D - означает, что запись была отмечена как удаленная. В DAT (DBF - атрибутика) - это единственное знание, кроме RowID. Для MAP есть следующие значения в 4-х символьном поле:
1-ы символ:
" " - запись не была отмечена удаленной; D - запись была отмечена удаленной.
2-ой - E - запись прочиталась с ошибкой (результат не предсказуем); U - неизвестный тип, запись прочитана нормально, но т.к. не известен размер заголовка этого типа, все записи до конца блока пропущены и не восстановлены.
3-й и 4-й - это внутренний номер типа геоданных. 2-х байтовое целое. Отличается от номера, который возвращает ObjectInfo()/
---
Нет я не использую никакой библиотеки, т.к. я не понял, что она делает. Я в свое время пытался в ней разобраться, но там очень путанные ссылки на абстрактные объекты и т.д. Поэтому я просто взял двоичные описания форматов, какие нашел в сети и воссоздал файлы по ним.
DAT = DBF III - только все данные хранятся в полях строк (ХЗ знаю почему). Но какие бы данные не были записаны в поле, оно помечено в DBF Как символьное. Тут проблем нет - формат много кратно описан, добавить в него строки или поля не представляет труда, равно как и исправить значения. В таблице, с которой начался разбор, файл DAT - битый, по какой то причине он укорочен в 49 или 56 (я уже не помню) записей. Из-за этого все, что далее не распознается MI, как объекты, хотя графическая часть MI - их отображает на экране.

MAP - описан скудно, но основные принципы и структуру, описали к 2007 году, правда в описании не оказалось типа 26, который и давал ошибку в программе версии 2011 года. Формат логичный, но многодельный, в нем даже есть внутренний индекс, который призван ускорить выборку, но этот раздел никто не описал. Хотя видимо он не является проблемой, т.к. FME Universal Translator (или его мини версия UT из утилит Mapinfo) прекрасно умеют создавать такой индекс. Кстати часть знаний была почерпнута из каких-то разделов документации по FME, вернее намеков в ней. Файл блочной структуры. Каждый блок имеет размер &H200 - волшебное число, блоки имеют несколько видов. Для программы главный - блок описания гео-объектов. В нем хранится номер RowID и ссылка на блок с геометрией объекта. Поле RowID - это просто порядковый номер записи в файле DAT, если он больше 0, если меньше - это то же RowID, но умноженный на -1. Исправив это номер получаем восстановленную запись с геометрией. Синхронно надо изменить запись в DAT, где удаление кодируется знаком "*" с начале записи. Так MAP ссылается на DAT - при каждом гео-объекте есть прямая ссылка на строчку с атрибутикой. Обратное неверно, т.к. был использован чужой формат DBF (спасибо, т.к. он описан на 200%), но в DBF не было предусмотрено место для ссылок, т.е. тип такой отсутствовал. Хотя это странно, т.к. по факту везде для ссылок использовано смещение записи от начала файла в виде длинного целого о 4-х байтах, можно было с тем же успехом внести ссылку в поля DBF. Но сделали по другому, видимо для скорости:
Создали файл ID он компактный, и видимо в эпоху ограниченной оперативной памяти, это было критично. Файл ID - это простой список ссылок на описание гео-объекта в файле MAP. 4-байта = смещение описания от начала файла MAP.
Все... Ничего больше. Просто последовательный список ссылок. 4 байта на число без разделителей. Как идут записи в DAT файле, ровно в таком порядке идут и ссылки. Это и позволило вам восстановить файл, просто добавив отсутствующие строки в файл DAT. Видимо, ID содержит ссылки только на неудаленные записи, иначе простое добавление в DAT не дало бы эффекта.
Спасибо создателям формата! Без смеха. Они заложили такую избыточность, что она позволяет воссоздать данные, просто перебирая их в двоичном виде.
Работа программы проста: она читает файл MAP и вычленяет из него блоки описания гео-объектов. Потом перебирает заголовки гео-объектов в этом блоке. Для каждого заголовка обязательно хранится тип и RowId. Дальше идут нюансы конкретного типа гео-объекта. Например, для точки вся информация хранится в заголовке, а для полилинии хранится ссылка на блок описания координат и количество точек в полилинии, если в ней 1 сегмент. За полилинии из 2 и более сегментов отвечает другой тип гео-объектов. Неизвестный тип = неизвестный размер записи, неизвестно где начинается описание СЛЕДУЮЩЕГО объекта, до конца блока вся информация не может быть прочитана. НО этот объект - прочитан и восстановлен! Вернемся к работе: сканируем информацию о гео-объектах. При каждом из них известный RowId (или номер записи, включая отмеченные как удаленные, от начала файла DAT) - вот по этому RowId и создаем запись в новый DAT, со служебной информацией - новый порядковый номер (RowID_new), старый RowId - Который был записан в MAP, его при обработке мы меняем на новый RowID (опять же просто номер по порядку, но уже в переборе MAP), смещение, и статус в исходном файле - удаленный да/нет и т.п. (см. выше).
Параллельно пишем к создаваемому DAT новый ID - адреса геообъектов. Поскольку геообъектов с удаленными может быть больше, чем в исходном файле, ID обычно больше исходного, но в случае когда пришлось пропустить объекты после неизвестного типа, их может быть и меньше. В этом случае спасти битые гео-объекты объекты можно именно так как удалось "руками" - надо добавить к DAT файлу недостающее количество записей и взять старый ID. Естественно, если и он не испорчен.
Восстановить случайно удаленные объекты, а это и было изначальной целью программы Recovery, таким образом не удасться. В случае Recovery - спасение геометрии - это просто бонус, происходящий из структуры файлов. :mrgreen:

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Графика есть - записей нет

Сообщение Denis Rykov » 01 апр 2015, 05:31

Может имеет смысл выложить исходники программы на GitHub?
Spatial is now, more than ever, just another column- The Geometry Column.

Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Re: Графика есть - записей нет

Сообщение Slinger » 01 апр 2015, 13:54

Boris

Спасибо, что столько понаписали ) Хоть и бОльшая часть этого мне известна. Другими словами, программа просто бегает по .map и если находит байт, соответствующий тому, удалена запись или нет, и восстанавливает его. При этом смещения на этот байт пишет в .id.

Хотя с типами (D, E и прочие) не очень понял, но подразберусь сам на досуге.
Но какие бы данные не были записаны в поле, оно помечено в DBF Как символьное
Не знаю насчёт dbf, но в .dat есть соответствующий байт, объявляющий о том, что за тип поля. Символьное, целое, десятичное помечены отдельными байтами.
Видимо, ID содержит ссылки только на неудаленные записи
Не совсем так. Если записи удалена, то:

1) в dat меняется соответствующий байт

2) в map меняется соответствующий байт

3) А в id всё остаётся как было, но 4 байта оффсета просто обнуляются, то бишь будет "00 00 00 00"

aradov
Новоприбывший
Сообщения: 1
Зарегистрирован: 15 ноя 2018, 19:51
Репутация: 0
Откуда: Chisinau

Re: Графика есть - записей нет

Сообщение aradov » 15 ноя 2018, 20:42

Boris, Стала очень востребована программа Recover 2015, но ссылки на нее к сожалению битые, прошу, поделитесь по возможности..

Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Re: Графика есть - записей нет

Сообщение Slinger » 21 янв 2019, 10:35


Ответить

Вернуться в «MapInfo»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей