"Дивацтва" в технічній специфікації Shapefile


32

Я писав бібліотеку розбору форм-файлів і зіткнувся з парами дизайнерських рішень у специфікації, які я не відразу розумію. Я сподіваюся, що тут є старий розробник ESRI, який може мені сказати, чому такі речі є такими, якими вони є.

  1. Основний файл запису (.shp) має змішану небезпеку . Зокрема, частини заголовка містять велике впорядкування байтів, але всі записи є мало ендіанськими. Я, як правило, працюю на більш високому рівні, ніж байти та біти, але все, що я до цього часу читав про ендіантність, відзначає це як незвичне. Чому вказаний файл не має однакової небезпеки?

  2. Поле "Довжина файлу", а також інші поля довжини та позиції записуються 16-бітними словами, замість більш стандартного (з моєї обмеженої точки зору) 8-бітного позиціонування. Як було прийнято це рішення?

Я розмістив подібне запитання на Stack Overflow, але не отримав жодної відповіді. Якщо це здається занадто поза темою для інших людей, я можу підтримати його закриття.


4
Джоел Лоухед на GeospatialPython.com деякий час працював над вирішенням таємниць форм- файлів.
Чад Купер

Не зовсім пов’язані, але акуратні! Я сподіваюся, що це з'ясується.
canisrufus

Відповіді:


28

Розробка форм-файлів паралельно розвивалася ArcView, який був спеціально розроблений для незалежної платформи. (Насправді, це виявилося його падінням: спираючись на інтерфейс, розроблений на платформі незалежному графічному інтерфейсі під назвою "Neuron Data", він не міг скористатися багатьма можливостями Windows. Це в кінцевому підсумку відображало найгірше з усіх його систем ) Хоча специфікація shapefile з самого початку була дивною, вона мала певний сенс у цій проектній структурі: оскільки shapefiles були призначені для багатьох платформ, їх специфікація не повинна надавати перевагу жодній із них, а тому повинна бути однаково небезпечною програмістам усіх переконань.

Здається, друге питання базується на припущенні, яке не відповідає дійсності. Наприклад, поле "Довжина файлу" з'являється при зміщенні байта 24 в головному заголовку і являє собою (підписане) чотирибайтове (32 бітове) ціле число, як воно повинно бути для того, щоб представляти довжину до 2 ^ 31- 1. Йому передує чотирибайтовий «Файловий код» та ще п’ять чотирьохбайтових полів, зарезервованих для подальшого використання: коли ви резервуєте такий простір, звичайно, ви хочете зробити поля максимально можливими, що в той час було 32 біта, щоб зберегти максимально можливу гнучкість. Це також допомагає вирівняти числові поля у файлі за межами слова:


2
:) Саме те, що я шукав. Коли я кажу, що поле "Довжина файлу" "записується 16-бітовими словами", я намагаюся сказати, що значення 32-бітного цілого числа записує довжину файлу в 16-бітні слова. (З специфікації: "Значення довжини файлу - це загальна довжина файлу в 16-бітних словах"). Схоже, він може представляти довжину байтів 2 * 2 ^ 31-1, що виглядає приблизно в 4 ГБ. Те саме стосується значень у файлі .shx. Схоже, він повинен підтримувати довжину файлів до 2 * 2 ^ 31-1 байт. Що я пропускаю?
canisrufus

Хороший момент - я пропустив це. Насправді, дизайн міг би так само легко створити довжину та зсув файлів (покажчики у .shx-файлі) в чотирьохбайтових словах, тим самим збільшивши можливий розмір .shp-файлу до 4 * (2 ^ 31-1) (близько 8 млрд. байт). Я поняття не маю, чому вони обирають двобайтові слова, і навіть чому вони послідовно використовують підписані цілі числа, де неподписані цілі числа є і більш підходящими, і забезпечують вдвічі більше місця для зберігання.
whuber

1
Цікаво, чи 16-розрядна диваність стосується 16-бітових комп'ютерів, які використовувались у той час, де натив intбув 16- бітовим .
Майк Т

Це завжди є можливість, @Mike. Однак навіть 80286 ПК (c. 1984) в основному підтримували 32-бітні вбудовані елементи - вони використовували регістрові пари, щоб робити з ними арифметику.
whuber

5
Колега Есрі каже, що пам’ятає, що суміш ендіанства була навмисною. Щось у руслі "ми змусимо розробників вирішувати це прямо через проблеми з платформою". Але, звичайно, це все апокрифне.
mkennedy

10

Хтось там знає ці відповіді та інше, але вони не розмовляють.

Команда, з якою я працював над розшифровкою недокументованих файлів sbn та sbx, виявила ще багато диваків, які одночасно схожі, але ще й химерніші.

Більшість структур форм-файлів є логічними та дуже ефективними, що дозволяє розробникам ESRI продумати обґрунтовані речі. Це все одно, що у них була купа розумних розробників з одним лунатиком.

Як пропонують інші дописи, дивацтва, ймовірно, є результатом машинних чи мовних вимог, які нам зараз чужі.

Я завжди підозрював, що 16-бітні слова - це простий спосіб заощадити місце. Ви побачите, що вам потрібно зберігати 16-бітні значення слів у пам'яті під час обробки файлів. Стратегія обчислення значень для економії місця поширена у двійкових форматах навіть сьогодні. Але натільна пропозиція Майка також є такою ж ймовірною.

Ендіан-гортання просто дивний. Ніхто не має гарної відповіді, яку я бачив.

Формат dbf був видобутий із формату dbase III, що виник у 1960-х роках. Він широко застосовується з тих пір, і його можна знайти під іншими назвами, включаючи foxpro та xbase.

Незважаючи на недоліки, дивацтва та обмеження формату filefile, він наполегливо зберігається в області та навколо ГІС. Кожна інша спроба його заміни була надто роздута для простого векторного зберігання або надто власна. Навіть ESRI вважав, що форматі файлів будуть іграшкою, яка рухатиме початківців до ArcINFO, покриттів та баз геоданих. Інтернет, мабуть, мав багато спільного з тим, як знімати формат.

Я багато навчився писати pyshp. Написання аналізатора - це фантастичний спосіб засвоїти формат.


Хм. Гарна відповідь. Я не розумію, як використання 16-бітних слів економить місце. Для моїх цілей (побудова ArrayBufferViews в JavaScript), все, що вона робить, змушує мене помножити на два, щоб отримати правильне зміщення: я спалюю зайві цикли без користі. Ви б хотіли детальніше?
canisrufus

1
Так - оскільки вони використовували підписані вставки, то для цих значень верхній кінець буде 32 767, щоб вони могли зберігати більші числа в 2-байтових замість 4. Значення, присвоєні 16-бітовим словам, як я вже сказав, - це значення, які ви в кінцевому підсумку тримаєте в Оперативна пам’ять під час роботи з форм-файлами для операцій читання та запису. Придумати схему економії місця на парних (що я бачив в інших бінарних форматах) - це завжди некрасиво і складно. Тож вони просто приклеїлися до простої схеми значень розміру даних.
GeospatialPython.com

Також - я виявив у файлах shx, які спочатку натрапили на мене. Файли SHX мають обмежувальні поля для функцій, відображених на цілу сітку 256x256. Ця методика є загальною для індексації, але не на сітці, яка мала. Вони зберігають координати у вигляді 1-байтних символів замість ints. Ось чому сітка лише 256х256. Тепер це вже спокійно запам’ятовується пам’яттю навіть для 1990-х! Звичайно, існує багато інших ефективностей, таких як мається на увазі групування деталей за допомогою індексу. Ви маєте рацію - ці методи накладають більше тягаря на програміста. Тому використання пам'яті повинно було бути пріоритетним.
GeospatialPython.com

1
Так, я прочитав ваше написання. Ти добре робиш лорда на цьому;) Я з нетерпінням чекаю твого остаточного аналізу. Щодо 16-бітної проблеми, я не впевнений, що ваша думка дотримана. 1. У файлах SHP і SHX немає 16-бітових полів, якщо я просто не помиляюся. 2. Представлення 16-бітних значень замість 8-бітових значень лише вдвічі збільшує описану довжину (2 * 2 ^ 15), яку вони могли досягти, просто використовуючи непідписаний int (2 ^ 16). Це в остаточному підсумку не економить місця.
canisrufus

Коли ви посилаєтесь на "використання пам'яті", важко сказати, ви маєте на увазі оперативну пам'ять чи диск. На початку 90-х накопичувач об'ємом 2 ГБ та оперативна пам’ять 16-32 Мб були досить високим рівнем: економія деякого файлового простору (або пропускної здатності мережі) все ще матиме важливе значення. Відповідальний інженер програмного забезпечення хотів би ретельно продумати наслідки для своїх майбутніх клієнтів компромісів у часі та просторі на їх вибір заздалегідь я б приніс їм сумніви, якщо вибір, очевидно, невдало неефективний.
whuber

5

Це мій погляд на це.

Формат Shapefile, швидше за все, розвинувся з ARC / INFO, яка мала історію, що починається з його джерел FORTRAN / PR1ME. Усі формати ARC / INFO мали цей 100-байтний заголовок та велику витривалість коду файлу та довжину файлу (наприклад, Покриття, TIN).

Коли Shapefiles були зроблені для ArcView 1, ESRI був зосереджений на прориві на ринок Microsoft Windows, а решта формату Shapefile сильно орієнтована на те, що це мало ендіатистів ПК.

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


Це звучить правдоподібно. Дякую за розуміння!
whuber

Це моя улюблена здогадка про витривалість. Тепер нам потрібно лише Dangermond опублікувати "ESRI Tell All, Technical Edition", щоб побачити, чи ти маєш рацію!
canisrufus

2
Якщо формат файлу форм еволюціонував із форматів ARC / INFO, він був значно раніше, ніж v7. У 1994 році, коли я почав працювати в ESRI, AV2 вже вийшов, і робота над розробкою ARC / INFO 7 велася.
mkennedy

Добрий момент, Меліта. Суть цієї відповіді - те, що деякі варіанти формату можуть в кінцевому рахунку мати фортранське походження - все ще буде правдою до початкових додатків Arc і Info.
whuber

Дякую @mkennedy, я видалив посилання на v7. Я все ще пам’ятаю дні, коли в оригінальних посібниках користувача ARC / INFO (ера v3 .. v6) були заголовки, які, на мою думку, взяті з коду FORTRAN.
Стівен Куан

4

Я завжди вважав, що ендіанський розкол був викликаний тим, що дві команди були одна на робочих станціях Sun, а друга на ПК, і вони не збиралися до кінця процесу розробки.

Я хотів би дізнатися, що насправді сталося.


3
Я думаю, що ESRI був трохи скоординованішим від цього. Дійсно, якщо що, їх програмне забезпечення має тенденцію виглядати так, що в його розробці було занадто багато участі комітетів.
whuber

0

Я думаю, що десь там я почув щось про походження dbf / foxpro.
Це міг бути просто дивний сон, який я мав, хоча.


5
Частини .shp та .shx, про які йдеться тут, були розроблені повністю незалежно від формату .dbf, який існував майже 20 років раніше.
whuber

0

Ви повинні розуміти, що файли форм були введені десь 20 років тому, в той час існувало безліч непослідовних і погано розроблених форматів файлів, тому формні файли не є винятком. Я сам написав аналізатор shapefile, і я повинен сказати, що у мене було набагато більше проблем з розбором формату DBF порівняно з самими shapefiles (.SHP).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.